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

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

7.07.2009 12:07:42
Пример:<company>AT&amp;T</company>
jacktrades 5.12.2012 19:47:46
См. Упрощенный XML Escapeing ниже для краткого и легко запоминающегося руководства, которое я извлек из первоисточников ( W3C Extensible Markup Language (XML) 1.0 (пятое издание) ).
kjhughes 14.02.2018 16:40:00
9 ОТВЕТОВ
РЕШЕНИЕ

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

1345
26.01.2020 13:53:11
@Pacerier, я прошу вас не писать свой собственный код XML / HTML. Используйте библиотечную функцию или вы обязательно пропустите особый случай.
Jason 16.03.2012 09:23:08
Также для переносов строк необходимо использовать & # xA; & # XD; и & # x9; для вкладки, если вам нужны эти символы в атрибуте.
radistao 26.11.2012 22:33:22
Если вы собираетесь выполнять поиск / замену, просто не забудьте выполнить & amp; замена раньше остальных.
Doug 15.06.2013 21:29:08
@Doug Я собирался упомянуть точно то же самое - иначе все замененные символы будут испорчены, и такие вещи &quot;будут изменены на&amp;quot;
Jerry Dodge 5.08.2013 22:23:12
Из Википедии: «Все разрешенные символы Юникода могут быть представлены с помощью числовой ссылки на символ». Так что их намного больше, чем 5.
Tim Cooper 15.08.2014 07:47:37

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

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

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

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

quot  "
amp   &
apos  '
lt    <
gt    >
92
7.06.2012 18:33:16

В дополнение к общеизвестным пяти символам [<,>, &, "и '] я бы также экранировал символ вертикальной табуляции (0x0B). Это допустимый UTF-8, но не допустимый XML 1.0 и даже многие библиотеки (включая очень переносимую (ANSI C) библиотеку libxml2 ) пропускает ее и молча выводит неверный XML.

24
26.01.2020 13:54:45

В соответствии со спецификациями Консорциума 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; вместо.

72
3.07.2013 12:38:30
XML предопределяет эти пять сущностей, но абсолютно НЕ указывает, что вы не можете использовать ни один из этих пяти символов в их буквальной форме. <и & должны быть экранированы везде (кроме CDATA). «и» необходимо экранировать только в значениях атрибутов и только в том случае, если соответствующий символ кавычки одинаков. И> на самом деле экранировать не нужно.
Shaun McCance 24.08.2013 13:58:01
Как написано выше, <> "& 'не нужно экранировать при использовании в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. То есть, когда вы используете <> в качестве тега XML, вы не избегаете его То же самое относится и к комментарию (вы не указали бы & в закомментированной строке XML-файла? Вам не нужно, и ваш XML все еще действителен, если вы этого не сделаете). Это четко указано в официальных рекомендациях для XML по W3C .
Albz 1.10.2013 07:21:37
@ShaunMcCance >должен быть экранирован, если он следует ]]внутри содержимого, если только он не является частью ]]>разделителя, указывающего конец раздела CDATA.
Lee D 25.04.2014 17:45:52
Не быть некромантом, но @Albz неверно утверждать, что эти символы ДОЛЖНЫ иметь право на содержание. Смотрите раздел 2.4 на w3.org/TR/REC-xml/#NT-CharData . Это версия TL; DR в содержании элемента chardata & amp; и & lt; должны быть всегда наделены правом. & Gt; символ МОЖЕТ быть разрешен, хотя он ДОЛЖЕН быть при появлении в буквальной строке «]]>», так как в противном случае он будет читаться как конец раздела CDATA. Для одинарных и двойных кавычек вы можете убежать, если хотите. Вот и все, для чардата внутри элементов. Другие компоненты XML имеют другие правила.
s-k-y-e---c-a-p-t-a-i-n 3.05.2016 17:52:51

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

Для тегов:

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

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

" &quot;
' &apos;

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

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

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

51
17.12.2019 19:07:02
Это означает, что для атрибутов необходимо экранировать только кавычки, но это в дополнение к трем другим символам
eug 5.07.2018 04:46:10

Только <и &должны быть экранированы, если они должны обрабатываться символьными данными, а не разметкой:

2.4 Символьные данные и разметка

-6
26.01.2020 14:00:02

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

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

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

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

&#20013;

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

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

10
17.12.2019 19:03:41

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

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

Для CDATA это ]]> .

3
17.12.2019 19:05:17

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

Упрощенный 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.)
39
1.08.2019 14:34:16
Стоит отметить еще одно правило: его ]]>необходимо экранировать ]]&gt;, даже если оно не находится в разделе CDATA. Самый простой способ достижения , которые могут быть всегда бежать , >как &gt;.
Michael Kay 29.05.2018 15:24:59
Спасибо, @MichaelKay. Я включил вашу полезную заметку, ]]> но решил отнести ее к эзотерике, а не предлагать > всегда избегать (чего, как вы знаете, не должно быть). Моя цель - сделать так, чтобы XML-экранирующие правила легко запоминались и были на 100% точными .
kjhughes 3.06.2018 14:01:27
Приведенные выше ответы, включая одно упоминание, все пять символов следует экранировать внутри атрибутов. Есть ли у вас какая-либо ссылка на стандарт XML для подтверждения того, что вы говорите, поскольку ваш ответ логически кажется правильным?
Roman Susi 7.02.2020 05:49:02
@RomanSusi: Да, многие другие ответы содержат ошибки или чрезмерные обобщения («безопасный путь ...»), основанные на слухах, неправильном толковании или неправильном понимании официального XML BNF. Мой ответ (а) оправдан на 100% Рекомендацией W3C XML; см. множество связанных ссылок на официальный BNF и (b) организованных в краткой, логичной и легко запоминающейся последовательности этих требований.
kjhughes 7.02.2020 13:44:26
@RomanSusi: Конкретное утверждение, что «все пять символов должны быть экранированы внутри атрибутов», является неаккуратным руководством, не поддерживаемым официальным правилом BNF, которое AttValueцитируется в моем ответе по ссылке на 2. Значения атрибутов .
kjhughes 7.02.2020 13:44:41