Ya, ya saya tahu banyak pertanyaan yang diajukan tentang topik ini. Tetapi saya masih tidak dapat menemukan solusi untuk masalah saya. Saya memiliki properti objek Java beranotasi. Misalnya Pelanggan, seperti pada contoh ini . Dan saya ingin representasi String darinya. Google merekomendasikan penggunaan JAXB untuk tujuan tersebut. Tetapi dalam semua contoh file XML yang dibuat dicetak ke file atau konsol, seperti ini:
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);
Tetapi saya harus menggunakan objek ini dan mengirim melalui jaringan dalam format XML. Jadi saya ingin mendapatkan String yang mewakili XML.
String xmlString = ...
sendOverNetwork(xmlString);
Bagaimana saya bisa melakukan ini?
StringWriter
sangat tua. Di bawah sampul itu menggunakan diStringBuffer
mana pendekatan yang jauh lebih cepat akan digunakanStringBuilder
tetapi itu tidak ada ketika StringWriter pertama kali dibuat. Karena itu, setiap panggilansw.toString()
menyiratkan sinkronisasi. Buruk jika Anda mencari kinerja.Pilihan yang mudah adalah menggunakan javax.xml.bind.JAXB :
StringWriter sw = new StringWriter(); JAXB.marshal(customer, sw); String xmlString = sw.toString();
Proses kebalikannya (unmarshal) akan menjadi:
Customer customer = JAXB.unmarshal(new StringReader(xmlString), Customer.class);
Tidak perlu berurusan dengan pengecualian yang dicentang dalam pendekatan ini.
sumber
Seperti yang disebutkan A4L, Anda dapat menggunakan StringWriter. Memberikan kode contoh di sini:
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; }
sumber
Anda dapat
StringWriter
mengaturnya ke a dan mengambil senarnya. daritoString()
.sumber
StringWriter
. Tautannya hanyalah dokumentasi.StringWriter
, berikan kemarshal()
, panggiltoString()
.Marshaller
memiliki beberapa metode kelebihan beban marshal, lihat saja parameternya dan untuk apa mereka dan Anda akan menemukan jawabannya.Untuk mengonversi Objek ke XML di 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); } }
Coba dengan contoh ini ..
sumber
Menguji Dan bekerja kode Java untuk mengonversi objek java ke 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); } }
sumber
Menggunakan 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(); }
sumber
Saya mengambil implementasi JAXB.marshal dan menambahkan jaxb.fragment = true untuk menghapus prolog XML. Metode ini dapat menangani objek bahkan tanpa anotasi XmlRootElement. Ini juga melempar DataBindingException yang tidak dicentang.
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); } }
Jika peringatan compiler mengganggu Anda, berikut adalah versi template dua parameter.
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); } }
sumber
Beberapa kode Generik untuk membuat XML Stirng
object -> adalah kelas Java untuk mengubahnya menjadi nama XML
-> hanyalah ruang nama seperti benda - untuk membedakan
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; }
sumber
Berikut adalah kelas util untuk objek marshaling dan unmarshaling. Dalam kasus saya, itu adalah kelas bersarang, jadi saya membuatnya menjadi JAXBUtils statis.
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(); } }
sumber
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(); }
sumber
Gunakan fungsi ini untuk mengonversi Objek menjadi string xml (harus disebut sebagai 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; }
Gunakan fungsi ini untuk mengubah string xml menjadi Object back -> (harus disebut sebagai
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; }
sumber