Какие символы мне нужно экранировать в документах 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-кодов, который охватывает гораздо больше символов.


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; вместо.


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.)

Стоит отметить еще одно правило: его ]]>необходимо экранировать ]]&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.


11

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

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

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

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

&#20013;

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

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


3

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

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

Для CDATA это ]]> .


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.