2010-05-21 8 views
9

मैं इस प्रकार की एक्सएमएल संरचना देने के लिए xsd कैसे बना सकता हूं जो असीम रूप से जा सकता है?क्या xsd एक तत्व को उप-तत्व के रूप में स्वयं को अन्तर्निहित करने देगा?

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

मुझे मिला एकमात्र समाधान बस xsd में दोहराना है जैसा कि मैं प्रतिलिपि बनाने के इच्छुक हूं। नीचे की तरह

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

मेरे बाईं आंख अब अपनी दाहिनी आँख है! उस से छुटकारा पाने की कोशिश करने के लिए +1 (और पहली जगह में xsd का उपयोग करके)। –

उत्तर

12

उपयोग <xs:element ref="bla" /> रिकर्सिवली तत्वों का उल्लेख करने के। एक साधारण उदाहरण:

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

आप इस लिखने देता है:

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

'रेफरी' विशेषता का उपयोग भी अपने XSD की पठनीयता को बढ़ाने में बहुत मदद करता है। यह मैं तुम्हारा कैसे लिखेंगे है:

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

नोट 'रेफरी' तब भी जब यह सख्ती से आवश्यक नहीं है के उपयोग (जैसे जब SampleXml आइटम को संदर्भित करता है के रूप में) कैसे एक नेस्टेड गड़बड़ की XSD कम और अधिक पठनीय बनाता है।

+0

क्या यह वही है जो उपरोक्त स्तर पर सभी तत्वों को घोषित करने की तुलना में समान रूप से घोषित करने के समान है? यही है, मैं घोंसले का मतलब यह कहूंगा कि आइटम का मतलब केवल तब होता है जब आइटम के अंदर मौजूद होता है और कुछ एक्सएमएल दस्तावेज़ –

+0

@ जॉर्जबिरबिलीस हाँ में स्टैंडअलोन नहीं होता है, मैं इसके साथ सहमत हूं। ऐसे मामले हैं जहां इस भेद का उपयोग करना महत्वपूर्ण है, लेकिन जहां ऐसा नहीं है, मुझे लगता है कि पठनीयता में भारी लाभ के पक्ष में तकनीकी रूप से सही कुछ हद तक कम नुकसान नहीं है। – Joren

4

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

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> 
संबंधित मुद्दे