Какие символы мне нужно экранировать в документах XML?
Какие символы должны быть экранированы в документах XML, или где я могу найти такой список?
10 ответов
Если вы используете соответствующий класс или библиотеку, они помогут вам. Многие проблемы XML вызваны конкатенацией строк.
Escape-символы XML
Всего пять:
" "
' '
< <
> >
& &
Экранирование символов зависит от того, где используется специальный символ.
Примеры могут быть проверены в W3C Markup Validation Service.
Текст
Безопасный способ - экранировать все пять символов в тексте, однако три символа "
, '
а также >
не нужно экранировать в тексте:
<?xml version="1.0"?>
<valid>"'></valid>
Атрибуты
Безопасным способом является экранирование всех пяти символов в атрибутах, однако >
символ не должен быть экранирован в атрибутах:
<?xml version="1.0"?>
<valid attribute=">"/>
'
символ не должен быть экранирован в атрибутах, если кавычки "
:
<?xml version="1.0"?>
<valid attribute="'"/>
Аналогично "
не нужно экранировать в атрибутах, если кавычки '
:
<?xml version="1.0"?>
<valid attribute='"'/>
Комментарии
Все 5 специальных символов не должны быть экранированы в комментариях:
<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>
CDATA
Все 5 специальных символов не должны быть экранированы в разделах CDATA:
<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>
Инструкции по обработке
Все 5 специальных символов не должны быть экранированы в инструкциях обработки XML:
<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>
XML против HTML
HTML имеет свой собственный набор escape-кодов, который охватывает гораздо больше символов.
Новый, упрощенный ответ на старый, часто задаваемый вопрос...
Упрощенный XML Escape
Всегда (90% важно помнить)
- Побег
<
как<
если<
начинает<tag/>
, - Побег
&
как&
если&
начинает&entity;
,
- Побег
Значения атрибутов (9% важно помнить)
attr="
'
Одинарные кавычки'
в двойных кавычках."
attr='
"
Двойные кавычки"
в пределах одинарных кавычек.'
- Побег
"
как"
а также'
как'
иначе.
Комментарии, CDATA и инструкции по обработке (0,9% важно запомнить)
<!--
В комментариях-->
ничего не должно быть спасено, но нет--
Строки разрешены.<![CDATA[
В рамках CDATA]]>
ничего не должно быть спасено, но нет]]>
Строки разрешены.<?PITarget
Внутри ИП?>
ничего не должно быть спасено, но нет?>
Строки разрешены.
Эзотерика (0,1% важно запомнить)
- Побег
]]>
как]]>
если]]>
заканчивается раздел CDATA.
(Это правило применяется к символьным данным в целом - даже вне раздела CDATA.)
- Побег
Возможно, это поможет:
Список ссылок на сущности символов XML и HTML:
В документах SGML, HTML и XML логические конструкции, известные как символьные данные и значения атрибутов, состоят из последовательностей символов, в которых каждый символ может проявляться непосредственно (представлять себя) или может быть представлен серией символов, называемых символьной ссылкой, из которых есть два типа: числовая ссылка на символ и ссылка на символьную сущность. В этой статье перечислены ссылки на сущности символов, действительные в документах HTML и XML.
В этой статье перечислены следующие пять предопределенных сущностей XML:
quot "
amp &
apos '
lt <
gt >
В соответствии со спецификациями Консорциума World Wide Web (w3C), существует 5 символов, которые не должны появляться в их буквальном виде в документе XML, за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA., Во всех остальных случаях эти символы должны быть заменены с использованием соответствующей сущности или числовой ссылки в соответствии со следующей таблицей:
Заменаоригинального персонажа вXML
<& lt;& # 60;
>& gt;& # 62;
"& quot;& # 34;
&& amp;& # 38;
'& apos;& # 39;
Обратите внимание, что вышеупомянутые объекты могут быть использованы также в HTML, за исключением & apos;, который был представлен в XHTML 1.0 и не объявлен в HTML 4. По этой причине и для обеспечения ретро-совместимости спецификация XHTML рекомендует использовать & # 39; вместо.
Экранирование символов отличается для тегов и атрибутов.
Для тегов:
< <
> > (only for compatibility, read below)
& &
Для атрибутов:
" "
' '
http://www.w3.org/TR/2008/REC-xml-20081126/
Символ амперсанда (&) и левая угловая скобка (<) не должны появляться в их буквальной форме, за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. Если они нужны где-то еще, их необходимо экранировать, используя либо числовые ссылки на символы, либо строки "& amp;" и "& lt;" соответственно. Правая угловая скобка (>) может быть представлена с помощью строки "& gt;" и для совместимости должна быть экранирована с помощью "& gt;" или ссылки на символ, когда она появляется в строке " ]]> " в содержимом, когда эта строка не отмечает конец раздела CDATA.
Чтобы значения атрибута могли содержать как одинарные, так и двойные кавычки, символ апострофа или одинарной кавычки (') может быть представлен как "& apos;", а символ двойной кавычки (") как" & quot; ".
В дополнение к общеизвестным пяти символам [<,>, &, ", '] я бы также экранировал символ вертикальной табуляции (0x0B). Это допустимый UTF-8, но не допустимый XML 1.0, и даже многие библиотеки (включая libxml2) пропустить его и молча вывести неверный XML.
Сокращенный от: http://en.wikipedia.org/wiki/XML
Есть пять предопределенных объектов:
< represents "<"
> represents ">"
& represents "&"
' represents '
" represents "
"Все разрешенные символы Юникода могут быть представлены с помощью цифровой символьной ссылки. " Например:
中
Большинство управляющих символов и другие диапазоны Юникода специально исключены, а это означает (я думаю), что они не могут быть ни экранированными, ни прямыми:
Принятый ответ неверен. Лучше всего использовать библиотеку для экранирования xml.
Как упоминалось в этом другом вопросе
«В основном, управляющие символы и символы вне диапазонов Unicode не допускаются. Это также означает, что вызов, например, символьной сущности запрещен».
Если вы избежите только пяти символов. У вас могут быть проблемы, например, был обнаружен недопустимый символ XML (Unicode: 0xc)
Это зависит от контекста. Для содержимого это <и &, и]]>(хотя строка 3 вместо одного символа). Для значений атрибутов это <и & и "и '. Для CDATA это]]>.
Только <и & должны быть экранированы, если должны обрабатываться символьные данные, а не разметка: