2010-05-31 6 views
5

में बाल तत्वों को शामिल नहीं किया गया है, मैंने एक एक्सएसडी रखा है और इसके बाहर कक्षाएं उत्पन्न करने के लिए जेएक्सबी का उपयोग किया है।जेएक्सबी माता-पिता को नेमस्पेस जोड़ रहा है लेकिन

यहाँ मेरी XSDs-

myDoc.xsd : 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns="http://www.mydoc.org" 
     targetNamespace="http://www.mydoc.org" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:mtp="http://www.mytypes.com" elementFormDefault="qualified"> 

<xs:import namespace="http://www.mytypes.com" schemaLocation="mytypes.xsd" /> 
<xs:element name="myDoc"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="crap" type="xs:string"/> 
     <xs:element ref="mtp:foo"/> 
     <xs:element ref="mtp:bar"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

mytypes.xsd 

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.mytypes.com" 
     xmlns="http://www.mytypes.com" 
     xmlns:tns="http://www.mytypes.com" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     attributeFormDefault="qualified" elementFormDefault="qualified"> 


    <xs:element name="foo" type="tns:Foo"/> 
    <xs:element name="bar" type="tns:Bar"/> 
    <xs:element name="spam" type="tns:Spam"/> 

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

    <xs:complexType name="Bar"> 
    <xs:sequence> 
     <xs:element ref="spam"/> 
    </xs:sequence> 
    </xs:complexType> 

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

</xs:schema> 

दस्तावेज़ है-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myDoc xmlns:ns2="http://www.mytypes.com"> 
    <crap>real crap</crap> 
    <ns2:foo>bleh</ns2:foo> 
    <ns2:bar> 
    <spam>blah</spam> 
    </ns2:bar> 
</myDoc> 

ध्यान दें कि <spam> एलिमेंट डिफ़ॉल्ट नेमस्पेस का उपयोग करता मार्शल कर रहे हैं। मैं इसे ns2 नामस्थान का उपयोग करना चाहता हूं। स्कीमा (mytypes.xsd) इस तथ्य को व्यक्त करता है कि <spam><bar> के भीतर निहित है जो XML उदाहरण में ns2 नामस्थान से जुड़ा हुआ है।

मैंने इस सप्ताह अपने सिर को एक हफ्ते से तोड़ दिया है और मुझे ns2 उपसर्ग <spam> में दिखाई देने के लिए चाहिए। मुझे क्या करना चाहिए?

आवश्यक:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myDoc xmlns:ns2="http://www.mytypes.com"> 
    <crap>real crap</crap> 
    <ns2:foo>bleh</ns2:foo> 
    <ns2:bar> 
    <ns2:spam>blah</ns2:spam><!--NS NS NS--> 
    </ns2:bar> 
</myDoc> 

उत्तर

0

मैं आपकी समस्या को पुन: पेश करने की कोशिश की है, लेकिन यहाँ यह सही ढंग से काम कर रहा है: जब स्पैम तत्व वास्ते एक ns2 नाम स्थान प्राप्त करता है।

मेरे मार्शलिंग कोड:

Bar bar = new Bar(); 
    bar.setSpam("s"); 

    MyDoc myDoc = new MyDoc(); 
    myDoc.setBar(bar); 

    JAXBContext context = JAXBContext.newInstance("org.mydoc"); 

    Marshaller marshaller = context.createMarshaller(); 
    marshaller.marshal(myDoc, System.out); 

आउटपुट:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myDoc xmlns="http://www.mydoc.org" xmlns:ns2="http://www.mytypes.com"><ns2:bar><ns2:spam>s</ns2:spam></ns2:bar></myDoc> 

मेरे JAXB संस्करण:

xjc version "JAXB 2.1.3 in JDK 1.6" 
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build IBM JAXB 2.1.3 in JDK 1.6) 

संपादित करें:

@XmlElement(required = true) 
protected String spam; 

XmlElement भी एक नाम स्थान विशेषता है: Bar.java वर्ग निम्नलिखित एनोटेशन है। जावाडोक: http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace()

डिफ़ॉल्ट रूप से यह com.mytypes पैकेज में @XmlSchema एनोटेशन को देखेगा। क्या आपने @XmlSchema एनोटेशन और/या पैकेज-info.java फ़ाइल को हटा दिया था?

+0

मैं JAXB-2.1.11 का उपयोग कर रहा JDK1.5 साथ। मैंने जेनरेट की गई कक्षाओं और पैकेज-info.java फ़ाइल को हाथ से संपादित नहीं किया है। Bar.java @XmlType हूँ- टिप्पणी की जाती है (नाम = "बार" नाम स्थान = "http://www.mytypes.com" propOrder = { "स्पैम"}) package-info.java @XmlSchema शामिल (नेमस्पेस = "http://www.mydoc.org", elementFormDefault = XmlNsForm.QUALIFIED) – Nishant

+0

दिलचस्प बात यह है कि मैं एक दस्तावेज़ को मार्शल कर सकता हूं और इसे पूरी तरह से ठीक से अनमशॉल कर सकता हूं। AFAIU, एक्सएमएल उदाहरण बताता है कि शून्य नामस्थान से संबंधित है और इसकी परिभाषा नहीं मिलनी चाहिए – Nishant

0

पैकेज-info.java को मेरे निर्माण प्रणाली द्वारा संकलित नहीं किया जा रहा था और इसलिए elementFormDefault = "योग्य" और लक्ष्य नामस्थान ने इसे जैक्सबी एनोटेटेड कक्षाओं में नहीं बनाया।

यदि आप यह व्यवहार देखते हैं, तो सुनिश्चित करें कि आपका पैकेज-info.java को .class फ़ाइल में संकलित किया जा रहा है और आपके क्लासपाथ में है।

चीयर्स।

0

यह त्रुटि तब भी होती है जब आप मेवेन 2 और निम्न jaxws-maven-plugin के साथ बनाते हैं।

<groupId>org.codehaus.mojo</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 

और किसी कारण से जावा 1.5 के लिए मेवेन-कंपाइलर-प्लगइन कॉन्फ़िगर किया गया है। लक्ष्य/स्रोत को 1 पर सेट करना।6 समस्या को हल करता है।

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     </configuration> 
</plugin> 

यदि आप जानते हैं, तो कृपया टिप्पणी करने में संकोच न करें।

-1

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

- क्षमा करें, मैं xslt, xml, xsd और सामान में एक शुरुआतकर्ता हूं और JAXB के बारे में कोई जानकारी नहीं है। लेकिन आम तौर पर, जब हम एक्सएसडी के उपयोग से एक्सएमएल दस्तावेज़ लिखने के बारे में पढ़ते हैं, तो हम हमेशा केस संवेदनशीलता का भी ख्याल रखेंगे।

क्षमा करें अगर यह उत्तर आपकी समस्या का समाधान नहीं करता है।

2

जांचें कि जेनरेट किए गए वर्ग में फ़ील्ड @XmlElement एनोटेशन गायब हैं और यदि मौजूद हैं तो वे नामस्थान विशेषता खो रहे हैं। इन दोनों को आपके मार्शल एक्सएमएल

0

में प्रत्येक तत्व के खिलाफ नेमस्पेस उपसर्ग प्राप्त करने के लिए जरूरी है। आप इसे अपने पैकेज-info.java में @XmlSchema एनोटेशन में निर्दिष्ट कर सकते हैं।

elementFormDefault=XmlNsForm.QUALIFIED 

नमूना package-info.java

@XmlSchema(
    namespace="desiredNamespace", 
    // If qualified namespace will be added to all elements 
    elementFormDefault = XmlNsForm.QUALIFIED, 
    // If qualifies namespace will be added to all attributes 
    attributeFormDefault = XmlNsForm.UNQUALIFIED, 
    xmlns = { 
     @XmlNs(prefix = "xsd", namespaceURI = "desiredNamespace"), 
     @XmlNs(prefix = "xsi", namespaceURI = "anotherLink"), 
    } 
) 
संबंधित मुद्दे