2009-08-26 33 views
9

dado este esquema XML (fragmento):¿El elemento de esquema de secuencia garantiza el orden de los elementos secundarios?

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

En este fragmento xml:

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

puede el <cadena> </cadena > elementos se producen en cualquier orden? Por lo tanto, son estos dos fragmentos de XML semánticamente equvalent:

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

o es el elemento de la secuencia en el esquema significa que la cadena < > </cadena > elementos tienen que ocurrir en el mismo orden que ser semánticamente equivalentes?

¿La presencia del en el esquema requiere que el analizador/deserializador mantenga los elementos en el orden en que existen en el texto xml? Si lo entiendo correctamente, normalmente (es decir, sin un esquema) no hay ningún requisito para hacerlo (incluso si la mayoría de los analizadores usualmente lo hacen).

Respuesta

7

El elemento Secuencia significa que los elementos individuales (no los elementos de la matriz) deben mantener el orden.

Por ejemplo

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

En este ejemplo, Chupete aparece después de GetIEnumerableResult en la secuencia, y para validarlo siempre debe aparecer en este orden en este tipo complejo.

El orden de los elementos "repetitivos" en el tipo complejo "ArrayOfString" no es aplicable en el esquema, y ​​dado que las matrices no implican o imponen ningún orden explícito, la semántica del orden tampoco está garantizada en el CLR.

Una forma de garantizar el pedido sería imponer el orden en la colección serializando un índice.

+1

Excelente respuesta, y la serialización de un índice es de hecho la solución original que utilicé. Creé una clase "OrderedList " que era esencialmente un diccionario de donde el int era el índice. Aparentemente esa fue la respuesta correcta. – Mark

1

Realmente depende del contexto. En la forma más pura de XML, los fragmentos que ha proporcionado son semánticamente equivalentes independientemente del orden. Pero cuando (de) serializa cosas con XML, puede haber un significado asociado con el orden de los elementos.

En este caso, los documentos XML son semánticamente equivalentes si y solo si las matrices resultantes son semánticamente equivalentes.

+2

Correcto, esa es la pregunta. ¿La presencia del en el esquema requiere que el analizador/deserializador mantenga los elementos en el orden en que existen en el texto xml? Si lo entiendo correctamente, normalmente (es decir, sin un esquema) no hay ningún requisito para hacerlo (incluso si la mayoría de los analizadores usualmente lo hacen). – Mark

+0

Según tengo entendido, el esquema no tiene ninguna relación con la lectura de los elementos. Más bien es solo un método para saber si un documento es válido o no mientras lo lee. – Welbog

2

Los elementos de cadena pueden aparecer en cualquier orden, ya que para el esquema son todos iguales

Cuestiones relacionadas