Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

воскресенье, 29 мая 2016 г.

Пример работы с JAXB. Сохраняем Java объект в XML, восстанавливаем объект из XML / Программирование на Java

JAXB (Java Architecture for XML Binding) — Java API для маршалинга объекта в XML и восстановления объекта из XML файла. Изначально JAXB был отдельным проектом, но своей простотой и удобством быстро завоевал популярность Java разработчиков. Именно поэтому в Java 6 JAXB стал частью JDK, а в Java 7 прокачался до версии 2.0.

Ранее мы уже работали с XML в Java с помощью JDOM ParserStAX Cursor APIDOM 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!

Комментариев нет:

Отправить комментарий