我可以编写一个所有XML对它有效的模式吗?

时间:2010-06-15 09:02:42

标签: xsd

我需要编写一个所有xml实例对它都有效的模式。 我试过了:

      <xs:element name="Arguments">
    <xs:complexType>
      <xs:sequence>
         <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
      </xs:sequence>
    </xs:complexType>

但它强制执行名为Arguments的根元素。 root有没有办法成为Any?

2 个答案:

答案 0 :(得分:0)

好问题,虽然我不确定是否可以做到。使用xs:any的方法很好,但我不确定它是否可以应用于整个XML(即根),而只适用于它的一部分。

引用我曾经阅读过的一本书(有些人的目的是“为什么?”人们会问): [...]在编写XSLT等语言的模式时非常有用,这些语言通常包括来自的标记当你刚刚开始设计文档结构并且你还没有清楚地了解所有东西是如何组合在一起时,在编写模式时未知的多个词汇表[...] XML in a nutshell

我也很想知道是否可以做到这一点或者最佳解决方法是什么。

答案 1 :(得分:0)

架构的整个目的是为了约束有效文档的潜在空间。要么你正在做一整个文件,要么你正在做一个片段。如果您正在编写整个文档,那么正确的方法是完全省略该模式。真。你根本没有任何约束(除了格式良好),因此除了作为XML文档之外,不能对文档应用任何解释。

虽然你有一个片段的情况更有用。这样做的最佳方法是使用包含不受控制的片段的外部元素(您控制其名称)。当你这样做时,你需要说内容是一系列零到无限数量的任意元素,这就是你已经完成的。如果它真的是任何,你也可以考虑允许混合内容(当然,如果你不需要它,不要这样做,但是如果你愿意处理像XHTML那样的东西)然后这就是你所需要的内容)并允许包含元素的任意属性(参见<xsd:anyAttribute>)。通常一个好主意是指定任意元素可以来自哪个命名空间的约束(##other是最有用的,因为它会阻止模式中不受控制的递归)。

所以,除了检查你是否有正确的细节,你可能最好试图处理任何事情。只需确保您的容器元素是根据您的实际目的定义的。