2010-05-21 6 views
9

Comment puis-je créer un xsd pour me donner ce type de structure xml qui peut continuer indéfiniment?Qu'est-ce que xsd laissera un élément se comporter comme un sous-élément infiniment?

<?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 seule solution que j'ai trouvé a été de répéter dans le xsd autant de fois que je suis prêt à copier. Comme ci-dessous.

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

Mon œil gauche est maintenant mon œil droit! +1 pour essayer de se débarrasser de cela (et en utilisant xsd en premier lieu). –

Répondre

12

Utilisez <xs:element ref="bla" /> pour se référer récursive aux éléments. Un exemple simple:

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

vous permet d'écrire ceci:

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

Utilisation de la 'ref' attribut aide aussi grandement à augmenter la lisibilité de votre XSD. Voici comment j'écrire le vôtre:

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

Notez comment l'utilisation de « ref », même si ce n'est pas strictement nécessaire (par exemple lorsque SampleXml fait référence à des articles) rend le XSD moins d'un désordre imbriquée et plus lisible.

+0

est-il pareil de déclarer tous les éléments au niveau supérieur plutôt que de les imbriquer sémantiquement? C'est-à-dire, je m'attendrais à ce que l'imbrication signifie que l'élément n'a de sens que lorsqu'il existe à l'intérieur des éléments et n'est pas autonome dans un document XML –

+0

@GeorgeBirbilis Oui, je suis d'accord avec cela. Il y a probablement des cas où il est important de faire usage de cette distinction, mais là où ce n'est pas, je pense qu'il n'y a pas grand mal à être un peu moins techniquement correct en faveur d'un énorme gain de lisibilité. – Joren

4

Essayez quelque chose comme cela, en utilisant l'attribut 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

Essayez d'utiliser l'attribut 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> 
Questions connexes