¿Diferencia entre <xsd: all> y <xsd: sequence> en la definición del esquema?

81

Estoy usando xsd:allen un tipo complejo. Cuando pierdo algún elemento obligatorio al validarlo, se mostrarán todos los elementos. No mostrará el elemento perdido exacto.

Pero si estoy en uso xsd:sequence, puedo obtener el elemento perdido exacto.

¿Hay alguna diferencia entre estos dos?

xsd:sequence: El elemento XML debe estar en el mismo orden.

Pero xsd:all: el elemento XML puede ser de cualquier orden.

user1679378
fuente
Básicamente, la diferencia entre estos dos es lo que ya indicó en su pregunta. Sin embargo, las restricciones asociadas con el uso de estos dos compositores y las implicaciones de los de la creación XSD dependen de la especificación a la que se esté refiriendo: ¿XSD 1.0 o XSD 1.1?
Petru Gardea
3
Parece que nuestra pregunta es acerca de por qué la secuencia y todos escriben errores de manera diferente cuando encuentran un elemento faltante. Creo que se trata de la lógica del analizador sintáctico
Nasir
¿Existe ya una respuesta a esta pregunta? También me gustaría saber si siempre tengo que usar <sequence> para obtener el objeto perdido exacto.
GertV
1
Obtiene respuestas insatisfactorias porque su título es engañoso: Las respuestas responden correctamente a la pregunta en el título, sobre el significado de "todos" frente a "secuencia". Según sus comentarios, parece que su problema real es una diferencia en la forma en que su validador informa los errores de validación para los dos. Esto no es lo mismo y, en cualquier caso, es imposible responder sin saber qué validador está utilizando.
Joachim Lous

Respuestas:

134

<xsd:all> especifica que los elementos secundarios pueden aparecer en cualquier orden.

<xsd:sequence> especifica que los elementos secundarios solo pueden aparecer en el orden mencionado.

Ejemplo de secuencia:

<xs:element name="compElement">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ele1" type="xs:string"/>
      <xs:element name="ele2" type="xs:string"/>
      <xs:element name="ele3" type="xs:string"/>
      <xs:element name="ele4" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Si crea un XML a partir de este xsd, se verá así:

<compElement>
  <ele1>First</ele1>
  <ele2>Second</ele2>
  <ele3>Third</ele3>
  <ele4>Fourth</ele4>
</compElement>

Ejemplo para todos:

<xs:element name="compElement">
  <xs:complexType>
    <xs:all>
      <xs:element name="ele1" type="xs:string"/>
      <xs:element name="ele2" type="xs:string"/>
      <xs:element name="ele3" type="xs:string"/>
      <xs:element name="ele4" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

Si crea un archivo XML a partir de este xsd, entonces podría verse así:

<compElement>
  <ele2>Second</ele2>
  <ele1>First</ele1>
  <ele4>Fourth</ele4>
  <ele3>Third</ele3>
</compElement>

Más información sobre xsd: all
Más información sobre xsd: sequence

Espero haber respondido a tu pregunta.

Madhusudan Joshi
fuente
Hola Joshi ... Gracias por tus comentarios. Pero mi pregunta es cuando valido el xml contra xsd mientras uso xsd: todo no mostrará el elemento perdido exacto. Por ejemplo, se esperaba el elemento 1 .. En cambio, mostrará todos los elementos elemento1, elemento2, element3, ESPERADO pero di minOccurs = 0 para element2 y element3
user1679378
2
Puede especificar el atributo "minOccurs" del elemento "all" como cero. Para obtener más detalles, consulte w3schools.com/schema/el_all.asp
Madhusudan Joshi
22

Diferencia:

  • xsd: all - "los elementos secundarios pueden aparecer en cualquier orden y cada elemento secundario puede aparecer cero o una vez" (es decir, maxOccurs puede ser 0 o 1)
  • xsd: sequence - "los elementos secundarios deben aparecer en una secuencia. Cada elemento secundario puede ocurrir desde 0 hasta cualquier número de veces" (es decir, maxOccurs puede ser 0 o cualquier número o 'ilimitado')

De los tutoriales de W3Schools aquí y aquí .

Kamituel
fuente
4
Debe calificar las restricciones sobre la cardinalidad de la partícula como específicas de XSD 1.0; de lo contrario, esto es incorrecto para XSD 1.1.
Petru Gardea
8
w3schools no está afiliado al W3C, por lo que sus páginas web no son documentos del W3C.
Ben Companjen
@kamituel ¿Puedes citar dónde <xs:all>limita el número de veces que puede ocurrir un elemento hijo? No puedo encontrar evidencia de esto en la especificación W3C.
Luke Puplett
2
@kamituel En realidad, eso se aplica al elemento all dentro de su contenedor en el esquema. El documento que cita es 1.1 que no tiene la restricción. De todos modos, encontré la restricción, está en "inglés humano" tal como pegaste en tu respuesta, unas líneas arriba en el documento 1.0.
Luke Puplett
1
"El elemento hijo puede ocurrir una sola vez o cero" ¡es realmente incorrecto! El valor predeterminado es 1 para minOccurs, lo que significa que DEBE estar presente, y esto se aplica tanto a todos como a la secuencia.
PKCS12
2

Todo indicador

El <all>indicador especifica que los elementos secundarios pueden aparecer en cualquier orden y que cada elemento secundario debe aparecer solo una vez:

Indicador de secuencia

El <sequence>indicador especifica que los elementos secundarios deben aparecer en un orden específico:

Link de referencia

NPKR
fuente
2
Debe calificar las restricciones sobre la cardinalidad de la partícula como específicas de XSD 1.0; de lo contrario, esto es incorrecto para XSD 1.1.
Petru Gardea
2

El esquema simplemente define lo que constituye un documento compatible.

La forma en que se informa el incumplimiento depende totalmente del validador. No hay nada que impida que un validador informe exactamente qué campos faltan, pero aparentemente el que usa no lo hace en este caso.

Si se trata de un error o por diseño, debería discutirlo con el proveedor del validador.

Joachim Lous
fuente
¿Cómo responde eso a la pregunta?
Sebastian Hofmann
2
La pregunta parece preguntar sobre la diferencia entre secuencia y todo, pero una lectura más completa revela que el autor ya lo sabe, pero está desconcertado por la salida de su validador. Así es como.
Joachim Lous
2

EJEMPLO XML SIMPLE:

<school>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</school>

XSD DEL XML ARRIBA (Explicado):

<xs:element name="school">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Aquí:

xs: element : define un elemento.

xs: all : indica que los elementos secundarios pueden aparecer en cualquier orden.

xs: sequence : indica que los elementos secundarios solo aparecen en el orden mencionado.

xs: complexType : indica que contiene otros elementos.

xs: simpleType : indica que no contienen otros elementos.

tipo: cadena, decimal, entero, booleano, fecha, hora,

  • En palabras simples , xsd es otra forma de representar y validar datos XML con el tipo específico.
  • Con la ayuda de atributos adicionales, podemos realizar múltiples operaciones.

  • Realizar cualquier tarea en xsd es más simple que xml.

shubham1js
fuente
0

cuando usamos bajo etiqueta, indica que todos los elementos que están declarados en ese complexType DEBEN aparecer en el mismo orden en el documento XML. de lo contrario, obtendrá un error. porque no es necesario especificar los elementos en el orden adecuado.

usuario3423648
fuente