2013-01-18 15 views
5

मैं एक xml स्कीमा कि एक कार के लिए बुनियादी क्षेत्रों में परिभाषित किया है में एक XML तत्व बदलना:ओवरराइड करना और बेस प्रकार

<xs:simpleType name="FuelType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Regular Unleaded"/> 
     <xs:enumeration value="High Octane"/> 
     <xs:enumeration value="Leaded"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:complexType name="CarType"> 
    <xs:sequence> 
     <xs:element name="Make" type="xs:string"/> 
     <xs:element name="Model" type="xs:string"/> 
     <xs:element name="Cylinders" type="xs:int"/> 
     <xs:element name="Fuel" type="FuelType"/> 
    </xs:sequence> 
</xs:complexType> 

अब मान लीजिए कि मैं एक होंडा कार प्रकार है कि तक फैली हुई है निर्धारित करना चाहते हैं CarType लेकिन यह ईंधनके लिए खुद परिभाषा है गया है:

<xs:simpleType name="HondaFuelType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="85"/> 
     <xs:enumeration value="87"/> 
     <xs:enumeration value="89"/> 
     <xs:enumeration value="91"/> 
     <xs:enumeration value="93"/> 
     <xs:enumeration value="95"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:complexType name="HondaCarType"> 
    <xs:complexContent> 
     <xs:extension base="car:CarType"> 
      <xs:sequence> 
       <xs:element name="Fuel" type="HondaFuelType"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

CarType विस्तार मुझे वह सब कुछ मिल जाता है जो मैं चाहता हूं हालांकि स्कीमा अब ईंधन (विभिन्न नामस्थानों में) नामक दो तत्वों की अनुमति देता है।

<HondaCar xmlns="HondaNS" xmlns:car="CarNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="HondaNS D:\Development\Temp\honda.xsd"> 
    <car:Make/> 
    <car:Model/> 
    <car:Cylinders>4</car:Cylinders> 
    <car:Fuel>High Octane</car:Fuel> 
    <Fuel>87</Fuel> 
</HondaCar> 

हालांकि यह (कम से कम मेरे लिए) पूरी तरह से वैध Xml यह तार्किक मतलब नहीं है है: यहाँ एक नमूना Xml उदाहरण है। मेरा इरादा बेस प्रकार का विस्तार करना था, ओवरराइड * ईंधन * केवल होंडाफ्यूल टाइप में परिभाषित मानों को अनुमति देने के लिए।

वहाँ एक रास्ता मैं ओवरराइड या मुखौटा कर सकते हैं मेरी विस्तारित प्रकार में आधार ईंधन तत्व है?

उत्तर

6

आप जो कुछ भी वर्णन करते हैं उसके समान चीजें कर सकते हैं, लेकिन एक्सएसडी में आप जो भी वर्णन करते हैं, ठीक से करना संभव नहीं है। जटिल प्रकार कारटाइप की 'बेस' घोषणा डेटा उपभोक्ता को कई प्रतिबद्धताओं को बनाती है, जिसे प्रतिबंध या विस्तार से, चाहे से प्राप्त सभी प्रकारों द्वारा पालन किया जाना चाहिए। इनमें से हैं:

  • कारटाइप के उदाहरणों में मेक, मॉडल, सिलिन्डरों और ईंधन नामक बच्चों के संकेत दिए गए प्रकार होंगे।
  • मेक और मॉडल तत्वों के मान स्ट्रिंग होंगे।
  • सिलिंडर तत्व का मान xs: int होगा।
  • ईंधन तत्व का मूल्य स्ट्रिंग्स {"नियमित अनलेडेड", "लीड", "हाई ऑक्टेन"} के सेट से खींचा जाएगा।

यह उन प्रतिबद्धताओं में से अंतिम है जिनके साथ आप अंतर्निहित समस्याएं चल रहे हैं।

जब आप एक प्रकार का विस्तार करते हैं, तो आप इसके सामग्री मॉडल के अंत में नए बच्चे जोड़ते हैं; एक्सएसडी 1.0 के लिए यह हमेशा सच होगा कि किसी भी तत्व के विस्तार के लिए वैध तत्व के लिए, शून्य से अधिक या अधिक बच्चों को छोड़ना संभव है और एक तत्व उत्पन्न करना जो मूल प्रकार के विरुद्ध मान्य होगा। यही कारण है कि आपका एक्सटेंशन दो ईंधन तत्वों के साथ समाप्त होता है।

यदि आप केवल एक ईंधन तत्व चाहते हैं, तो आप जो करना चाहते हैं वह प्रतिबंधित है, विस्तार नहीं, कारटाइप। लेकिन आपके मन में जो प्रतिबंध है वह मूल प्रकार के ईंधन तत्व का कानूनी प्रतिबंध नहीं है। तो प्रतिबंध यहां आपके लिए भी काम नहीं करेगा।

एक संभावना, निश्चित रूप से, कारटाइप को सामान्यीकृत करना है ताकि उसका ईंधन तत्व xs को स्वीकार कर सके: स्ट्रिंग, और फिर इसे दो बार प्रतिबंधित करें, एक बार मौजूदा कारटाइप की तरह कुछ उत्पन्न करने के लिए, और एक बार होंडा भिन्नता उत्पन्न करने के लिए मन।

मुझे उम्मीद है कि इससे मदद मिलती है।

-1

मैं ने वही समस्या थी और यह मैं कैसे तय है: जावा में CarType:

एक सार आधार वर्ग में परिभाषित किया।

संपत्ति/एस को छोड़कर सभी गुण आप तानाना के लिए सामान्य बनाने के लिए चाहते हैं के लिए हमेशा की तरह गेटर/setters बनाएँ: करने के लिए XSJ संकलक के लिए एनोटेशन:

public <T extends CarType> T getCarType() { 
    return (T) ref; 
} 

का उपयोग कर XSD जावा प्रकार के साथ एक XSD तत्व बनाएं उचित मूल्यांकन का प्रयोग करें।

<xsd:complexType name="carType"> 
    <xsd:annotation> 
     <xsd:appinfo> 
      <jaxb:class ref="com.yourclass.model.CarType"/> 
     </xsd:appinfo> 
    </xsd:annotation> 
</xsd:complexType> 

अब इसे अन्य सभी xsd तत्वों के लिए विस्तार आधार के रूप में उपयोग करें जैसा कि आप पहले कर रहे थे। यह सुनिश्चित करेगा कि आप कारटाइप के लिए कोई सुपर प्रकार सेट/प्राप्त कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे