При анализе XML-каналов Atom, как следует обрабатывать конфликтующие элементы CDATA и экранированные сущности?

Как анализатор фидов Atom должен обрабатывать следующую строку XML в фиде:

<title type="html"><![CDATA[Johnson &amp; Johnson]]></title>

Для обсуждения давайте предположим, что изначально задуманный текст был на самом деле Johnson & Johnson, Я наткнулся на эту онлайн-дискуссию по этому вопросу, и, похоже, было два разных мнения:

  1. Мнение № 1 - утверждает, что этот контент в двойном коде. Текст "Johnson & Johnson" был экранирован, а затем снова закодирован путем переноса в раздел CDATA. Он заявляет, что верный xml-парсер вернет Johnson &amp; Johnsonпотому что это то, как спецификация XML заявляет, что данные CDATA должны обрабатываться.

  2. Мнение № 2 - утверждает, что спецификация Atom имеет прецедент. Он заявляет, что CDATA действует как сквозной канал. Johnson &amp; Johnson выходит как Johnson &amp; Johnson, Если бы это был просто документ XML, на этом все закончилось бы. Однако, поскольку это Atom, мы должны посмотреть на спецификацию Atom, чтобы определить правильное поведение. Спецификация атома утверждает, что любой элемент с type="html" содержит html Таким образом, мы должны быть в состоянии расшифровать его.

Что из этого действительно правильно? Должен ли правильный синтаксический анализатор Atom XML производить:Johnson & Johnson или же Johnson &amp; Johnson учитывая эту конкретную ситуацию?

3 ответа

Оба мнения верны:

  • Заголовок закодирован как текст Johnson & Johnson,
  • Заголовок закодирован как HTML Johnson &amp; Johnson
  • Заголовок, закодированный как HTML в XML: <![CDATA[Johnson &amp; Johnson]]>

Контент между маркерами CDATA не анализируется для объектов тегов, поэтому анализируемое значение текстового узла Johnson &amp; Johnson,

Обратите внимание, что атрибут говорит type="html"поэтому он должен быть проанализирован как HTML.

Например, если вы выражаете это как веб-страницу, вы можете написать:

<h1>Johnson &amp; Johnson</h1>

Если бы это сказал type="text" тогда вам нужно было бы закодировать обычный текст в виде HTML, который бы дал вам:

<h1>Johnson &amp;amp; Johnson</h1>

CDATA - это символьные данные - полностью игнорируется анализатором между ними. Так должно быть, поскольку xml не может обработать &. Следовательно, здесь нет "двойного кодирования" - любой синтаксический анализатор пропускает тег close, игнорируя все, что находится между ними. Я не сталкивался с парсером, который допускает фактическое вложение (встроенные полные CDATA теги открытия и закрытия).

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