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 файла:
<?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 документа:
Student{id=1, name='Andrew', age=21, language='Java'}
|
Это был пример сохранения Java-объекта в XML и его восстанавливаем из XML с помощью JAXB.
Скачать проект со всеми исходными кодами.
Подписывайтесь на новые статьи по Java и Android!
Комментариев нет:
Отправить комментарий