鉴于此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文本中存在的顺序保留元素?如果我理解正确,通常(即没有架构)没有要求这样做(即使大多数解析器通常都这样做)。
答案 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文档在语义上是等效的。