2012-12-19 14 views
10

मैं अपनी कंपनी में एक नई डेटा एक्सचेंज सेवा बना रहा हूं। हम एक मौजूदा ऑब्जेक्ट को विस्तारित करना चाहते हैं जो हमारी core.xsd परिभाषा फ़ाइल में परिभाषित है। यहां मुझे एक उदाहरण है कि मुझे क्या करना है:अभिभावक/विस्तारित तत्व के अंदर Xsd तत्व को ओवरराइड करने के लिए

<xs:complexType name="parentType"> 
    <xs:sequence> 
    <xs:element name="departmentName" type="core:DEPARTMENT_NAME" 
       minOccurs="0" maxOccurs="1" />  
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="childType"> 
    <xs:complexContent> 
    <xs:extension base="parentType"> 
     <xs:sequence> 
     <xs:element name="departmentName" 
        type="core:DEPARTMENT_NAME" 
        minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

मुझे लगता है कि यह सही समझ में आता है। मैं मूल तत्व को ओवरराइड करना चाहता हूं और इसे आवश्यक बनाना चाहता हूं। हालांकि, यह एक वैध एक्सएमएल फ़ाइल होगी। अब एक अतिरिक्त विभाग का नाम कहाँ है !?

<childType> 
    <departmentName>HR</departmentName> 
    <departmentName>IT</departmentName> 
</childType> 

मैं यह कैसे कर सकते हैं ताकि एक्सएमएल फ़ाइल बन जाएगा:

<childType> 
    <departmentName>IT</departmentName> 
</childType> 

धन्यवाद, क्रेग

उत्तर

7

आप एक्सटेंशन के बजाय प्रतिबंध का उपयोग करने की जरूरत है। आपके द्वारा इंगित परिदृश्य के लिए यह एक पूर्ण वैध स्कीमा होगा (मैंने इसे वैध बनाने के लिए नामस्थानों का उदारतापूर्वक उपयोग किया है)।

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:core="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="parentType"> 
     <xs:sequence> 
      <xs:element name="departmentName" type="core:DEPARTMENT_NAME" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="childType"> 
     <xs:complexContent> 
      <xs:restriction base="parentType"> 
       <xs:sequence> 
        <xs:element name="departmentName" type="core:DEPARTMENT_NAME"/> 
       </xs:sequence> 
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:simpleType name="DEPARTMENT_NAME"> 
     <xs:restriction base="xs:string"/> 
    </xs:simpleType> 

    <xs:element name="childType" type="childType"/> 
</xs:schema> 
+0

धन्यवाद पेट्रू, यही वह है जिसे मैं ढूंढ रहा था। प्रश्न हालांकि: अगर मैं अभी भी पेरेंट टाइप का विस्तार करना चाहता हूं तो क्या होगा? मान लें कि मैं कुछ लापता फ़ील्ड को उस प्रकार तक जोड़ना चाहता हूं जो इसे विस्तारित करता है। मैंने देखा है कि आप केवल प्रतिबंधित या विस्तार कर सकते हैं, लेकिन दोनों माता-पिता के लिए नहीं। मैं प्रयोग करूँगा, लेकिन क्या मुझे एक ग्रैंड चाइल्ड प्रकार बनाने की ज़रूरत है जो कि बच्चे टाइप टाइप करता है, जिसके माता-पिता पर प्रतिबंध हैं? ऐसा लगता है कि अत्यधिक वर्बोज़ और बोझिल एक क्लीनर समाधान नहीं है? – Craig

+1

बच्चे के शीर्ष पर निर्माण करने के लिए आपको दादाजी टाइप बनाना होगा। मैं मानता हूं कि यह बोझिल लगता है - xsd का रखरखाव: विशेष रूप से प्रतिबंध .. लेकिन यह एक्सएसडी 1.0 है। "क्लीनर" क्वालीफायर के लिए ... यह वास्तव में विवरण में है, और दर्शक की आंख। यदि यह एक नया डिज़ाइन है, तो मुझे यकीन है कि आपके पदानुक्रम को लेआउट करने के विभिन्न तरीके हैं जैसे कि यह आपको कुछ उचित देता है ... आपको कोडिंग बाइंडिंग के लिए एक्सएसडी के संदर्भ में भी सोचना होगा ... –