Являются ли кодировки сущностей XHTML действительными в документах XML, если они содержатся внутри тегов CDATA? - PullRequest
4 голосов
/ 20 марта 2009

Это правильный (правильно сформированный) XML-документ?

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner>&copy;</inner>
</outer>

Вопрос в том, является ли HTML / XHTML "& copy;" Кодировка сущности действительна в документе XML, где нет DTD или схемы для ее определения. Альтернативный способ выразить вышесказанное можно сказать так:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner>&#169;</inner>
</outer>

Какой может показаться действительным XML с кодировкой UTF-8.

Но верно ли это:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner><![CDATA[&copy;]]></inner>
</outer>

Автор вышеизложенного намерен указать синтаксическому анализатору XML, что он должен проходить через символ авторского права выше в виде строки "& copy;" а не как правильный символ Юникода.

В этом отношении я нахожу эту цитату немного запутанной: «Новые авторы XML-документов часто неправильно понимают цель раздела CDATA, ошибочно полагая, что его цель состоит в том, чтобы« защитить »данные от обработки как данных обычных символов во время обработки. [Но] Символьные данные - это символьные данные, независимо от того, выражены ли они через раздел CDATA или обычную разметку. "(Из Википедия )

Я отдельно ищу предложенный формат XML от второго автора, который обернул каждый тег в разделы CDATA, даже когда тег может, например, содержать только цифры.

Надеюсь, гуру XML поможет устранить путаницу с целью использования CDATA.

Спасибо!

Ответы [ 3 ]

9 голосов
/ 20 марта 2009

Раздел CDATA предназначен для того, чтобы разрешить буквальный текст, который обычно интерпретируется особым образом в документе XML. То есть что-то похожее на ссылку на сущность или что-то похожее на теги XML. Все в разделе CDATA может быть внутри допустимого XML без раздела CDATA; вам просто нужно использовать ссылки на сущности для кодирования различных специальных символов, чтобы они не обрабатывались как разметка XML, а как символьные данные, являющиеся значением тега.

Так что да, следующее абсолютно правильно, если вы намерены:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner><![CDATA[&copy;]]></inner>
</outer>

Здесь значением элемента inner является значение &copy;, которое не будет интерпретироваться анализатором XML как ссылка на сущность для символа авторского права. Вы также можете сделать следующее:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner><![CDATA[<normally> this looks <like/> &amp; xml </normally>]]></inner>
</outer>

где значение для элемента inner равно

<normally> this looks <like/> &amp; xml </normally>

Чтобы сделать это без раздела CDATA:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner>&lt;normally&gt; this looks &lt;like/&gt; &amp;amp; xml &lt;/normally&gt;</inner>
</outer>

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

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner><normally> this looks <like/> &amp; xml </normally></inner>
</outer>

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

Примечание. Для ясности приведенный выше пример представляет собой правильно сформированный XML, но если в схеме или DTD указано, что элемент inner содержит xsd: string или эквивалентный, то это неверный XML-документ.

И нет, сущности HTML или XHTML, которые не определены как часть самого XML, не являются допустимыми XML, если они не определены. Ваш анализатор XML вернет ошибку.

5 голосов
/ 20 марта 2009

Эдди дал хороший ответ, я просто завершил некоторые моменты, которые он, по-видимому, не упомянул.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner>&copy;></inner>
</outer>

недопустимо (сущность "копия" не предопределена, только "lt", "gt" и "quot" есть в XML).

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner>&#169;</inner>
</outer>

совершенно законно и, вероятно, дает то, что вы хотите (авторское право символ).

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner><![CDATA[&copy;]]></inner>
</outer>

также совершенно законно, но дает совершенно другой результат ( элемент <inner> будет содержать шесть символов Unicode вместо одного в предыдущий пример).

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE outer[
<!ENTITY copy "&#169;">
]>
<outer>
  <inner>&copy;></inner>
</outer>

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

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
  <inner>©</inner>
</outer>

тоже допустимо (потому что кодировка = "UTF-8", с кодировкой = "US-ASCII", это было бы невозможно), и дает тот же результат. При условии, что ваш клавиатура / редактор позволяет напрямую использовать этот символ.

1 голос
/ 20 марта 2009

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

Конечно, это также связано с тем фактом, что CDATA обрабатывается как произвольно , поэтому, если вы хотите фактическое & copy; в вашем XML это не будет работать. Мы предполагаем, что вы планируете загружать содержимое CDATA в синтаксический анализатор X / HTML, точно так же, как вы можете загрузить двоичный объект двоичных данных в кодировке base64 из изображения в анализатор изображений. Синтаксический анализатор XML не пытается извлечь смысл из содержимого блока CDATA; с таким же успехом можно сказать «фу», как и &copy;.

Цитата из Википедии кажется запутанной.

...