HTML внутри XML. Должен ли я использовать CDATA или кодировать HTML
Я использую XML для совместного использования содержимого HTML. AFAIK, я мог бы вставлять HTML либо:
-
Кодирование: я не знаю, полностью ли это безопасно. И мне пришлось бы расшифровать его снова.
-
Использование разделов CDATA: я все еще могу иметь проблемы, если содержимое содержит закрывающий тег "]] > " и некоторые шестнадцатеричные символы, я считаю. С другой стороны, анализатор XML будет извлекать информацию прозрачно для меня.
Какой вариант выбрать?
UPDATE: xml будет создан в java и передан как строка в веб-службу .net, если она будет проанализирована. Поэтому мне нужно иметь возможность экспортировать xml в виде строки и загрузить ее с помощью "doc.LoadXml(xmlString)",
Ответы
Ответ 1
Два варианта почти одинаковы. Вот ваши два варианта:
<html>This is <b>bold</b></html>
<html><![CDATA[This is <b>bold</b>]]></html>
В обоих случаях вы должны проверить свою строку для специальных символов, которые должны быть экранированы. Многие люди притворяются, что строки CDATA не нуждаются в каких-либо экранах, но, как вы указываете, вы должны убедиться, что "]] > " не соскальзывает в неэкранированном виде.
В обоих случаях процессор XML вернет вашу строку для декодирования.
Ответ 2
CDATA легче читать глазом, в то время как кодированное содержимое может содержать в себе маркеры CDATA, но вам не нужно заботиться. Просто используйте библиотеку XML и перестаньте беспокоиться об этом. Тогда все, что вам нужно сказать, это "Поместить этот текст внутри этого элемента", и библиотека либо закодирует его, либо обернет его в маркеры CDATA.
Ответ 3
CDATA для простоты.
Ответ 4
Если вы используете CDATA, то вы должны его правильно декодировать (textContent, value и innerHTML являются методами, которые НЕ вернут правильные данные).
скажем, что вы используете структуру xml, подобную этой:
<response>
<command method="setcontent">
<fieldname>flagOK</fieldname>
<content>479</content>
</command>
<command method="setcontent">
<fieldname>htmlOutput</fieldname>
<content>
<![CDATA[
<tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:55</td><td align='right'>113</td><td align='right'>NE</td><td align='right'>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&iwloc=A&t=h&z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:56</td><td align='right'>112</td><td align='right'>NE</td><td align='right'>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&iwloc=A&t=h&z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 18:00</td><td align='right'>111</td><td align='right'>SE</td><td align='right'>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&iwloc=A&t=h&z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
]]>
</content>
</command>
</response>
в javascript, тогда вы будете декодировать, загрузив xml (jquery, например) в переменную типа xmlDoc ниже, а затем получив nodeValue для второго вхождения (item(1)
) тега content
xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue
или (оба обозначения эквивалентны)
xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
Ответ 5
Я не знаю, какой XML-строитель вы используете, но PHP (на самом деле libxml) знает, как обрабатывать ]]>
внутри разделов CDATA, и поэтому должна быть всякая другая XML-структура. Итак, я бы использовал раздел CDATA.
Ответ 6
Имеет смысл обернуть HTML в CDATA. HTML-текст, вероятно, будет содержать одно значение в XML.
Поэтому, не обертывая его в CDATA, все синтаксические анализаторы XML будут читать его как часть XML-документа. Хотя легко обойти эту проблему при использовании xml, почему дополнительная головная боль?
Если вы хотите фактически разобрать HTML в DOM, тогда лучше прочитать текст HTML и настроить парсер для чтения теста отдельно.
Надеюсь, что это было так, как я думал.
Ответ 7
Лично я ненавижу сегменты CDATA, поэтому вместо этого буду использовать кодировку. Конечно, если вы добавите XML в XML в XML, это приведет к кодированию через кодирование по кодированию и, следовательно, к очень нечитаемым результатам.
Почему я ненавижу сегменты CDATA? Если бы я знал. Личные предпочтения, в основном. Мне просто не нравится привыкать добавлять "запрещенные символы" в специальный сегмент, где они снова будут разрешены. Это меня просто смущает, когда я вижу разметку XML в сегменте CDATA, и это не часть XML, окружающего его. По крайней мере, с кодировкой я увижу, что она закодирована.
Хорошие библиотеки XML будут обрабатывать как кодирование, так и сегменты CDATA прозрачно. Это просто мои глаза, которые пострадают.
Ответ 8
Кодирование будет работать нормально и надежно. Вы можете без каких-либо затруднений кодировать закодированные разделы и т.д.
Декодирование будет выполняться автоматически любым XML-парсером, используемым для обработки вашего закодированного HTML.
Ответ 9
Я думаю, что ответ зависит от того, что вы планируете делать с содержимым html, а также о том, какой тип содержимого html вы планируете поддерживать.
Особенно, когда речь заходит о включенном javascript, кодирование часто приводит к проблемам. CDATA определенно помогает вам там.
Если вы планируете использовать только небольшие фрагменты (т.е. абзац) и иметь способ препроцитировать/фильтровать его (потому что oyu не хочет javascript или причудливые вещи в любом случае), вам, вероятно, будет лучше с кодировкой или просто просто поставить он непосредственно как поддерево в xml. Затем вы также можете обработать html (например, стиль фильтра или атрибуты onclick). Но это определенно больше работы.
Ответ 10
Вы можете использовать комбинацию обоих.
Например: вы хотите передать <h1>....</h1>
в xml node, для этого вы используете раздел CDATA. Содержимое внутри <h1>...</h1>
должно быть закодировано в html-объектах, например, например. <
, для <
.
Кодирование между тегами решает проблему]] > получения interprited, поскольку она преобразуется в ]]>
, а теги html не содержат ]]>
.
Вы можете сделать это, только если html генерируется самостоятельно.
Ответ 11
Если ваш HTML хорошо сформирован, тогда просто вставляйте HTML-теги без экранирования или обертывания в CDTATA. Если это вообще возможно, это помогает сохранить ваш контент в XML. Это дает вам больше гибкости для преобразования и управления документом.
Вы можете установить пространство имен для HTML, чтобы вы могли устранить ваши теги HTML из другого XML-пакета.
Исключенный текст означает, что весь блок HTML будет одним большим текстом node. Обтекание в CDATA говорит синтаксическому анализатору XML не анализировать этот раздел. Это может быть "легче", но ограничивает ваши способности понижением и может использоваться только тогда, когда это необходимо; не только потому, что это более удобно. Экранированная разметка считается вредной.