在我的xml组成的元素中,我有元素让我们称之为'X',它可以包含许多不同类型的内部元素。因此,我想定义DTD解析器,以避免在其XMl验证期间解析其内容。
我试图通过以下方式定义这个元素:
<!ELEMENT X ANY>
并得到错误消息,'X'内的内部元素未定义
当试图将其定义为:
<!ELEMENT X (#PCDATA)>
我收到错误消息'只有文字允许在'X''
我应该如何定义X以便DTD验证器忽略元素'X'的内容?
答案 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”的元素,它是引起这种差异的括号。