1、什么是XML与Java类映射
在java程序中,通常XML数据文件要解析成一个Java对象,比如说这样一个XML数据文件,代码如下:
<?xml version ="1.0" enconding="UTF-8" standalone="yes"?>
<article>
<author>Janet</author>
<date>20080202</date>
<email>janet@yahoo.cn</email>
<title>XML</title>
</article>
还有一个Java类Article,它是一个普通的POJO对象,代码如下:(getter,settet方法略)
public class Article{
private String title;
private String author;
private String email;
private String date;
}
现在想让XML中的<article> 元素的数据装载到Article对象中,XML中的<title>对应Java类中的title,XML中的<author>对应Java类中的author......,这种XML数据与JAVA类之间的对应关系,就是一种映射。
2、JAXB的工作原理
与Hibernate映射类似,JAXB映射主要有4个部分组成:Schema、JAXB、XML文档、JAVA对象,如图:
Schema可以看做是数据库中的表结构,Document(XML文档)是表中的一条条数据,而JAXB可以看作是Hibernate,它提供Schema到Java对象的映射,类似xxx.hbm的映射文件。
XML转换到Java对象的过程叫做unmarshal。
Java对象转换到XML的过程叫做marshal。
3、Java对象转化为XML(marshal)
在JDK6中,JAXB中的可以通过标注Annotation来映射,这样编写映射就容易多了。Article类通过标注映射后,代码如下:
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class XmlToJava {
public void JAXBDemo1(){
//创建XML文档
File xmlFile = new File("F:\\test.xml");
//声明JAXBContext对象
JAXBContext jcontext;
try{
//通过映射上下文关系
jcontext = JAXBContext.newInstance(Article.class);
//创建XML文件到JAVA对象的Unmasheller对象
Unmarshaller u = jcontext.createUnmarshaller();
Article article = (Article)u.unmarshal(xmlFile);
System.out.println(article.getTitle());
System.out.println(article.getAuthor());
System.out.println(article.getDate());
System.out.println(article.getEmail());
}catch(JAXBException e){
e.printStackTrace();
}
}
}
总结几个需要注意的问题:
(1)通过标注 @XmlRootElement用于标注XML的根元素。
(2)一旦类标注了根元素,那么这个类的所有属性,默认映射为根元素的子元素。
4、XML转化为Java对象(unmarshal)
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class JavaToXml {
/**
* @param args
*/
public void JAXBDemo(){
//创建xml文档对象
File xmlFile = new File("F:\\test.xml");
//声明JAXBContext上下文对象
JAXBContext jc;
try{
//通过指定影射的类创建上下文
jc = JAXBContext.newInstance(Article.class);
//通过上下文创建java转化成xml的对象Marshaller
Marshaller m = jc.createMarshaller();
Article article = new Article(); //创建XML中的数据
article.setTitle("围城");
article.setAuthor("钱锺书");
article.setDate("1945");
article.setEmail("qzs@sina.com");
m.marshal(article,xmlFile); //将JAVA对象转化到xml中
}catch(JAXBException e){
e.printStackTrace();
}
}
}