序列模式元素是否保证子元素的顺序?

Mar*_*ark 9 xml schema xsd

给定这个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>
Run Code Online (Sandbox Code Playgroud)

在这个xml片段中:

<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <string>string1</string>
  <string>string2</string>
  <string>string3</string>
</ArrayOfstring>
Run Code Online (Sandbox Code Playgroud)

<string> </ string>元素可以按任何顺序出现吗?因此,这两个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>
Run Code Online (Sandbox Code Playgroud)

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

架构中是否存在要求解析器/反序列化器按照它们在xml文本中存在的顺序来保留元素吗?如果我理解正确,通常(即没有架构)没有要求这样做(即使大多数解析器通常这样做).

Blu*_*que 7

Sequence元素意味着各个元素(不是数组中的元素)应该保留顺序.

例如

<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>    
Run Code Online (Sandbox Code Playgroud)

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

"ArrayOfString"复杂类型中"重复"项的顺序在模式中是不可执行的,并且因为数组不暗示或强制执行任何显式顺序,所以CLR中的语义也不能保证.

保证订单的一种方法是通过序列化索引对集合强加订单.