代码之家  ›  专栏  ›  技术社区  ›  Mark

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

  •  9
  • Mark  · 技术社区  · 16 年前

    给定此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>
    

    <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>
    

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

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

    3 回复  |  直到 16 年前
        1
  •  7
  •   Blue Toque    16 年前

    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”复杂类型中的“repeating”项的顺序在架构中不可强制执行,并且由于数组不暗示或强制任何显式顺序,因此在clr中也不保证顺序的语义。

    保证顺序的一种方法是通过序列化索引对集合强制执行顺序。

        2
  •  2
  •   sylvanaar    16 年前

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

        3
  •  1
  •   Welbog    16 年前

    这真的取决于上下文。在XML最纯粹的形式中,无论顺序如何,您提供的代码片段在语义上都是等价的。但是,当您使用XML对事物进行(去)序列化时,可能存在与元素顺序相关联的含义。

    在这种情况下,只有当结果数组在语义上等价时,XML文档才在语义上等价。