Гарантирует ли элемент схемы последовательности порядок дочерних элементов? - PullRequest
9 голосов
/ 26 августа 2009

Учитывая эту 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? Если я правильно понимаю, обычно (то есть без схемы) нет необходимости делать это (даже если большинство синтаксических анализаторов обычно это делают).

Ответы [ 3 ]

7 голосов
/ 26 августа 2009

Элемент 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.

Один из способов гарантировать порядок - навести порядок в коллекции путем сериализации индекса.

2 голосов
/ 26 августа 2009

Строковые элементы могут встречаться в любом порядке - поскольку для схемы они все одинаковые

1 голос
/ 26 августа 2009

Это действительно зависит от контекста. В чистом виде XML предоставленные вами фрагменты семантически эквивалентны независимо от порядка. Но когда вы (де) сериализуете вещи с помощью XML, может быть смысл, связанный с порядком элементов.

В этом случае документы XML семантически эквивалентны тогда и только тогда, когда результирующие массивы семантически эквивалентны.

...