Когда требуется экранировать символы в XML? - PullRequest
11 голосов
/ 01 августа 2011

Когда мы должны заменить < > & " ' в XML на символы вроде &lt и т. Д.

Насколько я понимаю, это просто для того, чтобы убедиться, что если в части содержимого XML есть > <, то парсер не будетTreat - это начало или конец тега.

Кроме того, если у меня есть XML-код:

<hello>mor>ning<hello>

, следует заменить его на:

  • &lthello&gtmor&gtning&lthello&gt
  • &lthello&gtmor>ning&lthello&gt
  • <hello>mor&gtning<hello>

Я не понимаю, зачем нужна замена.Когда именно это требуется и что именно (теги или текст) следует заменить?

Ответы [ 5 ]

9 голосов
/ 01 августа 2011

Раздел 2.4 спецификации XML четко гласит:

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

8 голосов
/ 01 августа 2011

<, >, &, " и ' все имеют специальные значения в XML (например, «начало объекта» или «разделитель значения атрибута»).

Чтобы эти символы отображались в виде данных (вместо их специального значения), они могут быть представлены сущностями (&lt; для < и т. Д.).

Иногда эти специальные значения являются контекстно-зависимыми (например, «не означает« атрибут-разделитель »за пределами тега), и есть места, где они могут отображаться как необработанные данные. Вместо того, чтобы беспокоиться об этих исключениях, проще всего всегда представлять их как объекты, если вы хотите избежать ихспециальное значение. Тогда единственное, что надо, - это явные разделы CDATA, в которых особое значение не сохраняется (и & не запускает сущность).

в случае замены на

Он не должен быть представлен как ни один из них. Сущности должны заканчиваться точкой с запятой.

То, как вы должны это представить, зависит от того, какой бит вашего примераданные и разметка.Например, вы не сказали, если <hello> должен быть данными или начальным тегом для элемента приветствия.

5 голосов
/ 01 августа 2011

Вы должны закодировать все символы, которые имеют особое значение в XML, но не должны интерпретироваться синтаксическим анализатором.

Предполагая, что ваш XML равен

<hello>mor>ning</hello> 

, вы закодируете его как

<hello>mor&gt;ning</hello>

или используйте CDATA [Википедия] раздел:

<hello><![CDATA[mor>ning]]></hello>
1 голос
/ 14 марта 2014

https://github.com/savonrb/gyoku/blob/master/README.md

Вы можете использовать Gyoku, чтобы не экранировать символы в CDATA.

1 голос
/ 01 августа 2011

Вы можете увидеть это объяснение введите описание ссылки здесь но в основном такие символы, как <и>, важны при разборе XML-документа. Если дополнительные из этих специальных символов включены в текст узла xml или текст атрибута, анализатор не сможет правильно понять документ. Если вы отправляете xml на какой-либо веб-сервис, все специальные символы должны быть правильно экранированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...