XML与Java类映射JAXB

 

前面介绍了两种常用的解析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>[email protected]</email>
        <date>20080809</date>
    </article>
    <article category="java">
        <title>Java书籍</title>
        <author>XXX君</author>
        <email>[email protected]</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("[email protected]");
			article.setDate("20120112");
			//将Java对象转换到xml
			m.marshal(article,xmlFile);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


就会在响应的目录下生成对应的xml文件

 

那么,将xml转换为Java对象就不必说了吧,大同小异,但是需要用到Unmarshaller类

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章