JAXB学习笔记
Preface
- 因为到处都在说JAXB是个很有用的工具,而之前了解过一些远程方法调用(RMI,remote method invokation)过程中java 对象的序列化和反序列化过程。所谓好奇害死猫嘛,所以就这样开坑了。
名词解释
- **JAXB: **java architecture for xml binding
- Marshaling: 将java对象转化成XML的过程
- UnMarshaling: 将XML转化成为java对象的过程
正文
JAXB解析那些被标签标记的类并通过这些信息将XML转化成为Java对象/将Java对象转化成为XML文档。在DOM Approach的方法中,先将XML文档转化成为内存中的节点树,对之后程序员的工作量要求较高。而JAXB避免了这样简单粗暴的转化,并且将XML中的节点和一个java类特定的部分绑定。每一个JAXB的实例都可以自由选择解析方式,比如DOM, SAX或者是Staxx。
JAXB Architecture - Overview
部署和使用
在JDK 1.6及以上,JAXB的实例都是和JDK捆绑发行的,如果你的JDK版本较低,从javab.java.net下载.jar文件,并将jaxb-api.jar jaxb-Impl.jar放进你的工程类目录中。
JAXB依赖于一个XML Schema才能得到XML的结构,你可以写一个Java类用于定义XML的结构,并用标签标注,或者你可以使用各种各样的工具从XML Schema中直接得到JAXB对象。
本例关注于通过手动定义java类并使用* javax.xml.bind.annotation. **标注,来定义XML的结构。
JAXB 标注
我们需要定义一个对象来展示XML文件的结构。这个对象和在其中被标注定义的结构会在Marshaling和unMarshaling两个过程中都会用到。
Java 对象
package com.javahash.xml.jaxb;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Book {
String title;
int pages;
String isbn;
public String getTitle() {
return title;
}
@XmlElement
public void setTitle(String title) {
this.title = title;
}
public int getPages() {
return pages;
}
@XmlElement
public void setPages(int pages) {
this.pages = pages;
}
public String getIsbn() {
return isbn;
}
@XmlElement
public void setIsbn(String isbn) {
this.isbn = isbn;
}
}
将对象转化成XML - Marshal
package com.javahash.xml.jaxb;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaler;
public class ObjectToXML {
/**
* Creates and XML from the Java Object
*/
public static void main(String[] args) {
Book book = new Book();
book.setTitle("Lord of the Rings");
book.setIsbn("Abbbbbb112");
book.setPages(400);
try {
File file = new File("E:\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Book.class);
Marshaler jaxbMarshaler = jaxbContext.createMarshaler();
// output pretty printed
jaxbMarshaler.setProperty(Marshaler.JAXB_FORMATTED_OUTPUT, true);
// writing to a file
jaxbMarshaler.marshal(book, file);
// writing to console
jaxbMarshaler.marshal(book, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
将XML转化成对象 - UnMarshal
package com.javahash.xml.jaxb;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.UnMarshaler;
public class XMLToObject {
/**
* @param args
*/
public static void main(String[] args) {
try {
File file = new File("E:\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Book.class);
UnMarshaler jaxbUnMarshaler = jaxbContext.createUnMarshaler();
Book book = (Book) jaxbUnMarshaler.unmarshal(file);
System.out.println(book);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}