simple - Validación XML con XSD: ¿cómo evitar preocuparse por la secuencia de los elementos?
xml y xsd (3)
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:all>
</xsd:complexType>
NOTA: he cambiado "secuencia" a "todo"
Orden de las fuerzas de secuencia (como se define). si el orden no importa, entonces todo se usa.
Si hay posibilidades de aparición de elementos más de una vez, se puede usar xsd: any.
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:any minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
Puede encontrar detalles de xsd: any en el siguiente enlace:
Tengo el siguiente código XSD:
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
El problema aquí es: la ubicación de los elementos, multipleChoiceInput, etc. debe aparecer en el mismo orden en que se declaran. No quiero que esto suceda, quiero que, en el proceso de validación, la secuencia no sea relevante. ¿Cómo puedo conseguir esto?
Otra posibilidad que he intentado ha sido:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
En este ejemplo, la secuencia realmente ya no importa, y puedo tener tantos elementos como quiera (lo que "todo" no me permite). Pero todavía tengo el problema con el mínimo y el máximo de Ocurrencias. En este ejemplo, podría tener tantos "pictureInput" como sea posible, lo que es la restricción de que me gustaría tener 0 o 1.
¡Muchas gracias por ayudar!
Llego un poco tarde a esta discusión, pero tuve el mismo problema y encontré la solución:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:choice>
</xsd:complexType>
La clave es combinar xs: choice con maxOccurs = "ilimitado". Si solo usa xs: all, tiene permitido uno de cada, punto.
editado para agregar: Mientras xs: any funcionará, no limitará sus elecciones a los cuatro elementos detallados. Permitirá cualquier cosa, lo que prácticamente frustra el propósito de un esquema.
También es muy tarde para la fiesta aquí, pero ¿usaría <xsd:all>
junto con minOccurs
y maxOccurs
no funcionaría ?:
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>