Какие символы мне нужно экранировать в документах XML?

925

Какие символы должны быть экранированы в документах XML, или где я могу найти такой список?

Юлий А
источник
7
Пример:<company>AT&amp;T</company>
Jacktrades
См. Упрощенный XML Escapeing ниже для краткого и легко запоминающегося руководства, которое я извлек из первоисточников ( W3C Extensible Markup Language (XML) 1.0 (пятое издание) ).
khhughes

Ответы:

1356

Если вы используете соответствующий класс или библиотеку, они помогут вам. Многие проблемы XML вызваны конкатенацией строк.

Escape-символы XML

Всего пять:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

Экранирование символов зависит от того, где используется специальный символ.

Примеры могут быть проверены в Службе проверки разметки W3C .

Текст

Безопасный способ - экранировать все пять символов в тексте. Тем не менее, три символа ", 'и >не должны быть экранированы в тексте:

<?xml version="1.0"?>
<valid>"'></valid>

Атрибуты

Безопасный способ - экранировать все пять символов в атрибутах. Однако >персонажу не обязательно экранироваться в атрибутах:

<?xml version="1.0"?>
<valid attribute=">"/>

Символ 'не должен быть экранирован в атрибутах, если кавычки ":

<?xml version="1.0"?>
<valid attribute="'"/>

Аналогично, "нет необходимости экранироваться в атрибутах, если кавычки ':

<?xml version="1.0"?>
<valid attribute='"'/>

Комментарии

Все пять специальных символов не должны быть экранированы в комментариях:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Все пять специальных символов не должны быть экранированы в разделах CDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Инструкции по обработке

Все пять специальных символов не должны быть экранированы в инструкциях обработки XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML против HTML

HTML имеет свой собственный набор escape-кодов, который охватывает гораздо больше символов.

Welbog
источник
33
@Pacerier, я прошу вас не писать свой собственный код XML / HTML. Используйте библиотечную функцию или вы обязательно пропустите особый случай.
Джейсон
5
Также для переносов строк необходимо использовать & # xA; & # XD; и & # x9; для вкладки, если вам нужны эти символы в атрибуте.
Radistao
78
Если вы собираетесь выполнять поиск / замену, просто не забудьте выполнить & amp; замена перед остальными.
Дуг
2
@Doug Я только что упомянул ту же самую вещь - иначе все замененные символы будут испорчены, и такие вещи &quot;будут изменены на&amp;quot;
Джерри Додж
5
Из Википедии: «Все разрешенные символы Юникода могут быть представлены числовой ссылкой на символ». Так что их намного больше, чем 5.
Тим Купер
93

Возможно, это поможет:

Список ссылок на сущности символов XML и HTML :

В документах SGML, HTML и XML логические конструкции, известные как символьные данные и значения атрибутов, состоят из последовательностей символов, в которых каждый символ может проявляться непосредственно (представлять себя) или может быть представлен серией символов, называемых символьной ссылкой, из которых есть два типа: числовая ссылка на символ и ссылка на символьную сущность. В этой статье перечислены ссылки на сущности символов, действительные в документах HTML и XML.

В этой статье перечислены следующие пять предопределенных сущностей XML:

quot  "
amp   &
apos  '
lt    <
gt    >
Эндрю Хэйр
источник
73

В соответствии со спецификациями Консорциума World Wide Web (w3C), существует 5 символов, которые не должны появляться в их буквальном виде в документе XML , за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции по обработке или раздела CDATA. , Во всех остальных случаях эти символы должны быть заменены с использованием соответствующей сущности или числовой ссылки в соответствии со следующей таблицей:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Обратите внимание, что вышеупомянутые объекты могут использоваться также в HTML, за исключением & apos; , который был представлен в XHTML 1.0 и не объявлен в HTML 4. По этой причине и для обеспечения ретро-совместимости спецификация XHTML рекомендует использовать & # 39; вместо.

Albz
источник
14
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

Экранирование символов отличается для тегов и атрибутов.

Для тегов:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Для атрибутов:

" &quot;
' &apos;

Из символьных данных и разметки :

Символ амперсанда (&) и левая угловая скобка (<) не должны появляться в их буквальной форме, за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. Если они нужны где-то еще, их необходимо экранировать, используя либо числовые ссылки на символы, либо строки "& amp;" и "& lt;" соответственно. Правая угловая скобка (>) может быть представлена ​​с помощью строки "& gt;" и для совместимости должна быть экранирована с помощью "& gt;" или ссылки на символ, когда она появляется в строке "]]>" в содержимом, когда эта строка не обозначает конец раздела CDATA.

Чтобы значения атрибутов могли содержать как одинарные, так и двойные кавычки, символ апострофа или одинарной кавычки (') может быть представлен как "& apos;", а символ двойной кавычки (") -" & quot; ».

Питер Бартельс
источник
Это означает, что для атрибутов необходимо экранировать только кавычки, но это в дополнение к трем другим символам
например,
40

Новый, упрощенный ответ на старый, часто задаваемый вопрос ...

Упрощенный XML Escapeing (с приоритетом, завершен на 100%)

  1. Всегда (90% важно помнить)

    • Побег, <как &lt;только <начинает<tag/> .
    • Сбежать, &как &amp;только &начинается &entity;.
  2. Значения атрибутов (9% важно помнить)

    • attr=" 'Одиночные кавычки 'в порядке в двойных кавычках."
    • attr=' "Двойные кавычки" в пределах одинарных кавычек.'
    • Побег "как &quot;и 'как &apos;иначе.
  3. Комментарии , CDATA и инструкции по обработке (0,9% важно запомнить)

    • <!--В комментариях --> ничего не нужно избегать, но нет-- строки не допускаются.
    • <![CDATA[Внутри CDATA ]]> ничего не нужно избегать, но нет]]> строки не допускаются.
    • <?PITargetВнутри PI ?> ничего нельзя экранировать, но ?>строки не допускаются.
  4. Эзотерика (0,1% важно запомнить)

    • Побег , ]]>как ]]&gt;если ]]>не заканчивается раздел CDATA.
      (Это правило применяется к символьным данным в целом - даже вне раздела CDATA.)
kjhughes
источник
Стоит отметить еще одно правило: его ]]>необходимо экранировать ]]&gt;, даже если он не находится в разделе CDATA. Самый простой способ достижения , которые могут быть всегда бежать , >как &gt;.
Майкл Кей,
Спасибо, @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.

Харон ME
источник
11

Сокращенный от: XML, Escape

Есть пять предопределенных объектов:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

«Все разрешенные символы Юникода могут быть представлены с помощью цифровой символьной ссылки». Например:

&#20013;

Большинство управляющих символов и другие диапазоны Юникода специально исключены, а это означает (я думаю), что они не могут быть ни экранированными, ни прямыми:

Допустимые символы в XML

Тим Купер
источник
3

Это зависит от контекста. Для содержания это < и & , и ]]> (хотя строка из трех вместо одного символа).

Для значений атрибутов это < , & , " и ' .

Для CDATA это ]]> .

把 友情 留 在 无 盐
источник