2011-10-28 8 views
6

मेरे पास एक एक्सएसडी है जो स्वयं नहीं बनाई गई है लेकिन किसी अन्य पार्टी से प्राप्त हुई है। इसलिए मैं इस एक्सएसडी को नहीं बदल सकता क्योंकि मुझे दूसरी पार्टी के साथ संगतता सुनिश्चित करनी होगी।एक marshalled तत्व/टैग में अनावश्यक नामस्थान घोषणाओं से कैसे बचें?

सरल बाध्यकारी मोड का उपयोग कर एक्सजेसी 2.2 और जेएक्सबी 2.2 का उपयोग करके मैं एक खाली हैलो तत्व के अंदर एक मूल तत्व बनाना चाहता हूं। लेकिन जब मार्शल किया गया तो मुझे बहुत सारे नामस्थान बकवास मिलते हैं। जो मुझे अनदेखा दिखता है। (हालांकि यह काम करता है, लेकिन इसे और अधिक डेटा ect भेजने के लिए है ...)

XSD Rootelement:

<element name="epp"> 
     <complexType> 
      <choice> 
       <element name="greeting" type="epp:greetingType" /> 
       <element name="hello" /> 
       <element name="command" type="epp:commandType" /> 
       <element name="response" type="epp:responseType" /> 
       <element name="extension" type="epp:extAnyType" /> 
      </choice> 
     </complexType> 
    </element> 

जावा कोड:

Epp epp = new Epp(); 
epp.setHello(""); 

मार्शल परिणाम:

<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 
    <hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string"></hello> 
</epp> 

पसंदीदा परिणाम:

<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 
<hello /> 
</epp> 

या:

<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 
<hello></hello> 
</epp> 

वहाँ अधिमानतः XSD बदले बिना यह संभव बनाने या मैन्युअल XJC संकलित वर्गों को बदलने के लिए कोई तरीका है?

+1

मन अगर मैं सवाल शीर्षक को संपादित? ऐसा लगता है कि आप सामग्री के बिना तत्व उत्पन्न करने के लिए कह रहे हैं, लेकिन इसकी परवाह है। असली लक्ष्य अनावश्यक नामस्थान घोषणाओं से परहेज कर रहा है। –

+0

कोई समस्या नहीं, यह मेरा पहला प्रश्न है ... :), हां लक्ष्य उन नेमस्पेस decs से छुटकारा पाने के लिए है –

+0

क्या आपने हैलो मान सेट नहीं करने का प्रयास किया (epp.setHello ("") नहीं चल रहा है)? – altanis

उत्तर

4

समस्या निम्नानुसार है: स्कीमा तत्व hello तत्व के लिए एक प्रकार परिभाषित नहीं करता है। नतीजतन, एक्सजेसी Object टाइप के साथ एक क्षेत्र उत्पन्न करता है। इसका मतलब है कि जेएक्सबी को मार्शलिंग के दौरान पता होना चाहिए कि हम किस प्रकार की वस्तु से निपट रहे हैं। मैं विवरण के बारे में निश्चित नहीं हूं, लेकिन मुझे लगता है कि यह रनटाइम प्रकार की जांच करेगा और फिर तदनुसार इसके साथ सौदा करेगा। चूंकि String - जो वास्तव में आप hello फ़ील्ड में डालते हैं - एक स्कीमा प्रकार (अर्थात् xs:string) पर सीधे बाध्यकारी है, जेएक्सबी इसके साथ जा रहा है। अब तक सब ठीक है.

लेकिन जेएक्सबी एक्सएमएल जेनरेट करने की कोशिश कर रहा है जो अनचाहे के लिए भी उपयोगी होगा। स्कीमा एक प्रकार निर्दिष्ट नहीं किया है के बाद से और hello क्षेत्र एक वस्तु है, एक्सएमएल से unmarshal को JAXB छोड़ना होगा क्या यह वास्तव में में सामग्री हो जाना चाहिए के रूप में अनुमान लगाने की कोशिश कर रहा। xsi:type विशेषता का उपयोग करके XML तत्व में प्रकार निर्दिष्ट करने का तरीका यह बताने का एक तरीका है। यह विशेषता xsi -बाउंड नेमस्पेस के भीतर आती है, ताकि उपसर्ग को घोषित और बाध्य किया जाना चाहिए। xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" के साथ ऐसा होता है। लेकिन यही सब कुछ नहीं है ... घोषित xsi:typexs उपसर्ग के लिए जिसका अर्थ है कि रूप में अच्छी तरह घोषित किया जाना चाहिए ही, XML स्कीमा नाम स्थान में एक प्रकार का उपयोग करता है! इसलिए xmlns:xs="http://www.w3.org/2001/XMLSchema"

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

सौभाग्य से, आप पूरी तरह से भाग्य से बाहर नहीं कर रहे हैं। आप किसी बाहरी बाइंडिंग फ़ाइल का उपयोग बाइंडिंग अनुकूलित कर सकते हैं। विवरण यहां पाया जा सकता: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/2.0/tutorial/doc/JAXBUsing4.html

आम तौर पर, इस बाइंडिंग फ़ाइल चाल करना चाहिए:

<?xml version="1.0" encoding="UTF-8"?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
    version="2.1"> 

    <!-- Bindings for the general schema --> 
    <bindings schemaLocation="test.xsd" node="/xs:schema"> 

     <bindings node="xs:element[@name='epp']"> 
      <bindings node=".//xs:element[@name='hello']"> 
       <javaType name="java.lang.String" /> 
      </bindings> 
     </bindings> 

    </bindings> 

</bindings> 

... लेकिन मैं त्रुटि the compiler was unable to honor this javaType customization हो रही है जब मैं इस के साथ xjc प्रयास करें।यह काम करता है जब मैं स्कीमा में हैलो तत्व पर कुछ मानक स्कीमा प्रकार (जैसे स्ट्रिंग या int) निर्दिष्ट करता हूं, लेकिन जब मैंने वास्तव में रूपांतरण के लिए पार्स और प्रिंट विधियों की आपूर्ति करने की कोशिश की तो फिर से काम नहीं किया, इसलिए मुझे मान लीजिए कि यह xjc में एक बग है जो तब होता है जब स्कीमा में कोई प्रकार निर्दिष्ट नहीं होता है।

मुझे उम्मीद है कि कोई और बाइंडिंग मुद्दे के बारे में सलाह दे सकता है। अन्यथा, मैं देखता हूं कि एकमात्र विकल्प कुछ गैर-टाइप किए गए तत्व को डिफ़ॉल्ट रूप से स्ट्रिंग करने के लिए XJC को छेड़छाड़ करने से पहले कुछ एक्सएसएलटी ट्रांसफॉर्म के माध्यम से अपनी स्कीमा भेज रहा है।

+0

मैंने कोशिश की लेकिन दुर्भाग्य से मुझे एक ही त्रुटि मिलती है ... जबकि मैं 'epp.setHello (" ") का उपयोग कर रहा हूं; 'मार्शलर को यह जानने के लिए कि इसे तत्व को आउटपुट करना चाहिए। शायद हैलो तत्व स्थापित करने का एक और तरीका है जो एक स्ट्रिंग उत्पन्न नहीं करता है। चूंकि XJC फ़ंक्शन को 'सार्वजनिक शून्य सेट हैलो (ऑब्जेक्ट वैल्यू)' के रूप में संकलित करता है, नल का उपयोग करके बस इसे सेट नहीं करना है और इसे मार्शलर द्वारा नहीं लिया जाएगा। एक "बेवकूफ" अनुमान बनाने के लिए, क्या एक जेएक्सबी "शून्य" ऑब्जेक्ट है? :) –

+0

@PhoenixtheII क्या आपने बाइंडिंग फ़ाइल का उपयोग किया था? यदि हां, तो क्या यह काम करता है? मैं जेडीके 7 के साथ वितरित एक्सजेसी का उपयोग कर रहा हूं, इसलिए शायद पिछले संस्करण इस के साथ काम करेंगे। मुझे पता है कि आप इसके लिए खाली स्ट्रिंग सेट करके हैलो तत्व को "मजबूर" करना चाहते हैं, और यह ** ** सही दृष्टिकोण है। नल सेट करने से परिणाम निकल जाएगा। लेकिन हमारा लक्ष्य है कि एपीपी कक्षा में हैलो फ़ील्ड को कुछ ठोस प्रकार में बदलना है, क्योंकि यह 'ऑब्जेक्ट' है, जो सभी xsi: टाइप फ्लफ को जोड़ने के लिए है। –

+0

आह ठीक है, मैंने फैसला किया है "स्क्रू इट" मोड करने के लिए, क्योंकि शुरुआत में मैंने कुछ जेएक्सबी संगत (@XmlRootElement गायब सामान;) बनाने के लिए पार्टियों xsd में पहले से ही बदलाव किए हैं। और जैसा आपने बताया था: मैंने xsd को यह बताने के लिए बदल दिया है कि हैलो तत्व एक स्ट्रिंग प्रकार का है। '' और अभी भी एक ही जावा कोड का उपयोग करके मुझे अपना पसंदीदा परिणाम देता है। अब मुझे आशा है कि मेरा एक्सएसडी इन हैलो को प्राप्त करने के साथ अभी भी संगत है लेकिन मुझे इसका परीक्षण करना होगा ... –

1

स्कीमा तत्व के लिए एक प्रकार का उल्लेख न हो, तो डिफ़ॉल्ट प्रकार xs:anyType जो XML स्कीमा प्रकार पदानुक्रम (सभी सरल और जटिल प्रकार anyType के उपप्रकार हैं) की जड़ है है।

जब जेएक्सबी anyType तत्व से मुकाबला करता है तो यह Object प्रकार की संपत्ति से जुड़ा होगा। मूल्य आप इस संपत्ति में डाल दिया हो सकता है

  • null, अर्थ तत्व
  • एक प्रकार JAXBContext के बारे में जानता है, जो सामान्य तरीके से मार्शल किया जाएगा की एक वस्तु को छोड़ देते हैं और एक xsi:type क्या इंगित करने के लिए जोड़ा मूल प्रकार था, या
  • org.w3c.dom.Element वास्तविक XML का उपयोग करने के लिए प्रतिनिधित्व करता है।

तो यह प्रयास करें:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document doc = dbf.newDocumentBuilder().newDocument(); 

epp.setHello(doc.createElementNS("urn:ietf:params:xml:ns:epp-1.0", "hello")); 
संबंधित मुद्दे