替代CDATA

时间:2012-05-18 21:34:38

标签: xml xsd dtd cdata

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

需要实际的CDATA语法来指示CDATA部分,因为它意图支持将被解释为XML的字符。完整的语法是为了消除内容和标签内容的模糊性。

答案 1 :(得分:1)

  

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

否...... DTD或Schema对您的问题毫无帮助。

  

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

嗯......当然,解析文档的XML解析器知道该部分是否是CDATA部分。这也通过区分interface CDATASectioninterface Text在DOM中表示。因此,编写XML解析器的人很容易强制使用CDATA部分而不仅仅是纯文本部分。在99.9%的情况下,这是非常愚蠢的,你不应该检查。但另一方面,我在生活中看到了许多愚蠢的事情,如果你的内部框架能够做到并强制执行CDATA部分的存在,我一点也不会感到惊讶。

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

答案 2 :(得分:1)

  

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

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

CDATA

<![CDATA[ your data ]]>

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

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

当文档被解析时,其内容(即带有标记的文本)也会被解析。两个内容

  

&安培;内容a

  

&LT;内容b&lt;

由于字符“&amp;”,

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

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

这是一个明确的编码问题,而不是解析问题。