原文:http://zetcode.com/java/jaxb/

Java JAXB 教程显示了如何使用 JAXB 库来处理 XML。 这些示例将 Java 对象写入 XML 文件,并将 XML 数据读取到 Java 对象。

JAXB

用于 XML 绑定的 Java 架构(JAXB)是允许 Java 开发者将 Java 类映射到 XML 表示形式的软件框架。 JAXB 支持将 Java 对象编组为 XML,然后将 XML 解组为 Java 对象。

在 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 文档的过程。 解组是将 XML 文档读入 Java 对象的过程。 JAXBContext类提供客户端到 JAXB API 的入口点。 它提供用于编组,解组和验证的 API。

JAXB POM 设置

以下 POM 文件包含必需的 JAXB JAR。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>JavaWriteXmlJaxbEx</groupId>
  8. <artifactId>JavaWriteXmlJaxbEx</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <properties>
  11. <maven.compiler.source>11</maven.compiler.source>
  12. <maven.compiler.target>11</maven.compiler.target>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>javax.xml.bind</groupId>
  17. <artifactId>jaxb-api</artifactId>
  18. <version>2.2.11</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>com.sun.xml.bind</groupId>
  22. <artifactId>jaxb-core</artifactId>
  23. <version>2.2.11</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.sun.xml.bind</groupId>
  27. <artifactId>jaxb-impl</artifactId>
  28. <version>2.2.11</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>javax.activation</groupId>
  32. <artifactId>activation</artifactId>
  33. <version>1.1.1</version>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <artifactId>maven-assembly-plugin</artifactId>
  40. <executions>
  41. <execution>
  42. <phase>package</phase>
  43. <goals>
  44. <goal>single</goal>
  45. </goals>
  46. </execution>
  47. </executions>
  48. <configuration>
  49. <descriptorRefs>
  50. <descriptorRef>jar-with-dependencies</descriptorRef>
  51. </descriptorRefs>
  52. <archive>
  53. <manifest>
  54. <mainClass>com.zetcode.JavaWriteXmlJaxbEx</mainClass>
  55. </manifest>
  56. </archive>
  57. </configuration>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. </project>

除了包括 JAXB 依赖项,我们还使用maven-assembly-plugin将所有依赖项打包到一个 JAR 中。

JAXB 编写 XML 示例

在第一个示例中,我们将 Java 对象写入 XML 文件。

Book.java

  1. package com.zetcode;
  2. import javax.xml.bind.annotation.XmlElement;
  3. import javax.xml.bind.annotation.XmlRootElement;
  4. import javax.xml.bind.annotation.XmlType;
  5. @XmlRootElement(name = "book")
  6. // Defining order
  7. @XmlType(propOrder = { "author", "name", "publisher", "isbn" })
  8. public class Book {
  9. private String name;
  10. private String author;
  11. private String publisher;
  12. private String isbn;
  13. // Changing to title
  14. @XmlElement(name = "title")
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public String getAuthor() {
  22. return author;
  23. }
  24. public void setAuthor(String author) {
  25. this.author = author;
  26. }
  27. public String getPublisher() {
  28. return publisher;
  29. }
  30. public void setPublisher(String publisher) {
  31. this.publisher = publisher;
  32. }
  33. public String getIsbn() {
  34. return isbn;
  35. }
  36. public void setIsbn(String isbn) {
  37. this.isbn = isbn;
  38. }
  39. @Override
  40. public String toString() {
  41. final StringBuilder sb = new StringBuilder("Book{");
  42. sb.append("name='").append(name).append('\'');
  43. sb.append(", author='").append(author).append('\'');
  44. sb.append(", publisher='").append(publisher).append('\'');
  45. sb.append(", isbn='").append(isbn).append('\'');
  46. sb.append('}');
  47. return sb.toString();
  48. }
  49. }

这是Book bean。 该 bean 将被转换为特定的 XML 标签。

  1. @XmlRootElement(name = "book")

使用@XmlRootElement注解,我们定义 XML 标签名称。

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

通过@XmlTypepropOrder属性,我们定义了子元素的顺序。

  1. @XmlElement(name = "title")
  2. public String getName() {
  3. return name;
  4. }

我们可以将默认元素名称更改为title

BookStore.java

  1. package com.zetcode;
  2. import java.util.ArrayList;
  3. import javax.xml.bind.annotation.XmlElement;
  4. import javax.xml.bind.annotation.XmlElementWrapper;
  5. import javax.xml.bind.annotation.XmlRootElement;
  6. //This statement means that class "Bookstore.java" is the root-element of our example
  7. @XmlRootElement(namespace = "com.zetcode")
  8. public class BookStore {
  9. // XmLElementWrapper generates a wrapper element around XML representation
  10. @XmlElementWrapper(name = "bookList")
  11. // XmlElement sets the name of the entities
  12. @XmlElement(name = "book")
  13. private ArrayList<Book> bookList;
  14. private String name;
  15. private String location;
  16. public void setBookList(ArrayList<Book> bookList) {
  17. this.bookList = bookList;
  18. }
  19. public ArrayList<Book> getBooksList() {
  20. return bookList;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public String getLocation() {
  29. return location;
  30. }
  31. public void setLocation(String location) {
  32. this.location = location;
  33. }
  34. }

BookStore是一个类,其中包含一个列表,我们在其中放置书本对象。

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

我们用@XmlRootElement注解定义根元素。

  1. // XmLElementWrapper generates a wrapper element around XML representation
  2. @XmlElementWrapper(name = "bookList")
  3. // XmlElement sets the name of the entities
  4. @XmlElement(name = "book")
  5. private ArrayList<Book> bookList;

@XmlElementWrapper注解在book元素周围定义了包装元素。 @XmlElement注解定义包装器内的 XML 元素的名称。

JavaWriteXmlJaxbEx.java

  1. package com.zetcode;
  2. import javax.xml.bind.JAXBContext;
  3. import javax.xml.bind.JAXBException;
  4. import javax.xml.bind.Marshaller;
  5. import java.io.File;
  6. import java.util.ArrayList;
  7. public class JavaWriteXmlJaxbEx {
  8. private static final String BOOKSTORE_XML = "src/main/resources/bookstore.xml";
  9. public static void main(String[] args) throws JAXBException {
  10. var bookList = new ArrayList<Book>();
  11. // create books
  12. var book1 = new Book();
  13. book1.setIsbn("978-0060554736");
  14. book1.setName("The Game");
  15. book1.setAuthor("Neil Strauss");
  16. book1.setPublisher("Harpercollins");
  17. bookList.add(book1);
  18. var book2 = new Book();
  19. book2.setIsbn("978-3832180577");
  20. book2.setName("Feuchtgebiete");
  21. book2.setAuthor("Charlotte Roche");
  22. book2.setPublisher("Dumont Buchverlag");
  23. bookList.add(book2);
  24. // create bookstore, assign books
  25. var bookstore = new BookStore();
  26. bookstore.setName("Fraport Bookstore");
  27. bookstore.setLocation("Livres belles");
  28. bookstore.setBookList(bookList);
  29. // create JAXB context and instantiate marshaller
  30. var context = JAXBContext.newInstance(BookStore.class);
  31. var m = context.createMarshaller();
  32. m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
  33. // Write to System.out
  34. m.marshal(bookstore, System.out);
  35. // Write to File
  36. m.marshal(bookstore, new File(BOOKSTORE_XML));
  37. }
  38. }

在示例中,我们创建书对象,将它们添加到书店,然后将书店转换为 XML 文件。

  1. // create books
  2. var book1 = new Book();
  3. book1.setIsbn("978-0060554736");
  4. book1.setName("The Game");
  5. book1.setAuthor("Neil Strauss");
  6. book1.setPublisher("Harpercollins");
  7. bookList.add(book1);
  8. var book2 = new Book();
  9. book2.setIsbn("978-3832180577");
  10. book2.setName("Feuchtgebiete");
  11. book2.setAuthor("Charlotte Roche");
  12. book2.setPublisher("Dumont Buchverlag");
  13. bookList.add(book2);

我们创建两个书本对象。

  1. // create bookstore, assign books
  2. var bookstore = new BookStore();
  3. bookstore.setName("Fraport Bookstore");
  4. bookstore.setLocation("Livres belles");
  5. bookstore.setBookList(bookList);

创建了一个书店并将书籍放入其中。

  1. // create JAXB context and instantiate marshaller
  2. var context = JAXBContext.newInstance(BookStore.class);

我们创建一个新的JAXBContext。 我们传递新上下文对象必须识别的类的列表。 (在我们的例子中,这是一类。)

  1. var m = context.createMarshaller();
  2. m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

从上下文中,我们得到了createMarshaller()的编组器。 我们设置一个属性以获取格式化输出。

  1. // Write to System.out
  2. m.marshal(bookstore, System.out);
  3. // Write to File
  4. m.marshal(bookstore, new File(BOOKSTORE_XML));

我们将数据写入系统输出和文件中。

JAXB 读取 XML 示例

在第二个示例中,我们将编组的数据读回到 Java 对象中。

JavaReadXmlJaxbEx.java

  1. package com.zetcode;
  2. import javax.xml.bind.JAXBContext;
  3. import javax.xml.bind.JAXBException;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.InputStreamReader;
  7. import java.nio.charset.StandardCharsets;
  8. public class JavaReadXmlJaxbEx {
  9. private static final String BOOKSTORE_XML = "src/main/resources/bookstore.xml";
  10. public static void main(String[] args) throws JAXBException,
  11. FileNotFoundException {
  12. // create JAXB context and unmarshaller
  13. var context = JAXBContext.newInstance(BookStore.class);
  14. var um = context.createUnmarshaller();
  15. var bookstore = (BookStore) um.unmarshal(new InputStreamReader(
  16. new FileInputStream(BOOKSTORE_XML), StandardCharsets.UTF_8));
  17. var bookList = bookstore.getBooksList();
  18. bookList.forEach((book) -> {
  19. System.out.println(book);
  20. });
  21. }
  22. }

该示例从bookstore.xml文档中读取书籍。

  1. // create JAXB context and unmarshaller
  2. var context = JAXBContext.newInstance(BookStore.class);
  3. var um = context.createUnmarshaller();

我们创建一个 JAXB 上下文并获得一个新的解组器。

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

使用unmarshal(),我们从 XML 文档中读取数据。

  1. var bookList = bookstore.getBooksList();
  2. bookList.forEach((book) -> {
  3. System.out.println(book);
  4. });

我们获得书籍列表并对其进行遍历。

  1. Book{name='The Game', author='Neil Strauss', publisher='Harpercollins', isbn='978-0060554736'}
  2. Book{name='Feuchtgebiete', author='Charlotte Roche', publisher='Dumont Buchverlag', isbn='978-3832180577'}

这是输出。

在本教程中,我们已经使用 Java JAXB 库读写 XML 文件。 您可能也对相关教程感兴趣: Java DOM 教程Java SAX 教程Java JSON 处理教程Java 教程