在我的xml组成的元素中,我有元素让我们称之为'X',它可以包含许多不同类型的内部元素.因此,我想定义DTD解析器,以避免在其XMl验证期间解析其内容.
我试图通过以下方式定义这个elemtn:
<!ELEMENT X ANY>
并且得到错误消息,即'X'中的内部元素未定义,并且在尝试将其定义为:
<!ELEMENT X (#PCDATA)>
我收到错误消息'只允许在'X'内允许文本'
我应该如何定义X以便DTD验证器忽略元素'X'的内容?
互联网上的一些指南声称这ANY意味着关闭此元素的验证过程,但这不是正确的信息.ANYDTD中的内容模型实际上并不意味着"允许在此元素中生成任何格式良好的XML内容".相反,它意味着"允许在此DTD中定义的任何内容".这意味着您将为未定义(或无法定义)的内容模型的每个元素收到错误.从概念上讲,这意味着无法允许来自另一个命名空间的内容.
不幸的是,目前我不记得任何使用DTD的方法.但是,使用XML Schema可以实现这一点:
<xs:complexType>
<xs:sequence>
<xs:any namespace="##any" processContents="skip"/>
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
这将允许来自任何命名空间的任何元素并跳过此元素的验证.如果您能够从DTD切换到XML Schema,这将解决您的问题.
使用时注意一个简单的错误ANY
(原始海报没有这个错误,但我只是在这里提到它,因为我已经在写这个主题.)
这是一个简单的拼写错误,但这两个并不意味着相同:
<!ELEMENT X ANY >
<!ELEMENT X (ANY) >
Run Code Online (Sandbox Code Playgroud)
第一个引用内容模型关键字ANY,第二个引用名称为"ANY"的元素,它是引起这种差异的括号.