针对DTD的XML验证

时间:2012-08-26 03:51:21

标签: xml dtd xml-validation xml-dtd

我有这个XML以及嵌入式DTD:

<?xml version="1.0" ?>
<!DOCTYPE customers [
<!ELEMENT customers (name,age,roll,sex)>
<!ELEMENT name (#CDATA)>
<!ELEMENT age (#CDATA)>
<!ELEMENT roll (#CDATA)>
<!ELEMENT sex (#CDATA)>
]>
<customers>
<name>XYZ</name>
<age>19</age>
<roll>23</roll>
<sex>M</sex>
</customers>

当我尝试验证XML时,它向我显示错误。但是,如果我将#CDATA更改为#PCDATA,则验证成功。

问题1)我没有正确解释为什么会发生这种情况。两者之间的唯一区别是:#CDATA不会解析,而#PCDATA将解析。在这种情况下。验证应该成功吗?请解释我错在哪里,因为此验证的输出违背了我的概念。

此致

2 个答案:

答案 0 :(得分:3)

在XML DTD中没有#CDATA可用的东西。这是一个未知的关键字。这就是你收到错误的原因。

CDATA是在DTD中声明属性时使用的关键字。您不能将元素声明为CDATA(或#CDATA)类型。

在CDATA部分(CDATA)中也可以找到字符串<![CDATA[ ... ]]>,它们完全不同。它们可以在XML文档中使用,以转义否则将被解释为标记的字符(例如&)。 CDATA部分未在DTD中声明;它们只在需要时使用。

如果您有<name>L&T</name>等标记(未包含在CDATA部分中),则解析器将拒绝该标记。如何在DTD中声明name元素无关紧要。

答案 1 :(得分:1)

CDATA部分以<![CDATA[开头,以]]><sex><![CDATA[M]]></sex>结尾。 这包括您的XML解析器应该跳过而无需解释的任何内容:重要的换行符,特殊字符,文本字符串角色中的XML标记。唯一不能直接包含的是]]>

PCDATA 解析 CDATA,与通常的纯文本相对应。

所以PCDATA就是你真正需要的。