【问题标题】:skipping ]]> in a CDATA section of xml version 1.1在 xml 版本 1.1 的 CDATA 部分中跳过 ]]>
【发布时间】:2012-07-27 05:04:24
【问题描述】:

我正在使用 CDATA 部分,但文本包含一些字符,因此它正在关闭并且我正在解析异常。

<xyz><![CDATA[\..\..\\..\..\\..\..\\..\..\\..\..\\\boot.ini]]>&#0;</xyz>

我从某个网站找到了以下代码:

// Add a CDATA section to the root element
Element element = doc.getDocumentElement();
CDATASection cdata = doc.createCDATASection("data");
element.appendChild(cdata);

// If "]]>" appears in the text, two CDATA sections will be written out
cdata = doc.createCDATASection("more]]>data");
element.appendChild(cdata);

使用上述逻辑的问题是我不知道我从 DB 读取的哪个元素将包含“]]>”,因此我可以编写两个 CDATA 部分。

在这方面需要你的帮助。

【问题讨论】:

  • 嗯。示例中的错误似乎是节后的 0-char,而不是节本身。

标签: java xml parsing xml-parsing cdata


【解决方案1】:

一个非常常见的错误是,您可以简单地通过在开头添加 &lt;![CDATA[ 并在末尾添加 ]]&gt; 来将任意文本放入 CDATA 部分。您需要先检查数据是否包含]]&gt;。如果是这样,通常的补救措施是在第一个 ']' 之后将其拆分,因此如果内容是 A]]&gt;B,则将其写为 &lt;![CDATA[A]]]&gt;&lt;![CDATA[]&gt;B]]&gt;

避免此问题的一个好方法是避免“手动”序列化 XML,而是使用序列化库来完成这项工作。

【讨论】:

    【解决方案2】:

    使用 CDATA 部分转义任意文本很容易出错,因为它们不能嵌套。

    改用entity references 转义文本。

    但是,如果您真的想使用 CDATA 部分,维基百科页面的 this section 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2014-03-02
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多