2010-05-21 10 views
9

Come posso creare un xsd per darmi questo tipo di struttura xml che può andare avanti all'infinito?Quale xsd permetterà a un elemento di avere se stesso come elemento secondario 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> 

L'unica soluzione che ho trovato è stato quello di ripetere solo nel XSD tutte le volte che io sono disposto a copiare. Come sotto

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

Il mio occhio sinistro è ora il mio occhio destro! +1 per aver provato a sbarazzartene (e usando xsd in primo luogo). –

risposta

12

Usa <xs:element ref="bla" /> per riferirsi in modo ricorsivo agli elementi. Un semplice esempio:

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

consente di scrivere questo:

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

uso dell'attributo 'ref' aiuta anche notevolmente ad aumentare la leggibilità del XSD. Questo è il modo avrei scritto vostra:

<?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 come l'uso di 'ref', anche quando non è strettamente necessario (ad esempio quando SampleXml si riferisce agli invii) rende il XSD meno di un pasticcio nidificato e più leggibile.

+0

è lo stesso se dichiarare tutti gli elementi al livello più alto rispetto a nidificarli semanticamente? Cioè, mi aspetterei che la nidificazione significhi che l'Oggetto ha un significato solo quando esiste all'interno degli Elementi e non in uno standalone in qualche documento XML –

+0

@GeorgeBirbilis Sì, sono d'accordo. Ci sono probabilmente casi in cui è importante fare uso di questa distinzione, ma dove non è penso che non ci siano molti danni nell'essere un po 'meno tecnicamente corretti in favore di un enorme guadagno nella leggibilità. – Joren

4

provare qualcosa di simile, utilizzando l'attributo 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

Provare a utilizzare l'attributo 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> 
Problemi correlati