В документах SGML, HTML и XML логические конструкции, известные как символьные данные и значения атрибутов, состоят из последовательностей символов, в которых каждый символ может проявляться непосредственно (представлять себя) или может быть представлен серией символов, называемых символьной ссылкой, из которых есть два типа: числовая ссылка на символ и ссылка на символьную сущность. В этой статье перечислены ссылки на сущности символов, действительные в документах HTML и XML.
В этой статье перечислены следующие пять предопределенных сущностей XML:
В соответствии со спецификациями Консорциума World Wide Web (w3C), существует 5 символов, которые не должны появляться в их буквальном виде в документе XML , за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции по обработке или раздела CDATA. , Во всех остальных случаях эти символы должны быть заменены с использованием соответствующей сущности или числовой ссылки в соответствии со следующей таблицей:
Обратите внимание, что вышеупомянутые объекты могут использоваться также в HTML, за исключением & apos; , который был представлен в XHTML 1.0 и не объявлен в HTML 4. По этой причине и для обеспечения ретро-совместимости спецификация XHTML рекомендует использовать & # 39; вместо.
XML предопределяет эти пять сущностей, но абсолютно НЕ указывает, что вы не можете использовать ни один из этих пяти символов в их буквальной форме. <и & должны быть экранированы везде (кроме CDATA). «и» необходимо экранировать только в значениях атрибутов, и только в том случае, если соответствующий символ кавычки одинаков. И> на самом деле экранировать не нужно.
Shaun McCance
3
Как написано выше, <> "& 'не нужно экранировать при использовании в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. То есть, когда вы используете <> в качестве тега XML, вы не избегаете его То же самое относится и к комментарию (вы не указали бы & в закомментированной строке XML-файла? Вам не нужно, и ваш XML все еще действителен, если вы этого не сделаете). Это четко указано в официальных рекомендациях для XML по W3C .
Albz
7
@ShaunMcCance >должен быть экранирован, если он следует ]]внутри содержимого, если только он не является частью ]]>разделителя, обозначающего конец раздела CDATA.
Ли Д
2
Не быть некромантом, но @Albz неверно утверждать, что эти символы ДОЛЖНЫ иметь право на содержание. Смотрите раздел 2.4 на w3.org/TR/REC-xml/#NT-CharData . Это версия TL; DR в содержании элемента chardata & amp; и & lt; должны быть всегда наделены правом. & Gt; символ МОЖЕТ быть разрешен, хотя он ДОЛЖЕН быть при появлении в буквальной строке «]]>», так как в противном случае это будет считываться как конец раздела CDATA. Для одинарных и двойных кавычек вы можете убежать, если хотите. Вот и все, для чардата внутри элементов. Другие компоненты XML имеют другие правила.
Скай --- капитан
52
Экранирование символов отличается для тегов и атрибутов.
Для тегов:
< <
> > (only for compatibility, read below)
& &
Символ амперсанда (&) и левая угловая скобка (<) не должны появляться в их буквальной форме, за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. Если они нужны где-то еще, их необходимо экранировать, используя либо числовые ссылки на символы, либо строки "& amp;" и "& lt;" соответственно. Правая угловая скобка (>) может быть представлена с помощью строки "& gt;" и для совместимости должна быть экранирована с помощью "& gt;" или ссылки на символ, когда она появляется в строке "]]>" в содержимом, когда эта строка не обозначает конец раздела CDATA.
Чтобы значения атрибутов могли содержать как одинарные, так и двойные кавычки, символ апострофа или одинарной кавычки (') может быть представлен как "& apos;", а символ двойной кавычки (") -" & quot; ».
Стоит отметить еще одно правило: его ]]>необходимо экранировать ]]>, даже если он не находится в разделе CDATA. Самый простой способ достижения , которые могут быть всегда бежать , >как >.
Майкл Кей,
Спасибо, @MichaelKay. Я включил вашу полезную заметку о, ]]> но решил отнести ее к эзотерике, а не предлагать >всегда избегать (чего, как вы знаете, не должно быть). Моя цель - сделать так, чтобы XML-экранирующие правила легко запоминались и были на 100% точными .
kjhughes
Приведенные выше ответы, включая одно упоминание, все пять символов следует экранировать внутри атрибутов. Есть ли у вас какая-либо ссылка на стандарт XML для подтверждения того, что вы говорите, поскольку ваш ответ логически кажется правильным?
Роман Суси
1
@RomanSusi: Да, многие другие ответы содержат ошибки или чрезмерные обобщения («безопасный путь ...»), основанные на слухах, неправильном толковании или неправильном понимании официального XML BNF. Мой ответ (а) оправдан на 100% Рекомендацией W3C XML; см. множество связанных ссылок на официальный BNF и (b) организованных в краткой, логичной и легко запоминающейся последовательности этих требований.
kjhughes
@RomanSusi: конкретное утверждение о том, что «все пять символов должны быть экранированы внутри атрибутов», является неаккуратным руководством, не поддерживаемым официальным правилом BNF, которое AttValueцитируется в моем ответе по ссылке на 2. Значения атрибутов .
kjhughes
25
В дополнение к общеизвестным пяти символам [<,>, &, "и '] я бы также экранировал символ вертикальной табуляции (0x0B). Это допустимый UTF-8, но не действительный XML 1.0 и даже многие библиотеки (включая очень переносимую (ANSI C) библиотеку libxml2 ) пропускает ее и молча выводит неверный XML.
«Все разрешенные символы Юникода могут быть представлены с помощью цифровой символьной ссылки». Например:
中
Большинство управляющих символов и другие диапазоны Юникода специально исключены, а это означает (я думаю), что они не могут быть ни экранированными, ни прямыми:
<company>AT&T</company>
Ответы:
Если вы используете соответствующий класс или библиотеку, они помогут вам. Многие проблемы XML вызваны конкатенацией строк.
Escape-символы XML
Всего пять:
Экранирование символов зависит от того, где используется специальный символ.
Примеры могут быть проверены в Службе проверки разметки W3C .
Текст
Безопасный способ - экранировать все пять символов в тексте. Тем не менее, три символа
"
,'
и>
не должны быть экранированы в тексте:Атрибуты
Безопасный способ - экранировать все пять символов в атрибутах. Однако
>
персонажу не обязательно экранироваться в атрибутах:Символ
'
не должен быть экранирован в атрибутах, если кавычки"
:Аналогично,
"
нет необходимости экранироваться в атрибутах, если кавычки'
:Комментарии
Все пять специальных символов не должны быть экранированы в комментариях:
CDATA
Все пять специальных символов не должны быть экранированы в разделах CDATA :
Инструкции по обработке
Все пять специальных символов не должны быть экранированы в инструкциях обработки XML:
XML против HTML
HTML имеет свой собственный набор escape-кодов, который охватывает гораздо больше символов.
источник
"
будут изменены на&quot;
Возможно, это поможет:
Список ссылок на сущности символов XML и HTML :
В этой статье перечислены следующие пять предопределенных сущностей XML:
источник
В соответствии со спецификациями Консорциума World Wide Web (w3C), существует 5 символов, которые не должны появляться в их буквальном виде в документе XML , за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции по обработке или раздела CDATA. , Во всех остальных случаях эти символы должны быть заменены с использованием соответствующей сущности или числовой ссылки в соответствии со следующей таблицей:
Original CharacterXML entity replacementXML numeric replacement
< < <
> > >
" " "
& & &
' ' '
Обратите внимание, что вышеупомянутые объекты могут использоваться также в HTML, за исключением & apos; , который был представлен в XHTML 1.0 и не объявлен в HTML 4. По этой причине и для обеспечения ретро-совместимости спецификация XHTML рекомендует использовать & # 39; вместо.
источник
>
должен быть экранирован, если он следует]]
внутри содержимого, если только он не является частью]]>
разделителя, обозначающего конец раздела CDATA.Экранирование символов отличается для тегов и атрибутов.
Для тегов:
Для атрибутов:
Из символьных данных и разметки :
источник
Новый, упрощенный ответ на старый, часто задаваемый вопрос ...
Упрощенный XML Escapeing (с приоритетом, завершен на 100%)
Всегда (90% важно помнить)
<
как<
только<
начинает<tag/>
.&
как&
только&
начинается&entity;
.Значения атрибутов (9% важно помнить)
attr="
'
Одиночные кавычки'
в порядке в двойных кавычках."
attr='
"
Двойные кавычки"
в пределах одинарных кавычек.'
"
как"
и'
как'
иначе.Комментарии , CDATA и инструкции по обработке (0,9% важно запомнить)
<!--
В комментариях-->
ничего не нужно избегать, но нет--
строки не допускаются.<![CDATA[
Внутри CDATA]]>
ничего не нужно избегать, но нет]]>
строки не допускаются.<?PITarget
Внутри PI?>
ничего нельзя экранировать, но?>
строки не допускаются.Эзотерика (0,1% важно запомнить)
]]>
как]]>
если]]>
не заканчивается раздел CDATA.(Это правило применяется к символьным данным в целом - даже вне раздела CDATA.)
источник
]]>
необходимо экранировать]]>
, даже если он не находится в разделе CDATA. Самый простой способ достижения , которые могут быть всегда бежать ,>
как>
.]]>
но решил отнести ее к эзотерике, а не предлагать>
всегда избегать (чего, как вы знаете, не должно быть). Моя цель - сделать так, чтобы XML-экранирующие правила легко запоминались и были на 100% точными .AttValue
цитируется в моем ответе по ссылке на 2. Значения атрибутов .В дополнение к общеизвестным пяти символам [<,>, &, "и '] я бы также экранировал символ вертикальной табуляции (0x0B). Это допустимый UTF-8, но не действительный XML 1.0 и даже многие библиотеки (включая очень переносимую (ANSI C) библиотеку libxml2 ) пропускает ее и молча выводит неверный XML.
источник
Сокращенный от: XML, Escape
Есть пять предопределенных объектов:
«Все разрешенные символы Юникода могут быть представлены с помощью цифровой символьной ссылки». Например:
Большинство управляющих символов и другие диапазоны Юникода специально исключены, а это означает (я думаю), что они не могут быть ни экранированными, ни прямыми:
Допустимые символы в XML
источник
Это зависит от контекста. Для содержания это < и & , и ]]> (хотя строка из трех вместо одного символа).
Для значений атрибутов это < , & , " и ' .
Для CDATA это ]]> .
источник
Только
<
и&
должны быть экранированы, если они должны обрабатываться символьными данными, а не разметкой:2.4 Символьные данные и разметка
источник