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

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

10 ответов

Решение

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

Escape-символы XML

Всего пять:

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

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

Примеры могут быть проверены в 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

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

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

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

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

    • Побег ]]> как ]]&gt; если ]]> заканчивается раздел 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; вместо.

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

Для тегов:

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

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

" &quot;
' &apos;

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

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

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

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

&#20013;

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

http://en.wikipedia.org/wiki/Valid_characters_in_XML

Принятый ответ неверен. Лучше всего использовать библиотеку для экранирования xml.

Как упоминалось в этом другом вопросе

«В основном, управляющие символы и символы вне диапазонов Unicode не допускаются. Это также означает, что вызов, например, символьной сущности запрещен».

Если вы избежите только пяти символов. У вас могут быть проблемы, например, был обнаружен недопустимый символ XML (Unicode: 0xc)

Это зависит от контекста. Для содержимого это <и &, и]]>(хотя строка 3 вместо одного символа). Для значений атрибутов это <и & и "и '. Для CDATA это]]>.

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

http://www.w3.org/TR/xml11/

Другие вопросы по тегам