JAXB (Java Architecture for XML Binding) дозволяє швидко розпакувати (unmarshall) xml файл у об’єкти та згенерувати/запакувати (marshall) xml із об’єкту. JAXB використовується, зокрема, при розробці RESTtful Веб-сервісів, коли необхідно швидко згенерувати xml у якості відповіді клієнту або розпакувати із http запиту.
Для прикладу є простий XML документ:
Метод toString() заміщено для наглядності, щоб перевірити чи ми дійсно прочитали xml елементи у поля класу.
Наступний клас дозволяє нам розпакувати нам наш XML у екземпляр класу Data
Генерування XML (marshalling)
Оскільки ми маємо об’єкт data можемо зворотно згенерувати XML . Для цього додаємо наступний код:
Замість System.out можна написати new File(“D:\\mytest.xml”) і зберегти таким чином згенерований xml на диску.
Генерування xml із групи об’єктів
Допустимо необхідно згенерувати xml, який містить декілька об’єктів Data в одному xml файлі. Для цього необхідно створити об'єкт, який би згрупував би наші об'єкти тобто помістити їх у колекцію, наприклад, у List.
Перепишемо наш клас Data згенерувавши геттер і сеттер методи. Це дасть можливість нам створити декілька різних екземплярів Data.
Створимо клас DataArray:
Генеруємо xml (TestJAXB2.java)
Результат:
• https://keyholesoftware.com/2014/07/21/jaxb-part-1/
• https://keyholesoftware.com/2014/08/25/jaxb-part-2/
• https://howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/
• https://www.mysoftkey.com/java/jaxb-nested-list-of-java-object-example/
Для прикладу є простий XML документ:
<?xml version="1.0" encoding="UTF-8"?> <Data> <id>1</id> <name>Галина Мер</name> <mobile>+380970000001</mobile> </Data>Для того, щоб розпакувати наш xml об'єкт нам потрібен клас із відповідною анотацією.
package ua.volodimirg; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="Data") public class Data { @XmlElement(name = "id") private int id; @XmlElement(name = "name") private String name; @XmlElement(name = "mobile") private String mobile; @Override public String toString() { return "Data [id=" + id + ", name=" + name + ", mobile=" + mobile + "]"; } }Параметр name необхідно вказувати, якщо назви елементів xml відрізняються від назви полів класу. В нашому випадку анотацію біля полів @XmlElement(name = "") можна упустити, якщо реалізувати геттер та сеттер методи. В такому вигляді, без геттер і сеттер методів, якщо цю анотацію опустити, то розпакування не відбудеться.
Метод toString() заміщено для наглядності, щоб перевірити чи ми дійсно прочитали xml елементи у поля класу.
Наступний клас дозволяє нам розпакувати нам наш XML у екземпляр класу Data
package ua.volodimirg; import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; public class TestJAXB { public static void main(String[] args) { try { JAXBContext jaxb = JAXBContext.newInstance(Data.class); Unmarshaller unmarshaller = jaxb.createUnmarshaller(); File xmlFile = new File("D:\\testjaxb.xml"); Data data = (Data) unmarshaller.unmarshal(xmlFile); System.out.println(data); } catch (JAXBException e) { e.printStackTrace(); } } }Результат виконання:
Data [id=1, name=Галина Мер, mobile=+380970000001]
Генерування XML (marshalling)
Оскільки ми маємо об’єкт data можемо зворотно згенерувати XML . Для цього додаємо наступний код:
//створити пакувальника Marshaller marshaller = jaxb.createMarshaller(); //запакувати об'єкт в читабельній для людей формі, // тобто відформатований по рядках marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // запакувати об'єкт data в XML та вивести на консоль marshaller.marshal(data, System.out);
Замість System.out можна написати new File(“D:\\mytest.xml”) і зберегти таким чином згенерований xml на диску.
Генерування xml із групи об’єктів
Допустимо необхідно згенерувати xml, який містить декілька об’єктів Data в одному xml файлі. Для цього необхідно створити об'єкт, який би згрупував би наші об'єкти тобто помістити їх у колекцію, наприклад, у List.
Перепишемо наш клас Data згенерувавши геттер і сеттер методи. Це дасть можливість нам створити декілька різних екземплярів Data.
package ua.volodimirg; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="Data") public class Data { private int id; private String name; private String mobile; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } @Override public String toString() { return "Data [id=" + id + ", name=" + name + ", mobile=" + mobile + "]"; } }
Створимо клас DataArray:
package ua.volodimirg; import java.util.List; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="DataArray") public class DataArray { List dataArray=null; public List getDataArray() { return dataArray; } public void setDataArray(List dataArray) { this.dataArray = dataArray; } @Override public String toString() { return "DataArray [dataArray=" + dataArray + "]"; } }
Генеруємо xml (TestJAXB2.java)
package ua.volodimirg; import java.util.ArrayList; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; public class TestJAXB2 { public static void main(String[] args) { //створюємо об'єкти data Data data1=new Data(); data1.setId(1); data1.setMobile("+380970000001");; data1.setName("Галина Мер"); Data data2=new Data(); data2.setId(2); data2.setMobile("+380950000002");; data2.setName("Петро Гак"); //створюємо екземпляр dataArray DataArray dataArray=new DataArray(); dataArray.setDataArray(new ArrayList()); //додаємо об'єкти у список dataArray.getDataArray().add(data1); dataArray.getDataArray().add(data2); //генеруємо xml JAXBContext jaxb; try { jaxb = JAXBContext.newInstance(DataArray.class); Marshaller marshaller = jaxb.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(dataArray, System.out); } catch (JAXBException e) { e.printStackTrace(); } } }
Результат:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DataArray> <dataArray> <id>1</id> <mobile>+380970000001</mobile> <name>Галина Мер</name> </dataArray> <dataArray> <id>2</id> <mobile>+380950000002</mobile> <name>Петро Гак</name> </dataArray> </DataArray>Джерела:
• https://keyholesoftware.com/2014/07/21/jaxb-part-1/
• https://keyholesoftware.com/2014/08/25/jaxb-part-2/
• https://howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/
• https://www.mysoftkey.com/java/jaxb-nested-list-of-java-object-example/
Немає коментарів:
Дописати коментар