Escape символы xml

Обновлено: 04.07.2024

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

См. Упрощенный XML Escapeing ниже для краткого и легко запоминающегося руководства, которое я извлек из первоисточников ( W3C Extensible Markup Language (XML) 1.0 (пятое издание) ).

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

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

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

текст

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

CDATA

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

упрощенный XML Escaping

  • побег < as &lt; если < начинается <tag/> .
  • побег & as &amp; если & is начиная с &entity; .
  • attr
  • attr=' " двойные кавычки " в порядке в одинарных кавычках. '
  • побег " as &quot; и ' as &apos; иначе.
  • <!-- внутри комментарии --> ничего не должно быть спасено, но нет -- строк не допускаются.
  • <![CDATA[ внутри CDATA ]]> ничего нужно бежать, но нет!--24--> строк не допускаются.
  • <?PITarget внутри PIs ?> ничто не должно быть спасено, но нет ?> строк не допускаются.
  • побег ]]> as ]]&gt; если ]]> заканчивается раздел CDATA.
    (это правило применяется к символьным данным вообще-даже вне раздела CDATA.)

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

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

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

Это зависит от контекста. Для содержимого это (хотя строка 3 вместо одного символа). Для значений атрибутов это .

у меня есть узлы, которые содержат строки, как показано ниже:

это недопустимо из-за &

Я не могу обернуть эти строки в CDATA, поскольку они должны быть такими, какие они есть. Я попытался найти в интернете список символов, которые нельзя поместить в узлы XML, не находясь в Разделы CDATA.

может ли кто-нибудь указать мне в направлении одного или предоставить мне список незаконных символов?

только незаконные символы & , < и > (а также " или ' в атрибутах).

они сбежали, используя сущности XML в этом случае, если вы хотите &amp; на & .

на самом деле, хотя, вы должны использовать инструмент или библиотеку, которая пишет XML для вас и абстрагирует такого рода вещи для вас, так что вам не придется беспокоиться об этом.

список допустимых символов в спецификация XML:

хорошо, давайте разделим вопрос (1) символов, которые не являются допустимыми вообще в любом XML-документе, и (2) символов, которые должны быть экранированы:

ответ, предоставленный @dolmen недопустимые символы в XML по-прежнему действителен, но должен быть обновлен спецификацией XML 1.1.

символы, описанные здесь, - это все символы, которые могут быть вставлены в XML документ.

Атрибуты

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

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

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

Комментарии

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

1.2. в XML 1.1

глобальный список разрешенных символов:

эта редакция рекомендации XML расширила разрешенные символы, поэтому разрешены управляющие символы, и учитывает новую редакцию стандарт Unicode, но эти по-прежнему не разрешены:NUL (x00), xFFFE, xFFFF.

однако использование управляющих символов и неопределенного символа Unicode не рекомендуется.

также можно заметить, что все синтаксические анализаторы не всегда учитывают это, и XML-документы с контрольными символами могут быть отклонены.

на < должна начинаться с &lt; entity, так как предполагается, что это начало тега.

на & должна начинаться с &amp; сущность, так как предполагается, что это начало ссылки на сущность

на > следует избежать с &gt; сущности. Это не обязательно - это зависит от контекста, - но настоятельно рекомендуется избегать его.

на ' следует избежать с &apos; entity -- обязательно в атрибутах, определенных в одинарных кавычках, но настоятельно рекомендуется всегда избегать его.

на " следует избежать с &quot; entity -- обязательно в атрибутах, определенных в двойных кавычках, но настоятельно рекомендуется всегда избегать его.

я генерирую XML-документ из php-скрипта, и мне нужно избежать специальных символов XML. Я знаю список символов, которые должны быть экранированы; но каков правильный способ сделать это?

использовать дом классы для создания всего XML-документа. Он будет обрабатывать кодировки и декодирования, о которых мы даже не хотим заботиться.

Edit: это было раскритиковано @Tchalvak:

объект DOM создает полный XML-документ, он не легко поддается кодированию строки самостоятельно.

что неправильно, DOMDocument может правильно выводить только фрагмент, а не весь документ:

Я создал простую функцию, которая убегает с пять "предопределенные объекты" в XML-код:

подобный эффект может быть достигнут с помощью str_replace но оно будет хрупким из-за двойной replacings (непроверенных, не рекомендуется):

для того, чтобы иметь действительный окончательный текст XML, вам нужно избежать всех XML-сущностей и иметь текст, написанный в той же кодировке, что и XML-обработка документов-инструкция утверждает это ("кодировка" в <?xml line). Акцентированные символы не нужно экранировать, пока они закодированы как документ.

однако во многих ситуациях просто избежать ввода с htmlspecialchars может привести к двойному кодированию сущностей (например &eacute; станет &amp;eacute; ), поэтому я предлагаю декодировать HTML-сущности первого:

теперь вам нужно убедиться, что все акцентированные символы действительны в кодировке XML-документа. Я настоятельно рекомендую всегда кодировать XML-вывод в UTF-8, поскольку не все синтаксические анализаторы XML уважают кодировку XML-инструкций по обработке документов. Если ваш ввод может исходить из другой кодировки, попробуйте использовать utf8_encode() .

Если вам нужен правильный вывод xml, simplexml-это путь:

правильное экранирование-это способ получить правильный вывод XML, но вам нужно обработать экранирование по-разному на атрибуты и элементов. (То есть ответ Томаса неверен).

я писал/украл Java-код некоторое время назад, что отличает атрибут и элемент экранирования. Причина в том, что синтаксический анализатор XML считает все пробелы особенными, особенно в атрибутах.

Это должно быть тривиально перенесите это на PHP (вы можете использовать подход Томаса Янчика с соответствующим экранированием выше). Вам не нужно беспокоиться о побеге расширенных объектов, если вы используете UTF-8 .

Если вы не хотите переносить мой Java-код, вы можете посмотреть на объекта XmlWriter который основан на потоке и использует libxml, поэтому он должен быть очень эффективным.

таким образом, все сущности (html/xml) экранируются, и вы можете поместить свою строку внутри тегов XML

1.1. В XML 1.0

глобальный список разрешенных символов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

атрибуты

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

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

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

CDATA

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

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

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

в HTML есть собственный набор кодов эвакуации, которые охватывают гораздо больше персонажей.

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

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

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

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

Оригинал Характер замена сущности XML XML числовая замена

> > >
" " "
& & &
' ' '

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

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

символ амперсанда (&) и левая угловая скобка ( ) может быть представлена с помощью строка " > " и для совместимости должна быть экранирована с помощью либо ">"или ссылка на символ, когда он появляется в строке"]] > "в содержимом, когда эта строка не помечает конец CDATA раздел.

разрешить значения атрибутов содержать как одинарные, так и двойные кавычки, этот Апостроф или символ одинарной кавычки ( ' ) может быть представлен как " "и двойные кавычки (") как "" ".

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

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

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

  • Побег, < как &lt; только < начинает <tag/> .
  • Сбежать, & как &amp; только & начинается &entity; .
  • attr
  • attr=' " Двойные кавычки " в пределах одинарных кавычек. '
  • Побег " как &quot; и ' как &apos; иначе.
  • <!-- В комментариях --> ничего не нужно избегать, но нет -- строки не допускаются.
  • <![CDATA[ Внутри CDATA ]]> ничего не нужно избегать, но нет ]]> строки не допускаются.
  • <?PITarget Внутри PI ?> ничего нельзя экранировать, но ?> строки не допускаются.
  • Побег , ]]> как ]]&gt; если ]]> не заканчивается раздел CDATA.
    (Это правило применяется к символьным данным в целом - даже вне раздела CDATA.)
Стоит отметить еще одно правило: его ]]> необходимо экранировать ]]&gt; , даже если он не находится в разделе CDATA. Самый простой способ достижения , которые могут быть всегда бежать , > как &gt; . Спасибо, @MichaelKay. Я включил вашу полезную заметку о, ]]> но решил отнести ее к эзотерике, а не предлагать > всегда избегать (чего, как вы знаете, не должно быть). Моя цель - сделать так, чтобы XML-экранирующие правила легко запоминались и были на 100% точными . Приведенные выше ответы, включая одно упоминание, все пять символов следует экранировать внутри атрибутов. Есть ли у вас какая-либо ссылка на стандарт XML для подтверждения того, что вы говорите, поскольку ваш ответ логически кажется правильным? @RomanSusi: Да, многие другие ответы содержат ошибки или чрезмерные обобщения («безопасный путь . »), основанные на слухах, неправильном толковании или неправильном понимании официального XML BNF. Мой ответ (а) оправдан на 100% Рекомендацией W3C XML; см. множество связанных ссылок на официальный BNF и (b) организованных в краткой, логичной и легко запоминающейся последовательности этих требований. @RomanSusi: конкретное утверждение о том, что «все пять символов должны быть экранированы внутри атрибутов», является неаккуратным руководством, не поддерживаемым официальным правилом BNF, которое AttValue цитируется в моем ответе по ссылке на 2. Значения атрибутов .

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

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

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

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

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

Текст

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

комментарии

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

Читайте также: