JAXB(Java Architecture for XML Binding )是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
根据XML Schema生成相对应的Java类:
XML Schema与特定XML的关系类似于Java 类和 实例之间的关系。以下根据特定的Schema生成相对应的Java类,然后实例化这些Java对象,再反向生成XMl文件
利用Jaxb的xjc命令直接就可以生成java类:
示例:
xjc bookstore.xsd -d src -p jaxb
bookstore.xsd是Schema的文件名,一般以xsd作为文件名的后缀。
-d 的选项,是指定系统生成的Java源代码所放置的目录,示例中为:src
-p 的选项,是指定系统生成的Java源代码所在的Java Package的名称,示例中为:jaxb
这样就会在jaxb包下的src下生成给定的bookstore.xsd Schema文件对应的java类。在本例中分别生成了AuthorName.java Bookstore.java BookType.java objectFactory.java
接下来就是实例化了,代码示例如下:
public class JavaObject2Xml {
public void javaToXml(){
try{
JAXBContext jc = JAXBContext.newInstance("jaxb"); //参数为JAXB生成的java文件所在包名
ObjectFactory objFactory = new ObjectFactory(); //生成对象工厂
//通过工厂创建复杂类型及子元素
BookstoreType bookstoreType=objFactory.createBookstoreType();
bookstoreType.book=new ArrayList();
BookType bookType_1=objFactory.createBookType();
BookType bookType_2=objFactory.createBookType();
AuthorName author_1=objFactory.createAuthorName();
//创建子元素实例
author_1.setFirstName("Martin");
author_1.setLastName("Ma");
AuthorName author_2=objFactory.createAuthorName();
author_2.setFirstName("Laura");
author_2.setLastName("Li");
bookType_1.setAuthor(author_1);
bookType_1.setGenre("ScienceFiction");
bookType_1.setPrice(new BigDecimal(40.0));
bookType_1.setTitle("The Secret of universe");
bookType_2.setAuthor(author_2);
bookType_2.setGenre("ComputerScience");
bookType_2.setPrice(new BigDecimal(70.0));
bookType_2.setTitle("Datastructure and Algorithms");
bookstoreType.book.add(bookType_1);
bookstoreType.book.add(bookType_2);
//于Marshaller和Unmarshaller,这两个对象主要是用于Java对象和XML文档互相转换的主要接口
JAXBElement bookstoreE=objFactory.createBookstore(bookstoreType);
javax.xml.bind.Marshaller marshaller = jc.createMarshaller();
//生成符合给定schema的xml文件
marshaller.marshal(bookstoreE,new FileOutputStream("F:/Java workspace/jaxb/bookstore.xml"));
}
catch(Exception e){
e.printStackTrace();
}
}