【问题标题】:Does the sequence schema element guarantee order of child elements?序列模式元素是否保证子元素的顺序?
【发布时间】:2010-11-23 02:36:07
【问题描述】:

鉴于此 xml 架构(片段):

<xs:element name="GetIEnumerableResponse">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" name="GetIEnumerableResult" nillable="true" xmlns:q4="http://schemas.microsoft.com/2003/10/Serialization/Arrays" type="q4:ArrayOfstring" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

在这个 xml 片段中:

<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <string>string1</string>
  <string>string2</string>
  <string>string3</string>
</ArrayOfstring>

元素可以按任何顺序出现吗?因此,这两个 XML 片段在语义上是否等效:

<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <string>string1</string>
  <string>string2</string>
  <string>string3</string>
</ArrayOfstring>

<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <string>string3</string>
  <string>string2</string>
  <string>string1</string>
</ArrayOfstring>

或者模式中的序列元素是否意味着 元素必须以相同的顺序出现才能在语义上等效?

模式中的存在是否要求解析器/反序列化器保持元素在 xml 文本中存在的顺序?如果我理解正确,通常(即没有模式)不需要这样做(即使大多数解析器通常都这样做)。

【问题讨论】:

    标签: xml schema xsd


    【解决方案1】:

    序列元素意味着单个元素(不是数组中的元素)应该保持顺序。

    例如

    <xs:element name="GetIEnumerableResponse">
      <xs:complexType>
        <xs:sequence>
          <xs:element minOccurs="0" name="GetIEnumerableResult" nillable="true" xmlns:q4="http://schemas.microsoft.com/2003/10/Serialization/Arrays" type="q4:ArrayOfstring" />
          <xs:element name="Dummy" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>    
    

    在此示例中,Dummy 出现在序列中 GetIEnumerableResult 之后,并且为了验证它应该始终按此顺序出现在此复杂类型中。

    “ArrayOfString”复杂类型中“重复”项的顺序在架构中是不可强制执行的,并且由于数组不暗示或强制执行任何显式顺序,因此 CLR 中也不保证顺序的语义。

    保证顺序的一种方法是通过序列化索引来对集合施加顺序。

    【讨论】:

    • 优秀的答案,序列化索引确实是我使用的原始解决方案。我创建了一个“OrderedList”类,它本质上是一个 的字典,其中 int 是索引。显然这是正确的答案。
    【解决方案2】:

    字符串元素可以以任何顺序出现 - 因为对于架构来说它们都是相同的

    【讨论】:

      【解决方案3】:

      这真的取决于上下文。在 XML 最纯粹的形式中,您提供的 sn-ps 在语义上是等效的,无论顺序如何。但是,当您使用 XML (反)序列化事物时,可能会与元素的顺序相关联。

      在这种情况下,XML 文档在语义上是等价的当且仅当结果数组在语义上是等价的。

      【讨论】:

      • 对,就是这个问题。架构中 的存在是否要求解析器/反序列化器保持元素在 xml 文本中存在的顺序?如果我理解正确,通常(即没有模式)不需要这样做(即使大多数解析器通常都这样做)。
      • 据我了解,架构与元素的读取方式无关。相反,它只是一种在阅读文档时了解文档是否有效的方法。
      猜你喜欢
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多