0

我有一个大型 XML 文件,其中每个节点都需要一个 CDATA 标记。

<root>
    <a>
        <id>my_id</id>
        <tr><![CDATA[This is the data]]></tr>
    </a>
    <b>
        ...
    </b>
</root>

如何避免在每个节点中放置 CDATA?DTDSchema是否为此提供了方法?

此要求的原因来自用于本地化目的的内部框架。所有包含消息的标签都将被 CDATA,因为它们通常包含特殊字符。我编写的 XML 仅用于演示目的,并不代表我处理的实际数据。

4

3 回答 3

1

CDATA与节点的内容有关,而模式信息与文档的结构有关。它们并不是特别相关。

查看您的文档,不需要该CDATA元素存在。它仅用于在内容中有尖括号和其他特殊字符时简化内容的解析/写入。

需要实际的CDATA语法来指示一个CDATA部分,因为它的意图是支持否则会被解释为 XML 的字符。完整的语法可以消除什么是内容和什么是标签的歧义。

于 2012-05-18T21:38:11.757 回答
1

如何避免在每个节点中放置 CDATA?DTD 或 Schema 是否为此提供了方法?

不... DTD 或 Schema 对您的问题没有帮助。

此要求的原因来自内部框架

嗯......当然,解析文档的 XML 解析器知道该部分是否是 CDATA 部分。这也在 DOM 中通过区分接口 CDATASection接口 Text来表示。因此,对于编写 XML 解析器的人来说,强制使用 CDATA 部分而不只是纯文本部分是非常容易的。在 99.9% 的情况下,这完全是愚蠢的,你不应该检查它。但另一方面,我在生活中看到了很多愚蠢的事情,如果您的内部框架这样做并强制 CDATA 部分的存在,我一点也不感到惊讶。

如果是这种情况(试一试),那么您必须编写 CDATA 部分并对此感到满意。如果您对此不满意,您可以编写一个脚本来转换您的 XML 添加这些 CDATA 部分。

于 2012-05-20T19:25:00.220 回答
1

所有包含消息的标签都将被 CDATA,因为它们通常包含特殊字符

如果您的真正目标是在 XML 文档中表示特殊字符,那么问题不在于这些字符的解析,而在于它们的编码

数据中心

<![CDATA[ your data ]]>

主要处理(XML)文档的某些内容不必解析这一事实,否则可能会发现一些错误。例如:

    <a>
            <id>my_id</id>
            <tr>& content a </tr>
            <tr> < content b < </tr>
   </a>

随着文档被解析,它的内容(即带有标签的文本)也被解析。两种内容

& 内容

<内容b <

由于字符“&”和“<”,将被视为解析错误。为了避免它,您不希望解析某些内容。这就是您在标签中声明的原因,以便告诉解析器不要解析它们。

DTD 和 XSD 都是关于为您的 XML 文档定义一个结构,并且没有明确地提供一种对您的字符进行编码的方法(只有 XSD 这样做,而是针对二进制数据元素类型)。它们帮助您定义将使用您的 XML 文档的元素类型(String、Int、Double 等),但将编码问题留给您。

这显然是一个编码问题,而不是解析问题。

于 2012-05-20T21:24:52.820 回答