Преобразование объекта Java в строку XML
Да, да я знаю, что много вопросов было задано по этой теме. Но я все еще не могу найти решение моей проблемы. У меня есть свойство аннотированный объект 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. Так Я хочу получить строку, которая представляет XML.
String xmlString = ...
sendOverNetwork(xmlString);
Как я могу это сделать?
10 ответов:
вы можете использовать метод Маршалера для маршалинга, который принимает писатель параметр:
и передать ему реализацию, которая может построить строковый объект
Прямые Известные Подклассы: BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
звоните его toString метод для получения фактического строкового значения.
делаю так:
StringWriter sw = new StringWriter(); jaxbMarshaller.marshal(customer, sw); String xmlString = sw.toString();
как 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; }
удобный вариант-использовать javax.XML.связывать.JAXB:
StringWriter sw = new StringWriter(); JAXB.marshal(customer, sw); String xmlString = sw.toString();обратный процесс (unmarshal) будет:
Customer customer = JAXB.unmarshal(new StringReader(xmlString), Customer.class);нет необходимости иметь дело с проверенными исключениями в этом подходе.
вы можете маршалировать его в
StringWriterи захватить его строку. отtoString().
чтобы преобразовать объект в XML в Java
клиент.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); } }попробуйте с этим примером..
тестирование и работа Java-кода для преобразования объекта java в XML:
клиент.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); } }
Используя 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(); }
некоторый общий код для создания 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; }
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(); }
используйте эту функцию для преобразования объекта в строку xml (должен вызываться как convertToXml (sourceObject, Object.класс); )-->
импорт пакета javax.XML.связывать.JAXBContext;
импорт пакета javax.XML.связывать.JAXBElement;
импорт пакета javax.XML.связывать.JAXBException;
импорт пакета javax.XML.связывать.Маршалл;
импорт пакета javax.XML.связывать.Он вызывается;
импорт пакета javax.XML.пространство имен.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.класс))
public static T createObjectFromXmlString (String xml, Class clazz) бросает 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; }
Comments