2009-08-26 71 views
9

鉴于这种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文本中存在的顺序?如果我理解正确,通常(即没有模式)不需要这样做(即使大多数解析器通常都这样做)。

回答

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>  

在此示例中,虚拟GetIEnumerableResult后出现的序列中,并验证它应该永远出现在此复杂类型的顺序。

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

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

+1

优秀的答案,序列化索引确实是我使用的原始解决方案。我创建了一个“OrderedList ”类,该类基本上是一个字典,其中int是索引。显然这是正确的答案。 – Mark 2009-08-26 18:13:05

1

这真的取决于上下文。在XML最纯粹的形式中,无论顺序如何,您提供的片段在语义上都是等效的。但是,当你用XML来序列化事物时,可能会有与元素顺序相关的含义。

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

+2

对,这是问题。模式中的存在是否需要解析器/反序列化器将元素保存为xml文本中存在的顺序?如果我理解正确,通常(即没有模式)不需要这样做(即使大多数解析器通常都这样做)。 – Mark 2009-08-26 17:37:45

+0

据我所知,模式对元素的读取没有任何影响。相反,它只是一种在阅读文档时了解文档是否有效的方法。 – Welbog 2009-08-26 17:41:44

2

字符串元素可以以任何顺序出现 - 因为对他们的模式都是一样的

相关问题