【问题标题】:xml dtd- how to avoid parsing the content of an element?xml dtd-如何避免解析元素的内容?
【发布时间】:2011-04-05 10:26:54
【问题描述】:

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

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

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

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

    不幸的是,目前我想不起使用 DTD 的任何方法。但是,这可以通过 XML 模式实现:

    <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”的元素,正是括号导致了这种差异。

    【讨论】:

    • 所以你的答案是DTD没有解决方案。不能有任何解决方法吗?
    • @Spiderman 我的回答是“目前我想不起用 DTD 做这件事的任何方法”。有可能的可能性很小,但我不这么认为,我无法提出任何解决方案。 :( 解决方法是使用 DTD 以外的其他方法进行验证,如果不强制使用 DTD。
    • 最终我确实搬到了 XSD 世界并使用了 解决方案。所以谢谢
    • 作为记录 - 不,没有办法用 DTD 做到这一点。 DTD 有效性要求声明所有元素和属性。 ANY 关键字是避免任何进一步约束的便捷方式,但仅此而已。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    相关资源
    最近更新 更多