2012-03-13 10 views
8

प्रश्न: कैसे मैं xjc/JAXB कई एक ही नाम स्थान में डुप्लिकेट elementdefinitions युक्त स्कीमा के लिए उचित javaclasses उत्पन्न कर सकता हूँ?संकलित कई XSD के युक्त डुप्लिकेट JAXB के साथ एक ही तत्व की परिभाषा

सूचना: मेरे पास तीन .xsd schemas: ए, बी और सी हैं। सभी का एक ही लक्ष्य नामस्थान है। वे सभी 3 शेमा हैं जो मुझे दिए गए हैं, और मैं किसी भी तरह से उन्हें किसी भी तरह से बदलने की अनुमति नहीं देता हूं।

वे एक कुछ तत्व भी है कि बी या सी में पाया जाता है (लेकिन एक स्वयं का एक बहुत तत्वों के साथ की घोषणा की है) उदाहरण:

<xs:simpleType name="y_ym_ymdDatoType"> 
    <xs:union memberTypes="arcgYearType arcgYearMonthType arcDateType"/> 
</xs:simpleType> 
<xs:simpleType name="arcgYearType"> 
    <xs:restriction base="xs:gYear"> 
     <xs:minInclusive value="1700"/> 
     <xs:maxInclusive value="2100"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcgYearMonthType"> 
    <xs:restriction base="xs:gYearMonth"> 
     <xs:minInclusive value="1700-01"/> 
     <xs:maxInclusive value="2100-12"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcDateType"> 
    <xs:restriction base="xs:date"> 
     <xs:minInclusive value="1700-01-01"/> 
     <xs:maxInclusive value="2100-12-31"/> 
    </xs:restriction> 
</xs:simpleType> 
: यह एक ही ए और सी के लिए "कोड" है

xjc का उपयोग करते समय उन्हें javaclasses में संकलित करने के लिए, मैं निम्न अपवाद प्राप्त करें:

[ERROR] 'y_ym_ymdDatoType' is already defined 
line 297 of file:../c.xsd 

[ERROR] (related to above error) the first definition appears here 
line 309 of file:../a.xsd 

और एक ही अन्य तत्वों के लिए होता: arcgYearType, arcgYearMonthType और arcDateType।

मैंने एक बाध्यकारी फ़ाइल के बारे में पढ़ा है जो शायद इस समस्या को हल कर सकता है, लेकिन मुझे यकीन नहीं है कि इसे कैसे किया जाए, उदाहरणों को अत्यधिक पसंद किया जाएगा।

उत्तर

0

आप बाइंडिंग फ़ाइल का उपयोग कर मैन्युअल रूप से संघर्षों को हल कर सकते हैं। यहाँ उदाहरण है, जहां परस्पर विरोधी नाम के लिए अपने कस्टम नाम निर्दिष्ट कर सकते हैं:

<bindings schemaLocation="../party.xsd" version="1.0" node="/xs:schema"> 
    <bindings node="//xs:complexType[@name='FixedIncomeBook']"> 
     <class name="PartyFixedIncomeBook"/> 
    </bindings> 
</bindings> 
+0

क्या यह आम तौर पर एक्सएमएल तत्वों का नाम बदलकर नहीं आ रहा है, या यह सिर्फ जेवाक्लास उत्पन्न होता है? –

+0

इसका नाम बदलकर जावा क्लास है। डिफ़ॉल्ट रूप से आपको 'FixedIncomeBook.java' मिलता है और इस बाध्यकारी के साथ आपको' PartyFixedIncomeBook.java' –

+0

मिलता है I: प्राप्त होता है: [ERROR] असमर्थित बाध्यकारी नामस्थान ""। शायद आप "http://java.sun.com/xml/ns/jaxb/xjc" का मतलब था? फ़ाइल का लाइन 4: क्या आप गलत कर सकते हैं? –

2

से आप वर्णन करते हैं, मुझे लगता है कि वहाँ कोई XSD फ़ाइलों के बीच संबंधों में शामिल हैं। साथ ही, मुझे यह मानना ​​है कि आप कक्षाओं का पुन: उपयोग करने की कोशिश कर रहे हैं, जहां सामग्री ओवरलैप हो जाती है।

प्रत्येक फ़ाइल स्वतंत्र रूप से "संकलित" करने का आसान तरीका है, और प्रत्येक एक्सएसडी फ़ाइलों के लिए एक अलग जावा पैकेज प्रदान करना है। यहां समस्या यह है कि यदि आप एक एक्सएमएल से दूसरे में सामग्री को "चेन" करने की कोशिश करते हैं (यानी ए से अनमशेल और फिर मार्शल टू बी), तो पैकेज कॉम.ए में कक्षा सी 1, और पैकेज सी 1 में कक्षा सी 1, जबकि एक ही एक्सएसडी जटिल प्रकार से मेल खाते हुए, "विनिमय करने योग्य" नहीं हैं; आपको उनके बीच एक रूपांतरण विकसित करना होगा। आपको कस्टम बाध्यकारी फ़ाइल की आवश्यकता है या यदि आप NetBeans का उपयोग करते हैं, तो बस JAXB विज़ार्ड में अलग-अलग पैकेज सेट करें।

एपिसोड का उपयोग करने का सबसे अच्छा तरीका हो सकता है (this on SO देखें)। प्रक्रिया A.xsd, फिर बीएक्सएसडी, आदि को संसाधित करने के लिए उस एपिसोड का उपयोग करें

+0

1. कोई भी शामिल नहीं है। 2. हां, मैं पुन: उपयोग करना चाहता हूं, क्योंकि वे समान हैं, लेकिन यह प्राथमिक लक्ष्य नहीं है, इसलिए यदि कुछ और करना आसान है तो ऐसा ही हो। मुझे सीएक्सएसडी में एक्सएसडी से कुछ में दिलचस्पी नहीं है, मैं बस उन सभी को एक ही प्रोजेक्ट में उपयोग करता हूं। क्या पैकेजों को स्थगित करने का कोई सीधा तरीका है, भले ही उनके एक्सएसडी एक ही टीएनएस से आते हैं? –

+0

@ सोफस, तो आप एपिसोड का उपयोग क्यों नहीं कर रहे हैं? या एक कस्टम बाइंडिंग लक्ष्यीकरण अलग-अलग नामस्थान का उपयोग कर प्रत्येक पैकेज के खिलाफ xjc चलाएं? –

+0

मैं इसे 20 घंटे या उससे भी अधिक समय में आज़मा दूंगा, धन्यवाद –