Перейти к контенту

Использование Java JAXB на примерах

В этом уроке покажу как использовать библиотеку JAXB для работы с XML. На примерах рассмотрим как объекты Java записываются в файлы XML, а данные XML считываются в объекты.

Java Architecture for XML Binding (JAXB) — это программная структура, которая позволяет разработчикам отображать классы Java в представления XML. JAXB позволяет делать сохранение объекта в файл и обратно в объекты.

 

В Java 9 JAXB переместился в отдельный модуль java.xml. В Java 9 и Java 10 нам нужно использовать параметр —add-modules = java.xml.bind. В Java 11 JAXB был удален из JDK, и нам нужно добавить его в проект в виде отдельной библиотеки через Maven или Gradle.

В наших примерах мы используем JDK 11 и Maven для создания наших приложений.

Определение JAXB — что это?

Маршалинг — это процесс преобразования объектов Java в документы XML. Unmarshalling — это процесс чтения документов XML в объекты Java. Класс JAXBContext обеспечивает точку входа клиента в API JAXB. Он предоставляет API для маршалинга, демаршалинга(unmarshal) и проверки.

Следующий файл POM содержит необходимые JAR JAXB настройки.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>JavaWriteXmlJaxbEx</groupId>
    <artifactId>JavaWriteXmlJaxbEx</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>

                    <archive>
                        <manifest>
   <mainClass>com.zetcode.JavaWriteXmlJaxbEx</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

В дополнение к включению зависимостей JAXB мы используем плагин maven-assembly-plugin, чтобы упаковать все зависимости в один JAR-файл.

Пример использования JAXB для записи XML

В первом примере мы записываем объекты Java в файл XML.

package com.zetcode;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "book")

// Определение порядка
@XmlType(propOrder = { "author", "name", "publisher", "isbn" })
public class Book {

    private String name;
    private String author;
    private String publisher;
    private String isbn;

    // Смена названия
    @XmlElement(name = "title")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Book{");
        sb.append("name='").append(name).append('\'');
        sb.append(", author='").append(author).append('\'');
        sb.append(", publisher='").append(publisher).append('\'');
        sb.append(", isbn='").append(isbn).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

Этот bean-компонент будет преобразован в определенный тег XML.

@XmlRootElement(name = "book")

С помощью аннотации @XmlRootElement мы определяем имя тега XML.

@XmlType(propOrder = { "author", "name", "publisher", "isbn" })

С помощью атрибута propOrder @ XmlType мы определяем порядок подэлементов.

@XmlElement(name = "title")
public String getName() {
return name;
}

Мы можем изменить имя элемента по умолчанию на заголовок.

package com.zetcode;

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

//класс "Bookstore.java" является корневым элементом нашего примера.
@XmlRootElement(namespace = "com.zetcode")
public class BookStore {

    // XmLElementWrapper генерирует элемент-оболочку вокруг представления XML
    @XmlElementWrapper(name = "bookList")
    // XmlElement устанавливает имя
    @XmlElement(name = "book")
    private ArrayList bookList;
    private String name;
    private String location;

    public void setBookList(ArrayList bookList) {
        this.bookList = bookList;
    }

    public ArrayList getBooksList() {
        return bookList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}

BookStore — это класс, который содержит список, в который мы помещаем наши объекты книги.

@XmlRootElement(namespace = "com.zetcode")
public class BookStore {

Мы определяем корневой элемент с помощью аннотации @XmlRootElement.

 

// XmLElementWrapper генерирует элемент-оболочку вокруг представления XML
@XmlElementWrapper(name = "bookList")
// XmlElement устанавливает имя
@XmlElement(name = "book")
private ArrayList bookList;

Аннотация @XmlElementWrapper определяет элемент-обертку вокруг элементов книги. Аннотация @XmlElement определяет имя элемента XML, который находится внутри оболочки.

package com.zetcode;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.File;
import java.util.ArrayList;

public class JavaWriteXmlJaxbEx {

    private static final String BOOKSTORE_XML = "src/main/resources/bookstore.xml";

    public static void main(String[] args) throws JAXBException {

        var bookList = new ArrayList();

        // создаем объекты книги, добавляем их в книжный магазин 
        // и преобразуем книжный магазин в файл XML.
        var book1 = new Book();
        book1.setIsbn("978-0060554736");
        book1.setName("The Game");
        book1.setAuthor("Neil Strauss");
        book1.setPublisher("Harpercollins");
        bookList.add(book1);

        var book2 = new Book();
        book2.setIsbn("978-3832180577");
        book2.setName("Feuchtgebiete");
        book2.setAuthor("Charlotte Roche");
        book2.setPublisher("Dumont Buchverlag");
        bookList.add(book2);

        // Мы создаем два объекта книги.
        var bookstore = new BookStore();
        bookstore.setName("Fraport Bookstore");
        bookstore.setLocation("Livres belles");
        bookstore.setBookList(bookList);

        // Мы создаем новый JAXBContext. 
        // передаем список классов, которые должен распознать новый объект контекста. 
        var context = JAXBContext.newInstance(BookStore.class);
        var m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        // записать System.out
        m.marshal(bookstore, System.out);

        // Из контекста получаем маршалер с помощью createMarshaller(). 
        // устанавливаем свойство для получения форматированного вывода.
        m.marshal(bookstore, new File(BOOKSTORE_XML));
    }
}

jaxb java как работает

Пример чтения XML JAXB (unmarshal)

Во втором примере мы считываем данные обратно в объекты Java.

package com.zetcode;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class JavaReadXmlJaxbEx {

    private static final String BOOKSTORE_XML = "src/main/resources/bookstore.xml";

    public static void main(String[] args) throws JAXBException, 
            FileNotFoundException {

        // создаем JAXB-контекст и unmarshal
        var context = JAXBContext.newInstance(BookStore.class);
        var um = context.createUnmarshaller();

        var bookstore = (BookStore) um.unmarshal(new InputStreamReader(
                new FileInputStream(BOOKSTORE_XML), StandardCharsets.UTF_8));
        var bookList = bookstore.getBooksList();

        bookList.forEach((book) -> {
            System.out.println(book);
        });
    }
}

Получаем список книг:
Book{name='The Game', author='Neil Strauss', publisher='Harpercollins', isbn='978-0060554736'}
Book{name='Feuchtgebiete', author='Charlotte Roche', publisher='Dumont Buchverlag', isbn='978-3832180577'}

Оцени статью

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)