2009-05-31 10 views
5

Lo que quiero hacer es crear un elemento de secuencia en un esquema XML de modo que los contenidos estén en orden, pero es posible que no estén todos presentes. Por ejemplo, el esquema sería algo como esto:¿Cómo se puede hacer una secuencia de elementos opcionales que deben estar en orden en un esquema XML?

<xs:element name="rods" maxOccurs="1" minOccurs="1"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="green" type="xs:positiveInteger" /> 
    <xs:element name="white" type="xs:positiveInteger" /> 
    <xs:element name="blue" type="xs:positiveInteger" /> 
    <xs:element name="yellow" type="xs:positiveInteger" /> 
    <xs:element name="red" type="xs:positiveInteger" /> 
    <xs:element name="tan" type="xs:positiveInteger" /> 
    <xs:element name="gray" type="xs:positiveInteger" /> 
    <xs:element name="black" type="xs:positiveInteger" /> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

y permitiría XML como esto:

<rods> 
<green>142</green> 
<white>34</white> 
<gray>65</gray> 
</rods> 

MSDN tiene esto que decir al respecto:

El siguiente ejemplo muestra un elemento (zooAnimals) que puede tener cero o más de los siguientes elementos, elefante, oso, jirafa, en el elemento de secuencia.

<xs:element name="zooAnimals"> 
     <xs:complexType> 
      <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
       <xs:element name="elephant"/> 
       <xs:element name="bear"/> 
       <xs:element name="giraffe"/> 
      </xs:sequence> 
     </xs:complexType> 
</xs:element> 

W3Schools sugiere la misma. Sin embargo, tanto Visual Studio como un servicio de validación en línea no les gusta lo que se sugiere.

Aquí es lo que tengo en este momento:

<xs:element name="rods" maxOccurs="1" minOccurs="1"> 
<xs:complexType> 
    <xs:sequence minOccurs="0" maxOccurs="1"> 
    <xs:element name="green" type="xs:positiveInteger" /> 
    <xs:element name="white" type="xs:positiveInteger" /> 
    <xs:element name="blue" type="xs:positiveInteger" /> 
    <xs:element name="yellow" type="xs:positiveInteger" /> 
    <xs:element name="red" type="xs:positiveInteger" /> 
    <xs:element name="tan" type="xs:positiveInteger" /> 
    <xs:element name="gray" type="xs:positiveInteger" /> 
    <xs:element name="black" type="xs:positiveInteger" /> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

Y aquí está el código XML:

<rods> 
<green>142</green> 
<white>34</white> 
<gray>65</gray> 
</rods> 

Visual Studio 2005 afirmaciones de que "gris" no es válido, "azul" se esperaba, por lo que claramente que quiere que todos los niños

Gracias,

Eric

+0

La definición de esquema se ve bien para mí. ¿Desea compartir los resultados/comentarios de Visual Studio y los validadores en línea? –

+0

He agregado los resultados a la publicación – Eric

Respuesta

10
<xs:element name="rods"> 
    <xs:complexType> 
     <xs:sequence> 
       <xs:element minOccurs="0" name="green" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="white" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="blue" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="yellow" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="red" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="tan" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="gray" type="xs:positiveInteger" /> 
       <xs:element minOccurs="0" name="black" type="xs:positiveInteger" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
+0

Gracias, eso hace el trabajo. No hay forma de evitar escribir un montón de minOccurs = "0", ¿verdad? Me pregunto por qué W3Schools y MSDN dicen que el otro código funciona, cuando no funciona? – Eric

+1

@Eric Son secuencias, pero difieren en los detalles importantes que desea. Significan cero o muchas repeticiones del grupo, pero quisiste que cada individuo sea cero o uno. ¿Estás familiarizado con la expresión regular? XML Schema es muy similar. Su método es como (e g b) *, pero lo que quieres es como e? ¿gramo? ¿segundo? – 13ren

+0

Ah ... Debe haber malinterpretado lo que MSDN estaba diciendo – Eric

Cuestiones relacionadas