2010-05-21 21 views
9

¿Cómo puedo crear un xsd para darme este tipo de estructura xml que puede continuar infinitamente?¿Qué xsd permitirá que un elemento se tenga a sí mismo como un elemento secundario infinitamente?

<?xml version="1.0" encoding="utf-8" ?> 
<SampleXml> 
    <Items> 
     <Item name="SomeName" type="string"> 
      This would be the value 
     </Item> 
     <Item name="SecondName" type="string"> 
      This is the next string 
     </Item> 
     <Item name="AnotherName" type="list"> 
      <Items> 
       <Item name="SubName" type="string"> 
        A string in a sub list 
       </Item> 
       <Item name="SubSubName" type="list"> 
        <Items> 
         <Item name="HowDoI" type="string"> 
          How do I keep this going infinately? 
         </Item> 
        </Items> 
       </Item> 
      </Items> 
     </Item> 
    </Items> 
</SampleXml> 

La única solución que he encontrado ha sido simplemente repetir en el xsd tantas veces como estoy dispuesto a copiar. Como abajo.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="SampleXml"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Items"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element maxOccurs="unbounded" name="Item"> 
           <xs:complexType mixed="true"> 
            <xs:sequence minOccurs="0"> 
             <xs:element name="Items"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element maxOccurs="unbounded" name="Item"> 
                 <xs:complexType mixed="true"> 
                  <xs:sequence minOccurs="0"> 
                   <xs:element name="Items"> 
                    <xs:complexType> 
                     <xs:sequence> 
                      <xs:element name="Item"> 
                       <xs:complexType> 
                        <xs:simpleContent> 
                         <xs:extension base="xs:string"> 
                          <xs:attribute name="name" type="xs:string" use="required" /> 
                          <xs:attribute name="type" type="xs:string" use="required" /> 
                         </xs:extension> 
                        </xs:simpleContent> 
                       </xs:complexType> 
                      </xs:element> 
                     </xs:sequence> 
                    </xs:complexType> 
                   </xs:element> 
                  </xs:sequence> 
                  <xs:attribute name="name" type="xs:string" use="required" /> 
                  <xs:attribute name="type" type="xs:string" use="required" /> 
                 </xs:complexType> 
                </xs:element> 
               </xs:sequence> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
            <xs:attribute name="name" type="xs:string" use="required" /> 
            <xs:attribute name="type" type="xs:string" use="required" /> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+1

Mi ojo izquierdo es ahora mi ojo derecho! +1 por tratar de deshacerse de eso (y usar xsd en primer lugar). –

Respuesta

12

Uso <xs:element ref="bla" /> que se refieren a los elementos de forma recursiva. Un ejemplo sencillo:

<xs:element name="recursive"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="recursive" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

le permite escribir esto:

<recursive> 
    <recursive> 
    <recursive /> 
    </recursive> 
    <recursive /> 
    <recursive> 
    <recursive> 
     <recursive /> 
    </recursive> 
    </recursive> 
</recursive> 

uso del atributo 'ref' también ayuda en gran medida a aumentar la legibilidad de su XSD. Esta es la forma en que iba a escribir la suya:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="SampleXml"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="Items" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="Items"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="Item" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="Item"> 
    <xs:complexType mixed="true"> 
     <xs:sequence> 
     <xs:element ref="Items" minOccurs="0" /> 
     </xs:sequence> 
     <xs:attribute name="name" type="xs:string" use="required" /> 
     <xs:attribute name="type" type="xs:string" use="required" /> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

Nota cómo el uso de 'ref' incluso cuando no es estrictamente necesario (por ejemplo, cuando SampleXml se refiere a artículos) hace que el XSD menos de un lío anidada y más legible.

+0

¿es lo mismo declarar todos los elementos en el nivel superior en comparación con anidarlos semánticamente? Es decir, esperaría que anidar significara que el elemento solo tiene significado cuando existe dentro de los elementos y no de forma independiente en algún documento XML –

+0

@GeorgeBirbilis Sí, estoy de acuerdo con eso. Probablemente haya casos en los que es importante usar esta distinción, pero cuando no lo esté, creo que no hay mucho daño en ser algo menos correcto técnicamente a favor de una gran ganancia en legibilidad. – Joren

4

Pruebe algo como esto, utilizando el atributo ref:

<xs:element name="Items"> 
    <xs:complexType> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="Item" /> 
    </xs:sequence> 
    </xd:complexType 
</xd:element> 

<xs:element name="Item"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="Items" /> 
    </xs:sequence> 
    </xd:complexType 
</xd:element> 
4

intente utilizar el atributo ref:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Items"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" name="Item"> 
        <xs:complexType mixed="true"> 
         <xs:sequence minOccurs="0"> 
          <xs:element ref="Items" /> 
         </xs:sequence> 
         <xs:attribute name="name" type="xs:string" use="required" /> 
         <xs:attribute name="type" type="xs:string" use="required" /> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="SampleXml"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="Items" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
Cuestiones relacionadas