JAXB (Java Architecture for XML Binding) — Java API для маршалинга объекта в XML и восстановления объекта из XML файла. Изначально JAXB был отдельным проектом, но своей простотой и удобством быстро завоевал популярность Java разработчиков. Именно поэтому в Java 6 JAXB стал частью JDK, а в Java 7 прокачался до версии 2.0.
Ранее мы уже работали с XML в Java с помощью JDOM Parser, StAX Cursor API, DOM Parser и других способов, а в этой статье научимся отображать (ставить в соответствие) Java классы и XML файлы с помощью JAXB.
Теория по JAXB
JAXB использует аннотации, поэтому работать с ним легко и просто. Чтобы сохранить Java объект в XML файл, мы должны проставить необходимые JAXB аннотации в классе и методах класса, а затем создать объект Marshaller
для преобразования/сериализации/сохранения/маршалинга (кому как удобно это называть) объекта в XML.
Также есть специальный класс JAXBContext
, который является точкой входа для JAXB и предоставляет методы для сохранения/восстановления объекта.
Основные JAXB аннотации
- Аннотация
@XmlRootElement
определяет корневой элемент для содержимого XML. - Аннотация
@XmlType
используется для упорядочения элементов в XML. - Аннотацией
@XmlTransient
помечается то, что не будет не записано в XML. - Аннотацией
@XmlAttribute
помечается то, что будет использовано в качестве атрибута. - Аннотация
@XmlElement(name="qwerty")
— создаст элемент с именем «qwerty».
Также часто используются следующие аннотации:
@XmlElementWrapper
— обертка вокруг коллекций для читабельности сгенерированного XML- Объекты другого класса помечаются аннотацией
@XmlSeeAlso
. @XmlEnum
и@XmlEnumValue
— для Enum и значений@XmlElements
— создание контейнеров для нескольких@XmlElement
Подробнее с другими аннотациями вы можете ознакомиться на официальном сайте JAXB.
Сохраняем Java объект в XML и восстанавливаем его с помощью JAXB
Ниже представлена простая программа преобразования объекта в XML и его обратная конвертация из XML в Java объект.
Создадим класс Student и расставим нужные нам аннотации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
package ua.com.prologistic.jaxb.model; import javax.xml.bind.annotation.*; // определяем корневой элемент @XmlRootElement(name = "Student") // определяем последовательность тегов в XML @XmlType(propOrder = {"name", "age", "language"}) public class Student { private int id; private String name; private int age; private String language; private String studPassword; public Student() { } public Student(int id, String name, int age, String language) { this.id = id; this.name = name; this.age = age; this.language = language; } // указываем, что id должно быть атрибутом @XmlAttribute public int getId() { return id; } // указываем, что мы не хотим сохранять пароль в XML @XmlTransient public String getPassword() { return studPassword; } // указываем, что поле language должно быть представлено в XML как lang @XmlElement(name = "lang") public String getLanguage() { return language; } public void setId(int id) { this.id = id; } public void setPassword(String studPassword) { this.studPassword = studPassword; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void setLanguage(String language) { this.language = language; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", language='" + language + '\'' + '}'; } } |
Теперь создадим класс JaxbWorker, который будет преобразовывать Java объект в XML и считывать его обратно из XML в Java объект:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package ua.com.prologistic.jaxb; import ua.com.prologistic.jaxb.model.Student; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.File; public class JaxbWorker { public static void main(String[] args) { // определяем название файла, куда будем сохранять String fileName = "F:/students.xml"; //создаем объект Student с какими-то данными Student student = new Student(); student.setId(1); student.setAge(21); student.setName("Andrew"); student.setLanguage("Java"); student.setPassword("simplepassword"); // сохраняем объект в XML файл convertObjectToXml(student, fileName); // восстанавливаем объект из XML файла Student unmarshStudent = fromXmlToObject(fileName); if (unmarshStudent != null) { System.out.println(unmarshStudent.toString()); } } // восстанавливаем объект из XML файла private static Student fromXmlToObject(String filePath) { try { // создаем объект JAXBContext - точку входа для JAXB JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); Unmarshaller un = jaxbContext.createUnmarshaller(); return (Student) un.unmarshal(new File(filePath)); } catch (JAXBException e) { e.printStackTrace(); } return null; } // сохраняем объект в XML файл private static void convertObjectToXml(Student student, String filePath) { try { JAXBContext context = JAXBContext.newInstance(Student.class); Marshaller marshaller = context.createMarshaller(); // устанавливаем флаг для читабельного вывода XML в JAXB marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // маршаллинг объекта в файл marshaller.marshal(student, new File(filePath)); } catch (JAXBException e) { e.printStackTrace(); } } } |
Теперь запустим нашу программу и посмотрим содержимое сгенерированного XML файла:
1 2 3 4 5 6 |
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Student id="1"> <name>Andrew</name> <age>21</age> <lang>Java</lang> </Student> |
Как видите, здесь есть все, что мы указали в аннотациях:
- Поле language сохранилось, как lang благодаря аннотации
@XmlElement(name = "lang")
- Поле studPassword было проигнорировано благодаря аннотации
@XmlTransient
И смотри на вывод в консоль восстановленных данных из XML документа:
1 |
Student{id=1, name='Andrew', age=21, language='Java'} |
Это был пример сохранения Java-объекта в XML и его восстанавливаем из XML с помощью JAXB.
Скачать проект со всеми исходными кодами.
Подписывайтесь на новые статьи по Java и Android!
Спасибо большое, отличная статья!
а если существуют вложенные объекты?
т.е. поля класса представлены другими классами?