2010-05-21 8 views
9

Sonsuza kadar gidebilen bu tür xml yapısını vermek için nasıl xsd oluşturabilirim? Ben kopyalamak razıyım olarakxsd, bir elemanın sonsuz bir alt öğe olarak kendini bırakmasına ne izin verir?

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

bulduğum tek çözüm sadece xsd gibi defalarca tekrarlamak olmuştur. Aşağıda olduğu gibi.

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

Benim sol gözü şimdi benim sağ göz! Bundan kurtulmak için +1 (ve ilk etapta xsd'yi kullanarak). –

cevap

12

Kullanım <xs:element ref="bla" /> yinelemeli parçalara atıfta bulunmak için. Basit bir örnek:

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

bu yazmasına izin verir: 'ref' özelliğinin

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

Kullanımı da XSD'nin okunabilirliği artırmada büyük ölçüde yardımcı olur. Bu seninkini yazmak görecektir:

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

Not onu kesinlikle gerekli olmasa bile 'ref' kullanımı (örneğin SampleXml Öğeler başvurduğunda gibi) XSD iç içe geçmiş bir karmaşa daha az ve daha okunabilir hale nasıl.

+0

, tüm öğeleri üst üste onları semantik olarak yerleştirmekle karşılaştırılmak üzere bildirmekle aynı mıdır? Yani, Öğe içeriğinin yalnızca Öğeler içinde mevcut olduğunda ve bazı XML belgelerinde bağımsız olarak değil, bazı XML belgelerinde –

+0

@GeorgeBirbilis Evet olduğunda anlamlandırması beklenir. Muhtemelen bu ayrımı kullanmanın önemli olduğu durumlar vardır, fakat bunun mümkün olmadığı durumlarda, okunabilirlik açısından büyük bir kazanım lehine teknik olarak daha az doğru olmanın çok fazla zararı olmadığını düşünüyorum. – Joren

4

ref özelliğini kullanmak, böyle bir şey deneyin:

<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

deneyin ref özelliğini kullanarak:

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