XML ऑब्जेक्ट को XML स्ट्रिंग में बदलें


91

हां, हां मुझे पता है कि इस विषय के बारे में बहुत सारे सवाल पूछे गए थे। लेकिन मुझे अभी भी अपनी समस्या का हल नहीं मिल रहा है। मेरे पास जावा एनोटेट की एक संपत्ति है। उदाहरण के लिए ग्राहक, जैसे इस उदाहरण में । और मुझे इसका एक स्ट्रिंग प्रतिनिधित्व चाहिए। Google ऐसे उद्देश्यों के लिए JAXB का उपयोग करने की पुष्टि करता है। लेकिन सभी उदाहरणों में बनाई गई XML फ़ाइल को फ़ाइल या कंसोल पर प्रिंट किया जाता है, जैसे:

File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);

लेकिन मुझे इस ऑब्जेक्ट का उपयोग करना होगा और एक्सएमएल प्रारूप में नेटवर्क पर भेजना होगा। इसलिए मैं एक स्ट्रिंग प्राप्त करना चाहता हूं जो XML का प्रतिनिधित्व करता है।

String xmlString = ...
sendOverNetwork(xmlString);

मैं यह कैसे कर सकता हूँ?

जवाबों:


111

आप मार्शल की विधि का उपयोग मार्शलिंग के लिए कर सकते हैं जो एक लेखक को पैरामीटर के रूप में लेता है :

मार्शल (वस्तु, लेखक)

और इसे लागू करें जो एक स्ट्रिंग ऑब्जेक्ट का निर्माण कर सकता है

प्रत्यक्ष ज्ञात उपवर्ग: बफ़रड्राइवर, चारअवरराइटर, फिल्टरविटर, आउटपुटस्ट्रीमराइटर, पिपेडवाइटर , प्रिंटविटर, स्ट्रिंगराइटर

वास्तविक स्ट्रिंग मूल्य प्राप्त करने के लिए इसकी toString विधि को कॉल करें ।

इसलिए कर रहे हैं:

StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(customer, sw);
String xmlString = sw.toString();

4
StringWriterबहुत वृद्ध है। कवर के तहत यह उपयोग करता है StringBufferजहां एक बहुत तेज़ दृष्टिकोण का उपयोग किया गया होगा, StringBuilderलेकिन यह तब नहीं था जब स्ट्रिंगराइटर को पहली बार बनाया गया था। इस वजह से हर कॉल का sw.toString()मतलब है सिंक्रोनाइज़ेशन। बुरा यदि आप प्रदर्शन की तलाश में हैं।
पीटर जूल 16'16

2
@peterh यहां सभी उत्तर एक स्ट्रिंगराइटर का उपयोग करते हैं। इसके बजाय आप क्या सुझाव देंगे?
क्रिस्टोफर श्नाइडर

1
jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); XML की सटीक संरचना प्राप्त करने के लिए इसका उपयोग करें।
दास प्रकाश

36

एक सुविधाजनक विकल्प javax.xml.bind.JAXB का उपयोग करना है :

StringWriter sw = new StringWriter();
JAXB.marshal(customer, sw);
String xmlString = sw.toString();

रिवर्स प्रक्रिया (अनमरशाल) होगी:

Customer customer = JAXB.unmarshal(new StringReader(xmlString), Customer.class);

इस दृष्टिकोण में जाँच किए गए अपवादों से निपटने की कोई आवश्यकता नहीं है।


यह उन क्षेत्रों की नकल नहीं करेगा जिनमें केवल
गेटर्स हैं

30

A4L का उल्लेख करते हुए, आप StringWriter का उपयोग कर सकते हैं। यहाँ उदाहरण कोड प्रदान करना:

private static String jaxbObjectToXML(Customer customer) {
    String xmlString = "";
    try {
        JAXBContext context = JAXBContext.newInstance(Customer.class);
        Marshaller m = context.createMarshaller();

        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML

        StringWriter sw = new StringWriter();
        m.marshal(customer, sw);
        xmlString = sw.toString();

    } catch (JAXBException e) {
        e.printStackTrace();
    }

    return xmlString;
}

StringWriter m.marshal (ग्राहक, System.out) में कोई ज़रूरत नहीं है;
दिमित्री जीआर

6

आप इसे अर्श पर ले जा सकते हैं StringWriterऔर इसके तार को पकड़ सकते हैं। से toString()


@KickButtowski: उत्तर का अनिवार्य हिस्सा सिर्फ एक का उपयोग करना है StringWriter। लिंक सिर्फ प्रलेखन है।
SLACs

कृपया कुछ स्पष्टीकरण जोड़ें और खुशी से मैं अपना डाउन वोट निकाल दूं। :) आप के रूप में एक टिप्पणी इस डाल सकते हैं बगल में
लात Buttowski

क्या आप इसका एक उदाहरण उपयोग प्रदान कर सकते हैं?
बॉब

@ याकूब: एक बनाएँ StringWriter, इसे पास marshal()करें, कॉल करें toString()
एसएलके

2
@ इस जवाब को वास्तव में पर्याप्त है। कृपया सीखें कि एपीआई का अनुसंधान कैसे करें, इस उदाहरण Marshallerमें कई मार्शल अतिभारित विधियां हैं, बस उनके मापदंडों पर एक नज़र डालें और वे क्या हैं और आपको इसका जवाब मिल जाएगा।
A4L

2

जावा वस्तु को XML में बदलने के लिए टेस्टिंग एंड वर्किंग जावा कोड:

Customer.java

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement
public class Customer {

    String name;
    int age;
    int id;
    String desc;
    ArrayList<String> list;

    public ArrayList<String> getList()
    {
        return list;
    }

    @XmlElement
    public void setList(ArrayList<String> list)
    {
        this.list = list;
    }

    public String getDesc()
    {
        return desc;
    }

    @XmlElement
    public void setDesc(String desc)
    {
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }
}

createXML.java

import java.io.StringWriter;
import java.util.ArrayList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;


public class createXML {

    public static void main(String args[]) throws Exception
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        Customer c = new Customer();
        c.setAge(45);
        c.setDesc("some desc ");
        c.setId(23);
        c.setList(list);
        c.setName("name");
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter sw = new StringWriter();
        jaxbMarshaller.marshal(c, sw);
        String xmlString = sw.toString();
        System.out.println(xmlString);
    }

}

आम तौर पर उन उत्तरों को जोड़ना जो सिर्फ कोड शामिल करते हैं और कोई स्पष्टीकरण नहीं दिया जाता है
ford प्रीफेक्ट

2

किसी ऑब्जेक्ट को XML में जावा में बदलने के लिए

Customer.java

package com;

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
*
* @author ABsiddik
*/

@XmlRootElement
public class Customer {

int id;
String name;
int age;

String address;
ArrayList<String> mobileNo;


 public int getId() {
    return id;
}

@XmlAttribute
public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

@XmlElement
public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

@XmlElement
public void setAge(int age) {
    this.age = age;
}

public String getAddress() {
    return address;
}

@XmlElement
public void setAddress(String address) {
    this.address = address;
}

public ArrayList<String> getMobileNo() {
    return mobileNo;
}

@XmlElement
public void setMobileNo(ArrayList<String> mobileNo) {
    this.mobileNo = mobileNo;
}


}

ConvertObjToXML.java

package com;

import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

/**
*
* @author ABsiddik
*/
public class ConvertObjToXML {

public static void main(String args[]) throws Exception
{
    ArrayList<String> numberList = new ArrayList<>();
    numberList.add("01942652579");
    numberList.add("01762752801");
    numberList.add("8800545");

    Customer c = new Customer();

    c.setId(23);
    c.setName("Abu Bakar Siddik");
    c.setAge(45);
    c.setAddress("Dhaka, Bangladesh");
    c.setMobileNo(numberList);

    File file = new File("C:\\Users\\NETIZEN-ONE\\Desktop \\customer.xml");
    JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    jaxbMarshaller.marshal(c, file);// this line create customer.xml file in specified path.

    StringWriter sw = new StringWriter();
    jaxbMarshaller.marshal(c, sw);
    String xmlString = sw.toString();

    System.out.println(xmlString);
}

}

इस उदाहरण के साथ प्रयास करें ..


1

ByteArrayOutputStream का उपयोग करना

public static String printObjectToXML(final Object object) throws TransformerFactoryConfigurationError,
        TransformerConfigurationException, SOAPException, TransformerException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    XMLEncoder xmlEncoder = new XMLEncoder(baos);
    xmlEncoder.writeObject(object);
    xmlEncoder.close();

    String xml = baos.toString();
    System.out.println(xml);

    return xml.toString();
}

1

मैंने JAXB.marshal कार्यान्वयन लिया और XML prolog को हटाने के लिए jaxb.fragment = true जोड़ा। यह विधि XmlRootElement एनोटेशन के बिना भी ऑब्जेक्ट्स को संभाल सकती है। यह भी अनियंत्रित DataBindingException फेंकता है।

public static String toXmlString(Object o) {
    try {
        Class<?> clazz = o.getClass();
        JAXBContext context = JAXBContext.newInstance(clazz);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output

        final QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
        JAXBElement jaxbElement = new JAXBElement(name, clazz, o);

        StringWriter sw = new StringWriter();
        marshaller.marshal(jaxbElement, sw);
        return sw.toString();

    } catch (JAXBException e) {
        throw new DataBindingException(e);
    }
}

यदि संकलक आपको परेशान करता है, तो यहां टेम्पर्ड, दो पैरामीटर संस्करण है।

public static <T> String toXmlString(T o, Class<T> clazz) {
    try {
        JAXBContext context = JAXBContext.newInstance(clazz);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output

        QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
        JAXBElement jaxbElement = new JAXBElement<>(name, clazz, o);

        StringWriter sw = new StringWriter();
        marshaller.marshal(jaxbElement, sw);
        return sw.toString();

    } catch (JAXBException e) {
        throw new DataBindingException(e);
    }
}

0

XML Stirng बनाने के लिए कुछ सामान्य कोड

ऑब्जेक्ट -> जावा क्लास इसे XML नाम में बदलने के लिए है
-> अंतर के लिए बस नाम की चीज है

public static String convertObjectToXML(Object object,String name) {
          try {
              StringWriter stringWriter = new StringWriter();
              JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
              Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
              jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
              QName qName = new QName(object.getClass().toString(), name);
              Object root = new JAXBElement<Object>(qName,java.lang.Object.class, object);
              jaxbMarshaller.marshal(root, stringWriter);
              String result = stringWriter.toString();
              System.out.println(result);
              return result;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

0

यहाँ मार्शलिंग और अनमैर्शिंग ऑब्जेक्ट के लिए एक उपयोग वर्ग है। मेरे मामले में यह एक नेस्टेड वर्ग था, इसलिए मैंने इसे स्थिर JAXBUtils बना दिया।

import javax.xml.bind.JAXB;
import java.io.StringReader;
import java.io.StringWriter;

public class JAXBUtils
{
    /**
     * Unmarshal an XML string
     * @param xml     The XML string
     * @param type    The JAXB class type.
     * @return The unmarshalled object.
     */
    public <T> T unmarshal(String xml, Class<T> type)
    {
        StringReader reader = new StringReader(xml);
        return javax.xml.bind.JAXB.unmarshal(reader, type);
    }

    /**
     * Marshal an Object to XML.
     * @param object    The object to marshal.
     * @return The XML string representation of the object.
     */
    public String marshal(Object object)
    {
        StringWriter stringWriter = new StringWriter();
        JAXB.marshal(object, stringWriter);
        return stringWriter.toString();
    }
}

-1
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

private String generateXml(Object obj, Class objClass) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(objClass);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter sw = new StringWriter();
        jaxbMarshaller.marshal(obj, sw);
        return sw.toString();
    }

-1

ऑब्जेक्ट को xml स्ट्रिंग में बदलने के लिए इस फ़ंक्शन का उपयोग करें (इसे ConvertToXml (sourceObject, Object .class) के रूप में कहा जाना चाहिए;) ->

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;

public static <T> String convertToXml(T source, Class<T> clazz) throws JAXBException {
    String result;
    StringWriter sw = new StringWriter();
    JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    QName qName = new QName(StringUtils.uncapitalize(clazz.getSimpleName()));
    JAXBElement<T> root = new JAXBElement<T>(qName, clazz, source);
    jaxbMarshaller.marshal(root, sw);
    result = sw.toString();
    return result;
}

Xml स्ट्रिंग को ऑब्जेक्ट बैक में बदलने के लिए इस फ़ंक्शन का उपयोग करें -> (इसे कहा जाना चाहिए createObjectFromXmlString(xmlString, Object.class))

public static <T> T createObjectFromXmlString(String xml, Class<T> clazz) throws JAXBException, IOException{

    T value = null;
    StringReader reader = new StringReader(xml); 
    JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    JAXBElement<T> rootElement=jaxbUnmarshaller.unmarshal(new StreamSource(reader),clazz);
    value = rootElement.getValue();
    return value;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.