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

时间:2009-08-26 17:31:23

标签: 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>

在这个xml片段中:

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

可以&lt; string&gt;&lt; / string&gt;元素以任何顺序出现?因此,这两个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>

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

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

3 个答案:

答案 0 :(得分: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>    

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

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

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

答案 1 :(得分:2)

字符串元素可以按任何顺序出现 - 因为对于模式它们都是相同的

答案 2 :(得分:1)

这实际上取决于背景。在XML最纯粹的形式中,无论顺序如何,您提供的片段在语义上都是等效的。但是,当您(使用XML)对事物进行序列化时,可能会有与元素顺序相关的含义。

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