39

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

  • 对其进行编码:我不知道使用起来是否完全安全。我将不得不再次对其进行解码。

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

我应该选择哪个选项?

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

4

11 回答 11

39

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

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

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

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

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

于 2009-09-09T10:59:41.800 回答
12

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

于 2009-09-09T10:15:04.167 回答
7

CDATA 为简单起见。

于 2009-09-09T09:37:56.973 回答
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))的nodeValuecontent

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

或(两种表示法等价)

xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
于 2013-12-06T16:26:59.417 回答
1

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

于 2009-09-09T09:44:13.273 回答
1

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

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

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

希望结果能如我所愿。

于 2009-09-09T10:04:17.767 回答
1

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

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

于 2009-09-09T10:56:37.623 回答
0

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

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

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

于 2009-09-09T11:09:01.200 回答
0

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

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

于 2009-09-09T09:38:44.027 回答
0

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

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

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

于 2009-09-09T09:44:09.350 回答
0

您可以使用两者的组合。例如:你想传入<h1>....</h1>xml 节点,你已经使用 CDATA 部分来传递它。里面的内容<h1>...</h1>必须编码为 html 实体,例如&lt;for <。标签之间的编码将解决 ]]> 在转换为时被解释的问题,]]&gt;并且 html 标签不包含]]>.

仅当您自己生成 html 时才能执行此操作。

于 2009-09-09T09:59:07.200 回答