xml dtd-如何避免解析元素的内容?

时间:2010-08-29 14:09:50

标签: xml dtd

在我的xml组成的元素中,我有元素让我们称之为'X',它可以包含许多不同类型的内部元素。因此,我想定义DTD解析器,以避免在其XMl验证期间解析其内容。
我试图通过以下方式定义这个元素:
<!ELEMENT X ANY>
并得到错误消息,'X'内的内部元素未定义 当试图将其定义为:
<!ELEMENT X (#PCDATA)>
我收到错误消息'只有文字允许在'X''

我应该如何定义X以便DTD验证器忽略元素'X'的内容?

1 个答案:

答案 0 :(得分:5)

互联网上的一些指南声称ANY意味着关闭此元素的验证过程,但这不是正确的信息。 DTD中的内容模型ANY实际上并不意味着“允许此元素中任何格式良好的XML内容”。相反,它意味着“允许在此DTD中定义的任何内容”。这意味着您将为未定义(或无法定义)的内容模型的每个元素收到错误。从概念上讲,这意味着无法允许来自另一个名称空间的内容。

不幸的是,目前我不记得用DTD做任何事情。但是,使用XML Schema可以实现这一点:

<xs:complexType>
  <xs:sequence>
    <xs:any namespace="##any" processContents="skip"/>
  </xs:sequence>
</xs:complexType>

这将允许来自任何命名空间的任何元素并跳过此元素的验证。如果您能够从DTD切换到XML Schema,这将解决您的问题。

请注意使用ANY 时出现的简单错误 (原始海报没有这个错误,但我只是在这里提到它,因为我已经在写这个主题了。)
这是一个简单的拼写错误,但这两个并不相同:

<!ELEMENT X  ANY  >
<!ELEMENT X (ANY) >

第一个引用内容模型关键字ANY,但第二个引用名称为“ANY”的元素,它是引起这种差异的括号。