Подтвердить что ты не робот

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

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

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

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

Какой вариант выбрать?

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

4b9b3361

Ответ 1

Два варианта почти одинаковы. Вот ваши два варианта:

<html>This is &lt;b&gt;bold&lt;/b&gt;</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&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 для второго вхождения (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-объектах, например, например. &lt;, для <. Кодирование между тегами решает проблему]] > получения interprited, поскольку она преобразуется в ]]&gt;, а теги html не содержат ]]>.

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

Ответ 11

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

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

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