Какой приемлемый способ хранения данных в кавычках в XML? - PullRequest
18 голосов
/ 30 сентября 2008

Какой приемлемый способ хранения данных в кавычках в XML?

Например, для узла, который является правильным?

  • (а) Джесси "Тело" Вентура
  • (б) Джесси \ "Тело \" Вентура
  • (с) Джесси "Тело" Ventura
  • (d) ничего из вышеперечисленного (просьба указать)

Если (а), что вы делаете для атрибутов? Если (с), действительно ли уместно смешивать HTML и XML? Точно так же, как вы обрабатываете одиночные и фигурные кавычки?

Ответы [ 7 ]

28 голосов
/ 30 сентября 2008

Ваш правильный ответ - A & C, поскольку " не является символом, который должен быть закодирован в данных элемента.

Вы всегда должны быть символами XML-кодировки, такими как >, < и &, чтобы гарантировать, что у вас не возникнет проблем, если они НЕ находятся внутри раздела CDATA. Это ключевые элементы, о которых следует помнить для данных элемента.

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

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

14 голосов
/ 30 сентября 2008

Символьные данные внутри элементов XML могут содержать символы кавычек без их экранирования. Единственными символами, которые не разрешены внутри элемента XML, являются «<», «&» и «>» (а символ «>» запрещен, только если он является частью последовательности символов «]]>.

Это не значит, что экранирование кавычек не очень хорошая идея - я просто говорю, что не экранирование кавычек - это совершенно правильный XML. См. Раздел 2.4 - «Символьные данные и разметка» в спецификации XML.

Таким образом, оба (a) и (c) в порядке.

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

Что касается «фигурных кавычек», если вы говорите о специальных кавычках, не относящихся к ASCII, в которые Word иногда преобразует кавычки - у них нет особого значения в XML, так что вы можете делать что угодно не может использоваться для включения значений атрибутов ". Вам также необходимо убедиться в правильности кодировки символов для документа, чтобы они правильно интерпретировались.

5 голосов
/ 30 сентября 2008

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

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

И вам следует избегать (б) при любых обстоятельствах. Никогда не создавайте XML с помощью строковых операций; всегда используйте DOM или другой инструмент.

4 голосов
/ 30 сентября 2008

Например, для узла, который является правильным?

Сама спецификация XML не говорит об узлах (кроме сравнения синтаксиса DTD с конечным автоматическим регулярным выражением). Узел DOM может быть атрибутом, элементом, текстом или любым другим типом узла.

Внутри текстового узла вам нужно только экранировать символы, которые синтаксический анализатор будет интерпретировать как запуск другого узла - поэтому вы экранируете & и <</em> как & amp; и & lt; .

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

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

<foo attribute="'ok'" attribute2='"also-ok"' attribute3="&quot;needed&quot;"/>

Обычно легче привыкнуть использовать только один тип и всегда избегать его. Я пишу довольно много XSLT и одобряю использование "снаружи и внутри":

<xsl:value-of select="person[@name = 'bob']"/>

Если вы становитесь параноиком с побегом, XPath становится менее читабельным:

<xsl:value-of select="person[@name = &apos;bob&apos;"/>

Если (с), действительно ли уместно смешивать HTML и XML?

XML определяет именованные объекты amp , gt , lt , apos , & quot

HTML определяет еще много сущностей.

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

Сущность lt экранирует <</em> и должна использоваться в значениях текста и атрибутов. Сущность amp экранирует & и должна использоваться в значениях текста и атрибутов. Объекты apos и quot экранируют ' и " и должны использоваться в значениях атрибутов. Сущность gt немного бесполезна - почти никогда не существует синтаксического требования для экранирования > в XML. Возможно> согласился работать только с <, если он получил равный счет. </p> Другой, который я часто использую в XSLT, который генерирует исходный код, - это & # xa; , который вставляет новую строку. & nl; было бы более полезным, чем & gt;

Точно так же, как вы обрабатываете одиночные и фигурные кавычки?

XML предназначен для разметки текста в Юникоде, и фигурные кавычки не имеют в нем особого значения. Тем не менее, нередки случаи, когда кодировка, используемая для XML-документа, неверно интерпретируется в дикой природе. Так что, если он находится в закрытой среде и может гарантировать правильную кодировку Unicode у производителя и потребителя, я бы просто поместил его в XML. В противном случае используйте числовой символьный объект. Это верно для любого символа с кодовой точкой выше 127 - в фигурных кавычках нет ничего особенного.

4 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

Это зависит на самом деле. Если все, что вы хотите сделать, это иметь кавычки в вашей строке XML, тогда «A».

Но если есть смысл или вам нужно абстрагировать цитату (например, i18n), XML предоставляет более широкие возможности. Например:

<name>
  <given>Jesse</given>
  <family>Ventura</family>
  <nickName>the Body</nickName>
</name>

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

0 голосов
/ 30 сентября 2008

Правильный ответ: «С».

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

...