แปลงวัตถุ Java เป็นสตริง XML


92

ใช่ฉันรู้ว่ามีคำถามมากมายเกี่ยวกับหัวข้อนี้ แต่ฉันยังไม่พบวิธีแก้ปัญหาของฉัน ฉันมีคุณสมบัติที่ใส่คำอธิบายประกอบวัตถุ Java ตัวอย่างเช่นลูกค้าเช่นในตัวอย่างนี้ และฉันต้องการการแสดงสตริงของมัน 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 ที่แสดงถึง XML

String xmlString = ...
sendOverNetwork(xmlString);

ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


114

คุณสามารถใช้วิธีการ Marshaler สำหรับการจัดระเบียบซึ่งใช้Writerเป็นพารามิเตอร์:

จอมพล (Object, Writer)

และส่งผ่าน Implementation ซึ่งสามารถสร้างอ็อบเจกต์ String

คลาสย่อยที่รู้จักโดยตรง: BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

เรียกเมธอดtoStringเพื่อรับค่า String ที่แท้จริง

ดังนั้นการทำ:

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

4
StringWriterเก่ามาก ภายใต้ฝาครอบจะใช้วิธีStringBufferที่เร็วกว่ามากที่จะใช้StringBuilderแต่ไม่มีอยู่เมื่อ StringWriter ถูกสร้างขึ้นครั้งแรก ด้วยเหตุนี้การเรียกทุกครั้งจึงsw.toString()หมายถึงการซิงโครไนซ์ แย่มากถ้าคุณกำลังมองหาประสิทธิภาพ
peterh

2
@peterh คำตอบทั้งหมดที่นี่ใช้ StringWriter คุณจะแนะนำอะไรแทน
Christopher Schneider

1
jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); ใช้สิ่งนี้เพื่อรับโครงสร้างที่แน่นอนของ XML
Das Prakash

37

ตัวเลือกที่สะดวกคือใช้javax.xml.bind.JAXB :

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

กระบวนการย้อนกลับ (unmarshal) จะเป็น:

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

ไม่จำเป็นต้องจัดการกับข้อยกเว้นที่ตรวจสอบแล้วในแนวทางนี้


สิ่งนี้จะไม่คัดลอกช่องที่มีเฉพาะ getters
gyosifov

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);
Dmitry Gr

6

คุณสามารถจัดให้เป็นStringWriterและคว้าสตริงได้ จากtoString().


@KickButtowski: ส่วนสำคัญของคำตอบคือการใช้ไฟล์StringWriter. ลิงค์เป็นเพียงเอกสารประกอบ
SLaks

โปรดเพิ่มคำอธิบายและยินดีที่ฉันจะลบการโหวตลง :) ข้างคุณสามารถใส่ความคิดเห็นนี้ได้
Kick Buttowski

คุณสามารถให้ตัวอย่างการใช้งานได้หรือไม่?
Bob

@ บ็อบ: สร้างStringWriterส่งต่อให้marshal()โทรtoString().
SLaks

2
@ บ็อบคำตอบนี้เพียงพอจริง โปรดเรียนรู้วิธีการค้นคว้า API ในตัวอย่างนี้Marshallerมีวิธีการโอเวอร์โหลดหลายวิธีเพียงแค่ดูพารามิเตอร์และสิ่งที่พวกเขาใช้แล้วคุณจะพบคำตอบ
A4L

3

ในการแปลง Object เป็น XML ใน Java

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);
}

}

ลองดูตามตัวอย่างนี้ ..


2

การทดสอบและใช้งานโค้ด Java เพื่อแปลงวัตถุ java เป็น 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 prefect

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 และเพิ่ม jaxb.fragment = true เพื่อลบ XML prolog วิธีนี้สามารถจัดการกับวัตถุได้แม้ไม่มีคำอธิบายประกอบ 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

วัตถุ -> เป็นคลาส Java ที่จะแปลงเป็นชื่อ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

ใช้ฟังก์ชันนี้เพื่อแปลง Object เป็นสตริง 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 เป็น Object back -> (ควรเรียกว่าเป็น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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.