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

836

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

Теги:
escaping
character

10 ответов

1112
Лучший ответ

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

escape-символы XML

Всего пять:

"   "
'   '
<   &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='"'/>

Комментарии

Все 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-кодов, который покрывает намного больше символов.

  • 37
    Окончательный источник: w3.org/TR/xml/#syntax
  • 0
    Но что касается HTML, нам нужно было бы избежать только пяти приведенных выше, не так ли?
Показать ещё 10 комментариев
92

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

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

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

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

quot  "
amp   &
apos  '
lt    <
gt    >
64

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

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

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

  • 11
    XML предопределяет эти пять сущностей, но абсолютно НЕ указывает, что вы не можете использовать ни один из этих пяти символов в их буквальной форме. <и & должны быть экранированы везде (кроме CDATA). «и» должны быть экранированы только в значениях атрибутов, и только если соответствующий символ кавычки одинаков. И> на самом деле никогда не должен экранироваться.
  • 2
    Как написано выше, <> "& 'не нужно экранировать при использовании в качестве разделителей разметки или внутри комментария, инструкции обработки или раздела CDATA. То есть, когда вы используете <> в качестве тега XML, вы не избегаете его То же самое относится и к комментарию (вы не указали бы & в закомментированной строке XML-файла? Вам не нужно, и ваш XML все еще действителен, если вы этого не сделаете). Это четко указано в официальных рекомендациях для XML от W3C .
Показать ещё 2 комментария
45

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

Для тегов:

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

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

" &quot;
' &apos;

http://www.w3.org/TR/2008/REC-xml-20081126/#syntax

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

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

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

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

10

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

Упрощение XML-экранирования

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

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

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

    • <!-- Внутри комментариев --> ничего не должно быть экранировано, но нет -- строки разрешены.
    • <![CDATA[ Внутри CDATA ]]> ничего не должно быть экранировано, но нет ]]> строки разрешены.
    • <?PITarget В НЦБ ?> Ничего не надо бежать, но нет ?> Строки не допускаются.
  4. Эзотерика (0.1% важно запомнить)

    • Escape ]]> as ]]&gt; если ]]> заканчивается секцией CDATA.
      (Это правило применяется к символьным данным вообще - даже вне раздела CDATA.)
  • 0
    Стоит отметить еще одно правило: ]]> должно быть экранировано как ]]&gt; , даже если не в разделе CDATA. Самый простой способ достичь этого - всегда бежать > как &gt; ,
  • 0
    Спасибо, @MichaelKay. Я включен вашу полезную заметку о ]]> но решил низвести его эзотерики , а не предполагая , что > всегда быть экранированы (что это не должно быть, как вы знаете). Моя цель - сделать так, чтобы XML-экранирующие правила легко запоминались и были на 100% точными .
4

Сокращен от: http://en.wikipedia.org/wiki/XML#Escaping

Существует пять предопределенных сущностей:

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

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

&#20013;

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

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

3

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

-1

Они должны быть экранированы:

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню