Java JAXB示例
在本文中,我们将向您展示如何使用JAXB API在Java对象与XML之间进行转换。
JAXB
用于XML绑定的Java体系结构(JAXB)提供了一种快速便捷的方法来绑定XML模式和Java表示,从而使Java开发人员可以轻松地将XML数据和处理功能合并到Java应用程序中。作为此过程的一部分,JAXB提供了以下方法:将XML实例文档解组(读取)到Java内容树中,然后将Java内容树编组(写入)到XML实例文档中。JAXB还提供了一种从Java对象生成XML模式的方法。
编组(Marshalling) 是将Java对象转换为XML文档的过程。
解组(Unmarshalling ) 是将XML文档读入Java对象的过程。
在Java 9中,JAXB已移至单独的模块 java.xml中。在 Java 9 和 Java 10中, 我们需要使用 --add-modules = java.xml.bind 选项。在Java 11中,JAXB已从JDK中删除,我们需要将其作为单独的库添加到项目中。
JAXB绑定过程
下图显示了JAXB绑定过程中发生的情况。
JAXB数据绑定过程中的一般步骤是:
• 生成类: XML模式用作JAXB绑定编译器的输入,以基于该模式生成JAXB类。
• 编译类:必须编译所有生成的类,源文件和应用程序代码。
• 解组:根据源模式中的约束编写的XML文档由JAXB绑定框架解组。注意,JAXB还支持从文件和文档以外的源(例如DOM节点,字符串缓冲区,SAX源等)解组XML数据。
• 生成内容树:解组过程生成从生成的JAXB类实例化的数据对象的内容树;该内容树表示源XML文档的结构和内容。
• 验证(可选):编组过程包括在生成内容树之前验证源XML文档。请注意,如果您在步骤6中修改了内容树,则还可以使用JAXB Validate操作来验证更改,然后再将内容编组回XML文档。
• 处理内容:客户端应用程序可以使用绑定编译器生成的接口来修改Java内容树表示的XML数据。
• 编组:将处理后的内容树编组到一个或多个XML输出文档中。可以在编组之前验证内容。
Java JAXB示例
让我们 使用JAXB API将Java对象与XML进行相互转换。
开发步骤
1.创建项目
2.添加库
3.创建POJO类并添加JAXB批注
4.将Java对象转换为XML
5.将XML转换为Java对象
1.创建项目
2.添加库
添加必需的JAXB JAR,jaxb-api,jaxb-core,jaxb-impl,activation。
3.创建POJO类并添加JAXB批注
一些基本和有用的JAXB注释是:
1. @XmlRootElement:这是要在JAXB中使用的对象的必需注释。它定义了XML内容的根元素。
2. @XmlType:它将类映射到XML模式类型。我们可以使用它来对XML中的元素进行排序。
3. @XmlTransient:这将确保不将Object属性写入XML。
4. @XmlAttribute:这将创建Object属性作为属性。
5. @XmlElement(name =“ ABC”):这将创建名称为“ ABC”的元素
3.1 Book POJO类
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;
}
}
3.2 Bookstore POJO类
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(namespace = "net.javaguides.javaxmlparser.jaxb")
public class Bookstore {
@XmlElementWrapper(name = "bookList")
@XmlElement(name = "book")
private List<Book> bookList;
private String name;
private String location;
public void setBookList(List<Book> bookList) {
this.bookList = bookList;
}
public List<Book> 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;
}
}
4.将Java对象转换为XML
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
/**
* Marshaller Class - Convert Java Object to XML
*
* @author Ramesh Fadatare
*
*/
public class BookMain {
private static final String BOOKSTORE_XML = "bookstore-jaxb.xml";
public static void main(String[] args) throws JAXBException, IOException {
List<Book> bookList = new ArrayList<Book>();
// create books
Book book1 = new Book();
book1.setIsbn("978-0134685991");
book1.setName("Effective Java");
book1.setAuthor("Joshua Bloch");
book1.setPublisher("Amazon");
bookList.add(book1);
Book book2 = new Book();
book2.setIsbn("978-0596009205");
book2.setName("Head First Java, 2nd Edition");
book2.setAuthor("Kathy Sierra");
book2.setPublisher("amazon");
bookList.add(book2);
// create bookstore, assigning book
Bookstore bookstore = new Bookstore();
bookstore.setName("Amazon Bookstore");
bookstore.setLocation("Newyorkt");
bookstore.setBookList(bookList);
convertObjectToXML(bookstore);
}
private static void convertObjectToXML(Bookstore bookstore) throws JAXBException, FileNotFoundException {
// create JAXB context and instantiate marshaller
JAXBContext context = JAXBContext.newInstance(Bookstore.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// Write to System.out
m.marshal(bookstore, System.out);
// Write to File
m.marshal(bookstore, new File(BOOKSTORE_XML));
}
}
上面的程序创建一个名为bookstore-jaxb.xml的文件,并将 Book对象存储到此XML文件中:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:bookstore
xmlns:ns2="net.javaguides.javaxmlparser.jaxb">
<bookList>
<book>
<author>Joshua Bloch</author>
<title>Effective Java</title>
<publisher>Amazon</publisher>
<isbn>978-0134685991</isbn>
</book>
<book>
<author>Kathy Sierra</author>
<title>Head First Java, 2nd Edition</title>
<publisher>amazon</publisher>
<isbn>978-0596009205</isbn>
</book>
</bookList>
<location>Newyorkt</location>
<name>Amazon Bookstore</name>
</ns2:bookstore>
5.将XML转换为Java对象
让我们将上面示例中生成的XML文档转换为Java对象。
让我们将 bookstore-jaxb.xml 文档转换为Java Object:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
/**
* Unmarshaller Class - Convert XML to Object in Java
*
* @author Ramesh Fadatare
*
*/
public class BookMain2 {
private static final String BOOKSTORE_XML = "bookstore-jaxb.xml";
public static void main(String[] args) throws JAXBException, IOException {
convertXMLToObject();
}
private static Bookstore convertXMLToObject() {
try {
JAXBContext context = JAXBContext.newInstance(Bookstore.class);
Unmarshaller un = context.createUnmarshaller();
Bookstore bookstore = (Bookstore) un.unmarshal(new File(BOOKSTORE_XML));
List<Book> list = bookstore.getBooksList();
for (Book book : list) {
System.out.println("Book: " + book.getName() + " from " + book.getAuthor());
}
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
}
输出:
Book: Effective Java from Joshua Bloch
Book: Head First Java, 2nd Edition from Kathy Sierra
结论
在本文中,我们已经看到了如何使用JAXB API在Java对象与XML之间进行转换。