XML内部的HTML。我应该使用CDATA还是编码HTML

时间:2009-09-09 09:35:00

标签: xml cdata html-encode

我正在使用XML来共享HTML内容。 AFAIK,我可以通过以下方式嵌入HTML:

  • 编码:我不知道它是否完全安全。我不得不再次解码它。

  • 使用CDATA部分:如果内容包含结束标记“]]>”我仍然会遇到问题“我相信,还有某些十六进制字符。另一方面,XML解析器将为我透明地提取信息。

我应该选择哪个选项?

更新:xml将在java中创建,并作为字符串传递给.net Web服务,它将被解析回来。因此,我需要能够将xml导出为字符串并使用“doc.LoadXml(xmlString);”

加载它

11 个答案:

答案 0 :(得分:30)

这两个选项几乎完全相同。以下是您的两个选择:

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

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

在这两种情况下,您都必须检查字符串是否要转义特殊字符。很多人假装CDATA字符串不需要任何转义,但正如你所指出的,你必须确保“]]&gt;”没有滑倒。

在这两种情况下,XML处理器都会将您的字符串返回给您解码。

答案 1 :(得分:12)

CDATA更容易通过眼睛阅读,而编码内容可以安全地结束CDATA标记 - 但您不必关心。只需使用XML库并不再担心它。然后你要说的是“将这个文本放在这个元素中”,库将对其进行编码或将其包装在CDATA标记中。

答案 2 :(得分:7)

CDATA为简单起见。

答案 3 :(得分: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之类的变量中进行解码,然后获取item(1)标记的第二次出现(content)的nodeValue

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

或(两种符号都相同)

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

答案 4 :(得分:1)

我不知道你正在使用什么XML构建器,但PHP(实际上是libxml)知道如何在CDATA部分中处理]]>,所以每个其他XML框架都应该如此。所以,我会使用CDATA部分。

答案 5 :(得分:1)

将CD包装在CDATA中是有意义的。 HTML文本可能构成XML中的单个值。

因此,不将其包装在CDATA中将导致所有xml解析器将其作为XML文档的一部分进行读取。虽然在使用xml时很容易避免这个问题,为什么会有额外的头痛?

如果您想将HTML实际解析为DOM,那么最好阅读HTML文本,并设置解析器以单独阅读测试。

希望按照我的意图出现。

答案 6 :(得分:1)

就个人而言,我讨厌CDATA段,所以我会使用编码。当然,如果您将XML添加到XML到XML,那么这将导致编码而不是编码,从而导致一些非常难以理解的结果。 为什么我讨厌CDATA细分?我希望我知道。个人偏好,主要是。我只是不喜欢习惯在特殊片段中添加“禁用字符”,在这些片段中会突然再次允许它们。当我在CDATA段中看到XML标记并且它不是围绕它的XML的一部分时,它只会让我感到困惑。至少在编码时我会看到它是编码的。

良好的XML库将透明地处理编码和CDATA段。这只是我的眼睛受伤了。

答案 7 :(得分:0)

编码它将正常工作并且可靠。您可以毫无困难地编码编码的部分等。

解码将由用于处理编码HTML的任何XML解析器自动完成。

答案 8 :(得分:0)

我认为答案取决于您打算如何处理html内容,以及您计划支持哪种类型的html内容。

特别是当涉及到包含javascript时,编码通常会导致问题。 CDATA绝对可以帮到你。

如果你打算只使用小片段(即段落)并有办法预处理/过滤它(因为oyu不想要javascript或花哨的东西),你可能会更好的编码或实际上只是放它直接作为xml中的子树。然后,您还可以对html进行后期处理(即过滤器样式或onclick属性)。但这绝对是更多的工作。

答案 9 :(得分:0)

您可以同时使用两者的组合。 例如:您希望在xml节点中传递<h1>....</h1>,您已使用CDATA部分传递它。 <h1>...</h1>中的内容必须编码为html实体,例如&lt;<。 标签之间的编码将解决问题]]&gt;在转换为]]&gt;并且html标记不包含]]>时进行互操作。

只有在您自己生成html时才能执行此操作。

答案 10 :(得分:0)

如果您的HTML格式正确,那么只需嵌入HTML标记,而无需转义或包装CDTATA。如果可能的话,将内容保存在XML中会有所帮助。它为您转换和操作文档提供了更大的灵活性。

您可以为HTML设置命名空间,以便您可以将HTML标记与包装它的其他XML消除歧义。

转义文本意味着整个HTML块将是一个大文本节点。在CDATA中包装告诉XML解析器不要解析该部分。它可能“更容易”,但限制你的能力下调,只应在适当的时候使用;不只是因为它更方便。 Escaped markup is considered harmful.