我有这个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将解析。在这种情况下。验证应该成功吗?请解释我错在哪里,因为此验证的输出违背了我的概念。
此致
答案 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就是你真正需要的。