XML स्ट्रिंग से ऑब्जेक्ट बनाने के लिए JAXB का उपयोग करें


174

मैं नीचे दिए गए कोड का उपयोग XML स्ट्रिंग को मैप करने के लिए कैसे कर सकता हूं इसे नीचे दिए गए JAXB ऑब्जेक्ट में मैप करें?

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal("xml string here");

@XmlRootElement(name = "Person")
public class Person {
    @XmlElement(name = "First-Name")
    String firstName;
    @XmlElement(name = "Last-Name")
    String lastName;
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

जवाबों:


282

XML सामग्री को पास करने के लिए, आपको उस सामग्री को अंदर Readerऔर बाहर की ओर लपेटने की आवश्यकता है जो इसके बजाय:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader("xml string here");
Person person = (Person) unmarshaller.unmarshal(reader);

6
यदि "xml स्ट्रिंग" में SOAP लिफ़ाफ़ा शामिल है, तो क्या आप इस उत्तर का विस्तार कर सकते हैं?
JWiley

क्या होगा यदि आप Readerएक विशिष्ट बीन क्लास के साथ संयोजन में उपयोग करना चाहते हैं ? चूंकि कोई unmarshall(Reader, Class)विधि नहीं है। जैसे वहाँ एक में परिवर्तित करने के लिए एक रास्ता Readerहै javax.xml.transform.Source?
bvdb

2
मेरे मामले में काम के रूप में:JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();
सीजर मिगुएल

1
@bvdb आप उपयोग कर सकते हैं javax.xml.transform.stream.StreamSourceजो कंस्ट्रक्टर्स कि ले नहीं है Reader, Fileया InputStream
मुहाद

धन्यवाद! मेरे मामले में मुझे कुछ अलग करने की ज़रूरत थी: व्यक्ति व्यक्ति = (व्यक्ति) ((JAXBElement) unmarshaller.unmarshal (रीडर)। getValue ();
गुस्तावो अमरो

161

या यदि आप एक साधारण लाइनर चाहते हैं:

Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class);

1
यह स्वीकृत उत्तर होना चाहिए। यह थोड़ा कम जटिल है।
बोबेल

बहुत आसान। मैं पूरी तरह सहमत हूं, यह स्वीकृत उत्तर होना चाहिए।
अफरिया

5
मैं वास्तव में उपरोक्त टिप्पणियों से असहमत हूं। यह निश्चित रूप से आसान है, लेकिन यह मक्खी पर संदर्भ बनाता है, इसलिए यदि संदर्भ समाप्त हो रहा है तो भी इसका प्रदर्शन पर असर पड़ सकता है। सावधानी से प्रयोग करें।
16

तो क्या विकल्प है अगर हम अनमैर्सहेलर को एक वर्ग प्रदान करना चाहते हैं? एकमात्र विधि पैरामीटर में एक (नोड, वर्ग) लेती है और यहां हमारे पास एक स्ट्रिंग है।
चार्ल्स फोलेट

इस संक्षिप्त संस्करण के साथ, मुझे पार्सिंग त्रुटियां प्राप्त नहीं होती हैं, जो किसी कॉन्फ़िगरेशन को डीबग करने के लिए उपयोगी है। शायद मुझे कुछ याद आ रहा है ...
बीवर

21

कोई unmarshal(String)विधि नहीं है। आपको एक का उपयोग करना चाहिए Reader:

Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string"));

लेकिन आमतौर पर आपको वह स्ट्रिंग कहीं से मिल रही है, उदाहरण के लिए एक फ़ाइल। अगर ऐसा है तो बेहतर है कि FileReaderखुद ही पास हो जाएं।


3

यदि आपके पास पहले से ही xml है, और एक से अधिक गुण आते हैं, तो आप इसे निम्नानुसार संभाल सकते हैं:

String output = "<ciudads><ciudad><idCiudad>1</idCiudad>
<nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad>
<nomCiudad>Pereira</nomCiudad></ciudads>";
DocumentBuilder db = DocumentBuilderFactory.newInstance()
    .newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(output));

Document doc = db.parse(is);
NodeList nodes = ((org.w3c.dom.Document) doc)
    .getElementsByTagName("ciudad");

for (int i = 0; i < nodes.getLength(); i++) {           
    Ciudad ciudad = new Ciudad();
    Element element = (Element) nodes.item(i);

    NodeList name = element.getElementsByTagName("idCiudad");
    Element element2 = (Element) name.item(0);
    ciudad.setIdCiudad(Integer
        .valueOf(getCharacterDataFromElement(element2)));

    NodeList title = element.getElementsByTagName("nomCiudad");
    element2 = (Element) title.item(0);
    ciudad.setNombre(getCharacterDataFromElement(element2));

    ciudades.getPartnerAccount().add(ciudad);
}
}

for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
System.out.println(ciudad1.getIdCiudad());
System.out.println(ciudad1.getNombre());
}

विधि getCharacterDataFromElement है

public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;

return cd.getData();
}
return "";
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.