2009-09-09 4 views
28

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

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

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

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

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

ответ

24

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

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

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

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

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

+1

Единственная причина, по которой я решил не использовать CDATA, заключается в том, что обычно большинству данных не требуется экранирование, и это беспорядок, чтобы увидеть так много обложек CDATA в тексте, который не требует экранирования.Первый метод означает, что иногда у вас есть кодировки HTML, но в большинстве случаев у вас есть хороший чистый текст без лишней обертки. Конечно, это может отличаться в зависимости от ваших типичных данных. – AaronLS

0

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

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

0

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

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

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

1

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

0

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

Вы можете сделать это, только если html создан.

1

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

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

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

Надеюсь, что это было так, как я намеревался.

11

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

1

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

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

0

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

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

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

+1

HTML не обязательно действителен XML (например, HTML dosen't требует закрытия тегов). Они выглядят одинаково, потому что они используют SGML как своего общего предка. Единственный вариант - это избавиться от данных или использовать cdata. В противном случае синтаксический анализатор XML сработает, когда обнаружит искаженную разметку. –

3

Если вы используете 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 теге

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^