【问题标题】:XML validation against DTD针对 DTD 的 XML 验证
【发布时间】:2012-08-21 02:02:05
【问题描述】:

我有这个 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 会解析。在这种情况下。两个验证都应该成功吧?请解释我哪里错了,因为这个验证的输出违背了我的概念。

问候,

【问题讨论】:

    标签: xml xml-validation dtd


    【解决方案1】:

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

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

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

    如果您有诸如&lt;name&gt;L&amp;T&lt;/name&gt; 之类的标记(未包含在CDATA 部分中),那么它将被解析器拒绝。在 DTD 中如何声明 name 元素并不重要。

    【讨论】:

    • 为什么即使我在DTD中使用#PCDATA作为名称也会被拒绝?
    • 它将被拒绝,因为像&lt;name&gt;L&amp;T&lt;/name&gt; 这样的标记格式不正确。在 DTD 中包含 #PCDATA 并不会改变这一点。
    • 如果我使用单引号 ' 、双引号 " 或大于 > 符号而没有任何 CDATA 部分,那么解析器也会拒绝 XML 吗?
    • &lt;name&gt;L&amp;amp;T &gt; " '&lt;/name&gt; 格式正确。您不必在元素内容中转义 &gt; 字符。真正需要注意的字符是&amp;&lt;。见w3.org/TR/xml/#syntax
    【解决方案2】:

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

    PCDATA 是解析 CDATA,对应普通的纯文本。

    所以 PCDATA 是您真正需要的。

    【讨论】:

    • 请告知我是否正确:如果我使用#PCDATA 并且有一些像 L&T 这样的文本,那么 XML 解析器会将其解析为 L&T name> 但是如果我使用 那么它将保持为 L&T。我对么?或者,我是不是反其道而行之?请告知。
    猜你喜欢
    • 2011-06-14
    • 2011-01-30
    • 2010-11-19
    • 2015-03-04
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2014-04-18
    • 2010-09-06
    相关资源
    最近更新 更多