前面介绍了两种常用的解析XML的API,但是
1.什么是XML与Java类的映射?
在Java应用程序中,通常要将XML解析成一个Java对象。例如,有xml数据如下:
<?xml version="1.0" encoding="UTF-8"?>
<articles>
<article category="xml">
<title>XML 概述</title>
<author>janet</author>
<email>janetval@yahoo.com.cn</email>
<date>20080809</date>
</article>
<article category="java">
<title>Java书籍</title>
<author>XXX君</author>
<email>XXXX@163.com</email>
<date>20100212</date>
</article>
</articles>
有一个Java类如下:
package com.wch.jaxb;
public class Article {
private String title;
private String author;
private String email;
private String date;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
那么后续的动作就是让xml中的元素对应到Java类中来,让<article>元素中的<title>对应title,<author>对应authority等等,那么这种xml数据与Java类之间的对应关系,就是一种映射
2.JAXB的工作原理?
JAXB提供了一个快速而方便的方式绑定XML Schemas和Java,是Java程序员能够很方便的在Java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法,以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。
编组:(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。工作原理如下图所示:
解组:(Unmarshalling) 是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。工作原理如下图所示:
往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储媒介到内存然后回到存储媒介的完整循 环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。
3.Java对象转换成XML:
可以使用配置文件,也可以使用注解。
@XmlRootElement
public class Article {
private String title;
private String author;
private String email;
private String date;
public String getTitle(
@XmlRootElement用于标注XML的根元素,一旦标注了根元素,那么这个类的所有属性,默认映射为根元素的子元素。
4.建立测试类:
package com.wch.jaxb;
import static org.junit.Assert.*;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.Result;
import org.junit.Test;
public class TestJaxb {
@Test
public void test() {
File xmlFile = new File("E:/Eclipse1/DomXml/src/com/wch/xml/testJaxb.xml");
//声明JAXBContext上下文对象
JAXBContext context;
try {
context = JAXBContext.newInstance(Article.class);
//通过上下文创建Java转换成XML的对象Marshaller
Marshaller m = context.createMarshaller();
//创建XML中的数据
Article article = new Article();
article.setAuthor("彩虹");
article.setTitle("人生的感悟");
article.setEmail("1111@163.com");
article.setDate("20120112");
//将Java对象转换到xml
m.marshal(article,xmlFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
就会在响应的目录下生成对应的xml文件
那么,将xml转换为Java对象就不必说了吧,大同小异,但是需要用到Unmarshaller类