有没有办法强制/保留 XML 模式中 XML 元素的顺序?

问题描述 投票:0回答:5
xml xsd
5个回答
9
投票

根据 XML 世界中的重要人物 Michael Kay 的说法,顺序是保留的。

是的,您可以假设元素的顺序将被保留。 XML 规范的作者没有明确指出这一点,但那是因为他们认为这是显而易见的。不保留顺序的解析器可能在技术上是一致的,但没有人会使用它;很多很多 XML 应用程序都依赖于保留顺序,尤其是那些使用 XML 表示文档的应用程序。

来源:http://lists.xml.org/archives/xml-dev/201003/msg00045.html


4
投票

正如上面评论中提到的,

xs:sequence
定义一个 ORDERED 集合。证据如下:

<xsd:complexType name="USAddress">
   <xsd:sequence>
    <xsd:element name="name"   type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="city"   type="xsd:string"/>
    <xsd:element name="state"  type="xsd:string"/>
    <xsd:element name="zip"    type="xsd:decimal"/>
   </xsd:sequence>
   <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
</xsd:complexType>

...这些元素必须称为 name、street、city、state 和 zip,由声明的 name 属性的值指定,并且这些元素必须按照声明的顺序(顺序)出现

来源W3C:XML 架构第 0 部分


2
投票

我知道这已经很老了,但尽管如此,我也在寻找一种方法来保证 XML 元素的保留顺序。

虽然当前所有解析器可能会保留顺序,但 XML 定义决不需要这样做,并且未来的解析器可能会完全不同地处理顺序。

目前存在的最佳解决方案似乎是为元素赋予“id”属性,以便在解析后可以在代码中验证顺序。

当 XML 文件中的顺序已经很明显时,我讨厌必须要求我的用户添加任意 id="1"、id="2" 等,但据我所知,XML 中没有官方标准用于要求重复元素的特定顺序。

更新

如果您使用 .NET,它有一个属性,您可以设置它来定义读取这些元素的顺序。因此,我想只要您知道您的 XML 将在哪里进行解析,并且解析器支持强制执行元素按照您要求的方式订购,然后订单就可以执行。

但是,如果第三方使用他们自己的解析器获取并尝试复制您的结果,则可能会发生混乱,因为该顺序是在其他地方配置的,而不是在 XML 中,因此没有其他解析器实现知道如何利用该顺序。

因此,这一切都可以总结为:(a) 顺序不能在 XML 规范本身内强制执行,但是 (b) 顺序可以并且经常由大量 XML 解析器强制执行。


1
投票

元素的顺序(与属性不同)在 XML 中很重要,我知道的每个解析器都会保留它。


0
投票

根据链接

当订单很重要时: “当您使用 xs:sequence 指标时,您是在说元素的顺序很重要,并且它应该遵循指定的顺序。”

当订单不重要时: “当您使用 xs:all 指示器时,您是在说元素的顺序并不重要。”

© www.soinside.com 2019 - 2024. All rights reserved.