Какие символы нужно экранировать в XML-документах, и где можно найти полный список этих специальных символов?
XML требует экранирования пяти специальных символов в большинстве контекстов: <, >, &, ", и ', которые имеют соответствующие ссылочные сущности <, >, &, ", и '. Символ амперсанда (&) и меньше (<) должны всегда экранироваться, за исключением случаев, когда они используются в качестве разделителей разметки или внутри специальных разделов, таких как блоки CDATA. Для полного списка всех XML-сущностей символов и их числовых ссылок можно обратиться к comprehensive странице Википедии об XML и HTML-сущностях символов или к официальным спецификациям W3C XML.
Содержание
- Пять основных XML-символов для экранирования
- Правила экранирования в зависимости от контекста
- Полные ссылочные сущности символов
- Числовые ссылки на символы
- Лучшие практики для экранирования XML
- Инструменты и ресурсы
Пять основных XML-символов для экранирования
XML определяет пять фундаментальных символов, которые должны экранироваться при появлении в текстовом содержимом или значениях атрибутов, поскольку эти символы имеют специальное значение в XML-разметке:
-
Амперсанд (
&) - должен экранироваться как&- Этот символ начинает ссылочные сущности и ссылки на символы
- Согласно спецификации XML, символ амперсанда должен всегда экранироваться, когда он не начинает допустимую ссылочную сущность
-
Меньше (
<) - должен экранироваться как<- Этот символ начинает теги элементов и другую разметку
- Спецификация W3C XML четко указывает, что символ меньше зарезервирован для разметки
-
Больше (
>) - должен экранироваться как>- Хотя это и не строго обязательно, экранирование этого символа является хорошей практикой для единообразия
- Символ больше завершает начальные и конечные теги
-
Двойная кавычка (
") - должна экранироваться как"в двойных кавычках атрибутов- Требуется, когда значение атрибута ограничено двойными кавычками
- Это предотвращает интерпретацию парсером кавычки как конца значения атрибута
-
Одинарная кавычка/Апостроф (
') - должна экранироваться как'в одинарных кавычках атрибутов- Требуется, когда значение атрибута ограничено одинарными кавычками
- Эта ссылочная сущность была введена в XHTML 1.0
Важное примечание: Эти пять символов - единственные, которые всегда должны экранироваться в XML-содержимом. Другие символы могут быть представлены непосредственно или через числовые ссылки на символы при необходимости.
Правила экранирования в зависимости от контекста
Требования к экранированию XML-символов различаются в зависимости от их места в структуре документа:
В содержимом элемента
&и<должны всегда экранироваться>,"и'могут появляться буквально, но должны экранироваться для единообразия- Пример:
3 < 5 & 7вместо3 < 5 & 7
В значениях атрибутов
&должен всегда экранироваться<должен всегда экранироваться (теги элементов не допускаются в атрибутах)"должен экранироваться, если атрибут ограничен двойными кавычками'должен экранироваться, если атрибут ограничен одинарными кавычками>может появляться буквально, но должен экранироваться для единообразия
Специальные контексты, где экранирование не требуется
Комментарии (<!-- комментарий -->):
- Все пять специальных символов могут появляться без экранирования
- Пример:
<!-- Это комментарий с < & > " ' -->
Инструкции обработки (<?target data?>):
- Пять специальных символов могут появляться без экранирования
- Исключение: имя инструкции не может быть “xml” (зарезервировано для спецификации XML)
- Пример:
<?xml-stylesheet type="text/css" href="style.css"?>
Секции CDATA (<![CDATA[...]]>):
- Экранирование не требуется внутри секций CDATA
- Единственное ограничение - последовательность
]]>не может появляться - Пример:
<![CDATA[3 < 5 & 7 " ' содержимое]]>
Полные ссылочные сущности символов
Для комплексного экранирования XML-символов можно использовать как именованные ссылочные сущности, так и числовые ссылки на символы.
Именованные ссылочные сущности
Спецификация XML определяет пять предопределенных именованных сущностей:
| Символ | Ссылочная сущность | Описание |
|---|---|---|
< |
< |
Знак меньше |
> |
> |
Знак больше |
& |
& |
Амперсанд |
" |
" |
Двойная кавычка |
' |
' |
Одинарная кавычка/апостроф |
Расширенные именованные сущности
Помимо пяти предопределенных сущностей, XML поддерживает множество дополнительных именованных сущностей. Наиболее полный список доступен на странице Википедии “Список XML и HTML-сущностей символов”, который включает:
- Математические символы:
½,×,÷ - Символы валют:
€,£,¥ - Знаки препинания:
–,—,… - Специальные символы:
©,®,™
Числовые ссылки на символы
Когда именованные сущности недоступны, можно использовать числовые ссылки на символы для представления любого символа Unicode:
Десятичный формат
Формат: &#nnnn;, где nnnn - это десятичный кодовый точка Unicode
Шестнадцатеричный формат
Формат: &#xhhhh;, где hhhh - это шестнадцатеричный кодовый точка Unicode
Распространенные примеры:
| Символ | Десятичная ссылка | Шестнадцатеричная ссылка |
|---|---|---|
& |
& |
& |
< |
< |
< |
> |
> |
> |
" |
" |
" |
' |
' |
' |
Полная ссылка Unicode: Для поиска числового кода любого символа можно использовать ресурсы вроде Unicode Charts или онлайн-инструменты, такие как Unicode Lookup.
Лучшие практики для экранирования XML
Реализации в языках программирования
JavaScript:
// Использование регулярных выражений
function escapeXml(str) {
return str.replace(/[&<>"']/g, function(char) {
return {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}[char];
});
}
// Использование DOM API
function escapeXmlWithDOM(str) {
const div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
}
Java:
// Использование Apache Commons Lang
import org.apache.commons.text.StringEscapeUtils;
String escaped = StringEscapeUtils.escapeXml11("3 < 5 & 7 \" '");
// Использование javax.xml.bind
import javax.xml.bind.DatatypeConverter;
String escaped = DatatypeConverter.printString("3 < 5 & 7 \" '");
Python:
# Использование xml.sax.saxutils
from xml.sax.saxutils import escape
escaped = escape("3 < 5 & 7")
# Для полного экранирования включая кавычки
from xml.sax.saxutils import escape, quoteattr
fully_escaped = quoteattr("3 < 5 & 7 \" '")
Вопросы безопасности
- Всегда экранируйте пользовательский контент: Никогда не доверяйте вводу от пользователей - всегда экранируйте его перед включением в XML
- Экранируйте в правильном контексте: Понимаете, экранируете ли вы для значений атрибутов или содержимого элемента
- Проверяйте после экранирования: Убедитесь, что ваш экранированный XML все еще допустим и хорошо сформирован
- Будьте осторожны с двойным экранированием: Некоторые фреймворки могут экранировать контент дважды - проверьте это
Вопросы производительности
- Предварительно компилируйте шаблоны экранирования: Для повторяющихся операций экранирования предварительно компилируйте регулярные выражения
- Используйте встроенные функции: Предпочитайте функции экранирования XML, специфичные для языка, когда они доступны
- Рассмотрите использование CDATA для больших блоков: Для больших объемов текста, которые могут содержать много специальных символов, используйте секции CDATA вместо индивидуального экранирования
Инструменты и ресурсы
Онлайн-инструменты
-
FreeFormatter XML Escape Tool: https://www.freeformatter.com/xml-escape.html
- Бесплатный онлайн-инструмент для экранирования или снятия экранирования XML-документов
- Обрабатывает как именованные, так и числовые ссылки на символы
-
LambdaTest XML Escape: https://www.lambdatest.com/free-online-tools/xml-escape
- Преобразует обычное XML-содержимое в экранированный HTML
- Показывает как оригинальную, так и экранированную версии
-
JSONFormatter XML Escape: https://jsonformatter.org/xml-escape
- Онлайн-инструмент для экранирования амперсанда, кавычки и всех специальных символов
Авторитетные спецификации
-
W3C XML 1.0 Specification: https://www.w3.org/TR/xml/
- Определенный источник стандартов и требований XML
-
W3C Character Escapes in Markup: https://www.w3.org/International/questions/qa-escapes
- Официальные рекомендации по использованию экранирования символов в разметке и CSS
-
XML Entity Definitions for Characters: https://www.w3.org/2003/entities/2007doc/
- Официальные определения сущностей и сопоставления символов
Полные списки ссылок на символы
-
Wikipedia: List of XML and HTML character entity references: https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
- Наиболее полный список именованных символьных сущностей
- Включает как XML, так и HTML-сущности с сопоставлениями Unicode
-
Microsoft: XML Character Entities and XAML: https://learn.microsoft.com/en-us/dotnet/desktop/xaml-services/xml-character-entities
- Документация Microsoft по XML-сущностям символов
- Включает практические примеры и рекомендации по использованию
-
W3Resource: XML Reserved Markup Characters: https://www.w3resource.com/xml/reserved-markup-characters.php
- Подробная таблица ссылок на символы и их использования
- Включает примеры и лучшие практики
Источники
- What characters do I need to escape in XML documents? - Stack Overflow
- XML Reserved Markup Characters - w3resource
- Escaping XML Data - Liquid Technologies
- How to Escape Characters in XML ? - GeeksforGeeks
- What Characters Need to be Escaped in XML Documents? - Novixys Software Dev Blog
- Free Online XML Escape / Unescape Tool - FreeFormatter.com
- List of XML and HTML character entity references - Wikipedia
- Using character escapes in markup and CSS - W3C
- XML Character Entities and XAML - Microsoft Learn
- XML escaped characters - Advanced Installer
Заключение
Экранирование XML необходимо для поддержания допустимости документа и предотвращения ошибок парсинга. Пять основных символов, которые должны экранироваться, - это &, <, >, ", и ', с соответствующими ссылочными сущностями &, <, >, ", и '. Помните, что требования к экранированию различаются в зависимости от контекста - эти символы не нужно экранировать в комментариях, инструкциях обработки или секциях CDATA.
Для комплексных потребностей в экранировании символов используйте полные списки ссылочных сущностей, доступные на Википедии и в официальных спецификациях W3C. При работе с языками программирования предпочитайте встроенные функции экранирования и всегда экранируйте пользовательский контент для предотвращения проблем безопасности. Следуя этим практикам и используя доступные ресурсы, вы можете гарантировать, что ваши XML-документы остаются хорошо сформированными и совместимыми между разными системами и платформами.