2011-05-17 16 views
13

क्या यह javax.xml.bind.annotation.XmlType को XML के स्ट्रिंग प्रस्तुति में परिवर्तित करना संभव है?XmlType के स्ट्रिंग का प्रतिनिधित्व कैसे प्राप्त करें?

उदाहरण:

निम्नलिखित वर्ग अनुरोध तो मैं toString() विधि ओवरराइड नहीं कर सकते एक तीसरी पार्टी पुस्तकालय से है।

@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD) 
@javax.xml.bind.annotation.XmlType(name = "req", propOrder = {"myDetails", "customerDetails"}) 
public class Req { 
... 
} 

अपने आवेदन में मैं इतना है कि मैं इसे एक फाइल करने के लिए लॉग इन कर सकते बस एक्सएमएल के एक स्ट्रिंग प्रतिनिधित्व प्राप्त करना चाहते हैं:

<Req> 
    <MyDetails> 
    ... 
    </MyDetails> 
    <CustomerDetails> 
    ... 
    </CustomerDetails> 
</Req> 

मैं JAXB और मार्शल उपयोग करने के लिए एक्सएमएल कन्वर्ट करने के लिए प्रयास करते हैं स्ट्रिंग:

JAXBContext context = JAXBContext.newInstance(Req.class); 
Marshaller marshaller = context.createMarshaller(); 
StringWriter sw = new StringWriter(); 
marshaller.marshal(instanceOfReq, sw); 
String xmlString = sw.toString(); 

मैं निम्न अपवाद प्राप्त करें:

javax.xml.bind.MarshalException 
    - with linked exception: 
    [com.sun.istack.SAXException2: unable to marshal type "mypackage.Req" as an element because it is missing an @XmlRootElement annotation] 

मैंने तीसरे पक्ष पुस्तकालय के भीतर अन्य कक्षाओं पर एक नज़र डाली है और उनमें से कोई भी @XmlRootElement एनोटेशन का उपयोग नहीं करता है। इस के आसपास किसी भी तरह से?

उत्तर

19

आप क्या बाला आर संकेत दिया करने के लिए Addding एक्सएमएल स्ट्रिंग

JAXBContext context = JAXBContext.newInstance(Req.class); 
Marshaller marshaller = context.createMarshaller(); 
StringWriter sw = new StringWriter(); 
marshaller.marshal(instanceOfReq, sw); 

String xmlString = sw.toString(); 
+3

ओपी को चेतावनी का एक शब्द: 'JAXBContext' महंगे (धीमी) बनाने के लिए हैं। एक उदाहरण बनाएं और पुन: उपयोग करें। –

+1

जेएक्सबी और मार्शल का उपयोग करने का प्रयास किया लेकिन उपरोक्त पद में वर्णित मार्शलएक्सप्शन प्राप्त करें। – ryan

+0

और आप XmlRoot एनोटेशन जोड़ने के लिए कक्षा Req को नहीं बदल सकते हैं? –

3

को JAXB और यह मार्शल उपयोग कर सकते हैं, तो आप इस अगर आपके JAXB तत्व @xmlrootelement

JAXBContext context = JAXBContext.newInstance(YourClass.class); 
      Marshaller marshaller = context.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
      StringWriter sw = new StringWriter(); 
      JAXBElement jx = new JAXBElement(new QName("YourRootElement"), YourClass.class, input); 
      marshaller.marshal(jx, sw); 
      String xmlString = sw.toString(); 

यह नहीं है क्या कर सकते हैं here भी कहा गया था।

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