XML 中的 HTML。我应该使用 CDATA 还是编码 HTML [关闭]

Posted

技术标签:

【中文标题】XML 中的 HTML。我应该使用 CDATA 还是编码 HTML [关闭]【英文标题】:Html inside XML. Should I use CDATA or encode the HTML [closed] 【发布时间】:2010-11-26 18:45:20 【问题描述】:

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

对其进行编码:我不知道使用起来是否完全安全。而且我还得重新解码。

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

我应该选择哪个选项?

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

【问题讨论】:

【参考方案1】:

CDATA 为简单起见。

【讨论】:

【参考方案2】:

对其进行编码可以正常工作并且可靠。您可以毫无困难地对编码部分等进行编码。

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

【讨论】:

【参考方案3】:

我认为答案取决于您计划对 html 内容做什么,以及您计划支持哪种类型的 html 内容。

尤其是涉及到包含的 javascript 时,编码通常会导致问题。 CDATA 绝对可以帮助您。

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

【讨论】:

【参考方案4】:

我不知道您使用的是什么 XML 构建器,但 php(实际上是 libxml)知道如何处理 CDATA 部分中的]]>,其他所有 XML 框架也应该如此。所以,我会使用 CDATA 部分。

【讨论】:

【参考方案5】:

您可以将两者结合使用。 例如:您想在 xml 节点中传递 <h1>....</h1>,您必须使用 CDATA 部分来传递它。 <h1>...</h1> 中的内容必须编码为 html 实体,例如<,代表<。 标签之间的编码将解决]]> 在转换为]]> 和html 标签不包含]]> 时被解释的问题。

只有自己生成html才能做到这一点。

【讨论】:

【参考方案6】:

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

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

如果你想真正将 HTML 解析成 DOM,那么最好读取 HTML 文本,并设置一个解析器来单独读取测试。

希望结果能如我所愿。

【讨论】:

【参考方案7】:

CDATA 更​​易于肉眼阅读,而编码内容可以安全地在其中包含 CDATA 结束标记 — 但您不必关心。只需使用 XML 库,就不用担心它了。然后您只需要说“将此文本放入此元素中”,该库将对其进行编码或将其包装在 CDATA 标记中。

【讨论】:

【参考方案8】:

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

好的 XML 库可以透明地处理编码和 CDATA 段。受伤的只是我的眼睛。

【讨论】:

【参考方案9】:

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

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

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

在这两种情况下,您都必须检查您的字符串是否有特殊字符被转义。很多人假装 CDATA 字符串不需要任何转义,但正如您所指出的,您必须确保 "]]>" 不会在未转义的情况下滑入。

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

【讨论】:

我选择不使用 CDATA 的一个原因是,通常大多数数据不需要转义,而且在不需要转义的文本上看到这么多 CDATA 包装器是一团糟.第一种方法意味着你偶尔会有 HTML 编码,但大多数时候你有漂亮干净的文本,没有不必要的包装。当然,根据您的典型数据,这可能会有所不同。【参考方案10】:

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

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

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

【讨论】:

HTML 不一定是有效的 XML(例如,HTML 不需要结束标签)。它们看起来很相似,因为它们共享 SGML 作为它们的共同祖先。唯一的选择实际上是转义数据或使用 cdata。否则 XML 解析器会在发现格式错误的标记时崩溃。【参考方案11】:

如果使用 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 >Rastreado</td><td >Placa</td><td >Data hora</td><td  align="right">Km/h</td><td >Direção</td><td >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 之类的变量中进行解码,然后获取 content 标记的第二次出现(item(1))的节点值

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

或(两个符号是等价的)

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

【讨论】:

以上是关于XML 中的 HTML。我应该使用 CDATA 还是编码 HTML [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 HTML5 中使用 <![CDATA[...]]> 吗?

使用 CDATA 解析 xml 响应的参数中的 html 数据

WSO2 AM 1.9 - 将CDATA保留在有效负载工厂中

XML 中的 <![CDATA[]]> 是啥意思?

XML 中的 <![CDATA[]]> 是啥意思?

使用 xsl 时 CDATA 未包含在我的 XML 中