Html внутри XML. Должен ли я использовать CDATA или кодировать HTML

Я использую XML для обмена HTML-контентом. AFAIK, я мог бы вставить HTML либо по:

  • кодирование: я не знаю, полностью ли безопасно использовать. И мне придется расшифровать его снова.

  • используйте разделы CDATA: у меня все еще могут быть проблемы, если содержимое содержит закрывающий тег "]]>" и некоторые шестнадцатеричные символы, я считаю. С другой стороны, синтаксический анализатор XML будет извлекать информацию прозрачно для мне.

какой вариант я должен выбрать?

UPDATE: xml будет создан на java и передан как строка в веб-службу .net, если он будет проанализирован обратно. Поэтому мне нужно иметь возможность экспортировать xml в виде строки и загрузить его с помощью "doc.LoadXml(xmlString);"

11 ответов


эти два варианта почти точно такие же. Вот ваши два варианта:

<html>This is &lt;b&gt;bold&lt;/b&gt;</html>

<html><![CDATA[This is <b>bold</b>]]></html>

в обоих случаях вам нужно проверить строку на наличие специальных символов для экранирования. Многие люди притворяются, что строки CDATA не нуждаются в экранировании, но, как вы указываете, вы должны убедиться, что "]]>" не скользит без эскапады.

в обоих случаях XML-процессор вернет вам декодированную строку.


CDATA легче читать на глаз, в то время как закодированный контент может иметь конец маркеров CDATA в нем безопасно - но вам не нужно заботиться. Просто используйте библиотеку XML и перестаньте беспокоиться об этом. Тогда все, что вам нужно сказать, это "поместить этот текст внутри этого элемента", и библиотека либо закодирует его, либо обернет в маркеры CDATA.


CDATA для простоты.


если вы используете 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&amp;iwloc=A&amp;t=h&amp;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&amp;iwloc=A&amp;t=h&amp;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&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
            ]]>
        </content>
    </command>
</response>

в javascript, то вы будете декодировать, загрузив xml (jquery, например) в переменную, как xmlDoc ниже, а затем получить nodeValue для 2-го появления ( item(1) ) из content tag

xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue

или (оба обозначения эквивалент)

xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue

Я не знаю, какой XML builder вы используете, но PHP (на самом деле libxml) знает, как обрабатывать ]]> внутри разделов CDATA, и так же должны все другие рамки XML. Итак, я бы использовал раздел CDATA.


имеет смысл обернуть HTML в CDATA. HTML-текст, вероятно, будет составлять одно значение в XML.

поэтому, не обертывая его в CDATA, все синтаксические анализаторы xml будут читать его как часть XML-документа. Хотя легко обойти эту проблему при использовании xml, почему дополнительная головная боль?

Если вы хотите фактически разобрать HTML в DOM, то лучше прочитать текст HTML и настроить парсер для чтения теста отдельно.

надеюсь, что вышло так, как я и хотел.


лично я ненавижу сегменты CDATA, поэтому вместо этого я бы использовал кодировку. Конечно, если вы добавляете XML в XML в XML, это приведет к кодированию над кодировкой над кодировкой и, следовательно, к некоторым очень нечитаемым результатам. Почему я ненавижу сегменты CDATA? Хотел бы я знать. В основном личные предпочтения. Мне просто не нравится привыкать добавлять "запрещенные символы" внутри специального сегмента, где они внезапно будут разрешены снова. Это просто смущает меня, когда я вижу XML-разметку в сегменте CDATA, и это не так часть XML, окружающего его. По крайней мере, с кодировкой я увижу, что она закодирована.

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


кодирование будет работать нормально и надежно. Вы можете кодировать закодированные разделы etc. без труда.

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


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

особенно, когда дело доходит до включенного javascript, кодирование часто приводит к проблемам. CDATA определенно помогает вам там.

Если вы планируете использовать только небольшие фрагменты (т. е. абзац) и есть способ предварительной обработки / фильтрации (потому что oyu не хочет javascript или причудливых вещей в любом случае), вам, вероятно, будет лучше с кодирование или на самом деле просто помещает его непосредственно в поддерево в xml. Затем вы также можете обработать html (например, стиль фильтра или атрибуты onclick). Но это определенно больше работы.


вы можете использовать комбинацию обоих. Например: вы хотите пройти <h1>....</h1> в XML-узле вы должны использовать раздел CDATA для его передачи. Содержимое внутри <h1>...</h1> должен быть закодирован в HTML-сущности, как, например,&lt;, for <. Кодирование между тегами решит проблему ]]> получение interprited, как он преобразуется в ]]&gt; и HTML-теги не содержат ]]>.

вы можете сделать это только если HTML генерируется самостоятельно.


Если ваш HTML хорошо сформирован, то просто вставьте HTML-теги без экранирования или упаковки в CDTATA. Если это вообще возможно, это помогает сохранить ваш контент в XML. Это дает вам больше гибкости для преобразования и обработки документа.

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

экранированный текст означает, что весь блок HTML будет одним большим текстовым узлом. Упаковка в CDATA рассказывает синтаксический анализатор XML не анализирует этот раздел. Это может быть "проще", но ограничивает ваши способности и должно использоваться только тогда, когда это необходимо; не только потому, что это более удобно. экранированная разметка считается вредной.