2.JAXB--简单应用
2015-09-20 20:59
363 查看
一、简介
1、概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,即是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。有多种实现。
2、JAXB中有什么:包含“xjc”工具和一个“schemagen”工具。
“xjc”工具可以用来将XML模式或其他类型模式文件(Java 1.6试验性地支持RELAX NG,DTD以及WSDL)转换为Java类。Java类使用javax.xml.bind.annotation包下的Java 标注,例如@XmlRootElement和@XmlElement。XML列表序列表示为java.util.List类型的属性, 通过JAXBContext可以创建Marshallers(将Java对象转换成XML)和Unmarshallers(将XML解析为Java对象)。
另外的“schemagen”工具,能够执行“xjc”的反向操作,通过一组标注的Java类创建一个XML模式。
3.JAXB2(jsr222)是jaxb的2.0版本,jdk1.6自带的就是2.0版本,比起1.0,jaxb2用了自jdk1.5开始的annocation特性
二、术语
编组(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 中的文档
上相同。
清单 3. 往返
二、依赖
JDK5以下开发需要的jar包:activation.jar、jaxb-api.jar、 jaxb-impl.jar、 jsr173-api.jar;
如果是基于JDK6以上版本已经集成JAXB2的JAR,在目录{JDK_HOME}/jre/lib/rt.jar中。
三、标注相关
注意:
1、注解可在属性定义上,也可在getter()方法上,最好在方法上注解,修饰属性用private,方法是public,属性注解可能会出现问题(如:JAXB “Class
has two properties of the same name”)。
2、对象中的属性可以不全部映射到xml中,xml中出现的元素也不一定与映射的实体一一对应,映射的双方可以灵活对应
3、类上注解后,类中元素也默认按默认名称映射,但是对象属性名称与xml节点元素名称不一致时或者不需要显示在xml节点中时,则必须做对应 的映射配置。
4、注解实例:映射一般分分:类名与xml根节点的映射、普通属性与xml节点的映射、集合与xml中包含子元素的节点的映射。
三、简单应用
第一步:创建要转化的java对象,该对象需要使用相关注解注释各字段(标注在get方法上)。
Java代码
![](http://suo.iteye.com/images/icon_star.png)
package step1;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
String name;
int age;
int id;
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Customer [id=" + id + ",name=" + name + ",age=" + age + "]";
}
}
第二步:编组(java对象转xml),提供多种编组目的地,以下只介绍两种,一种编组到文件,一种编组到控制台。
Java代码
![](http://suo.iteye.com/images/icon_star.png)
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
//Marshaller
public class Object2XmlDemo {
public static void main(String[] args) {
Customer customer = new Customer();
customer.setId(100);
customer.setName("suo");
customer.setAge(29);
Book book = new Book();
book.setId("1");
book.setName("哈里波特");
book.setPrice(100);
Book book2 = new Book();
book2.setId("2");
book2.setName("苹果");
book2.setPrice(50);
Set<Book> bookSet = new HashSet<Book>();
bookSet.add(book);
bookSet.add(book2);
customer.setBook(bookSet);
try {
File file = new File("C:\\file1.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
生成的xml:
Xml代码
![](http://suo.iteye.com/images/icon_star.png)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100">
<age>29</age>
<name>mkyong</name>
</customer>
第三步:解组(xml转java对象),直接从文件解组xml成java对象。
Java代码
![](http://suo.iteye.com/images/icon_star.png)
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
//Unmarshaller
public class Xml2ObjectDemo {
public static void main(String[] args) {
try {
File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file);
System.out.println(customer);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
注:以上代码在jdk1.6中运行正常,jdk1.5需要其它依赖包。
1、概念是什么:(Java Architecture for XML Binding) 是一个业界的标准,即是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。有多种实现。
2、JAXB中有什么:包含“xjc”工具和一个“schemagen”工具。
“xjc”工具可以用来将XML模式或其他类型模式文件(Java 1.6试验性地支持RELAX NG,DTD以及WSDL)转换为Java类。Java类使用javax.xml.bind.annotation包下的Java 标注,例如@XmlRootElement和@XmlElement。XML列表序列表示为java.util.List类型的属性, 通过JAXBContext可以创建Marshallers(将Java对象转换成XML)和Unmarshallers(将XML解析为Java对象)。
另外的“schemagen”工具,能够执行“xjc”的反向操作,通过一组标注的Java类创建一个XML模式。
3.JAXB2(jsr222)是jaxb的2.0版本,jdk1.6自带的就是2.0版本,比起1.0,jaxb2用了自jdk1.5开始的annocation特性
二、术语
编组(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 中的文档
input.xml和
output.xml应该基本
上相同。
清单 3. 往返
// Get an instance of a data binding factory Factory factory = XMLFactory.newInstance(); factory.connect(); List employees = factory.unmarshal("input.xml"); employees.marshal("output.xml");
二、依赖
JDK5以下开发需要的jar包:activation.jar、jaxb-api.jar、 jaxb-impl.jar、 jsr173-api.jar;
如果是基于JDK6以上版本已经集成JAXB2的JAR,在目录{JDK_HOME}/jre/lib/rt.jar中。
三、标注相关
注意:
1、注解可在属性定义上,也可在getter()方法上,最好在方法上注解,修饰属性用private,方法是public,属性注解可能会出现问题(如:JAXB “Class
has two properties of the same name”)。
2、对象中的属性可以不全部映射到xml中,xml中出现的元素也不一定与映射的实体一一对应,映射的双方可以灵活对应
3、类上注解后,类中元素也默认按默认名称映射,但是对象属性名称与xml节点元素名称不一致时或者不需要显示在xml节点中时,则必须做对应 的映射配置。
4、注解实例:映射一般分分:类名与xml根节点的映射、普通属性与xml节点的映射、集合与xml中包含子元素的节点的映射。
三、简单应用
第一步:创建要转化的java对象,该对象需要使用相关注解注释各字段(标注在get方法上)。
Java代码
![](http://suo.iteye.com/images/icon_star.png)
package step1;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
String name;
int age;
int id;
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Customer [id=" + id + ",name=" + name + ",age=" + age + "]";
}
}
第二步:编组(java对象转xml),提供多种编组目的地,以下只介绍两种,一种编组到文件,一种编组到控制台。
Java代码
![](http://suo.iteye.com/images/icon_star.png)
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
//Marshaller
public class Object2XmlDemo {
public static void main(String[] args) {
Customer customer = new Customer();
customer.setId(100);
customer.setName("suo");
customer.setAge(29);
Book book = new Book();
book.setId("1");
book.setName("哈里波特");
book.setPrice(100);
Book book2 = new Book();
book2.setId("2");
book2.setName("苹果");
book2.setPrice(50);
Set<Book> bookSet = new HashSet<Book>();
bookSet.add(book);
bookSet.add(book2);
customer.setBook(bookSet);
try {
File file = new File("C:\\file1.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
生成的xml:
Xml代码
![](http://suo.iteye.com/images/icon_star.png)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100">
<age>29</age>
<name>mkyong</name>
</customer>
第三步:解组(xml转java对象),直接从文件解组xml成java对象。
Java代码
![](http://suo.iteye.com/images/icon_star.png)
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
//Unmarshaller
public class Xml2ObjectDemo {
public static void main(String[] args) {
try {
File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file);
System.out.println(customer);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
注:以上代码在jdk1.6中运行正常,jdk1.5需要其它依赖包。
相关文章推荐
- 类的本质
- UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)
- 迅雷2012校园招聘笔试题
- X264编码封装FLV,F4V点滴记录
- 3D引擎 知识 问题
- NYOJ 297 GoroSort (数学题)
- 可变的圆 二分?排序?
- 日常
- 23设计模式之原型模式(Prototype)
- 08-索引模版--Index Templates--es横向扩展设计
- 【白云观导引头】一首诗
- 添加图片水印
- 云mysql数据库导入CSV中文乱码问题
- RTMP中FLV流到标准h264、aac的转换
- 最大连续子序列和——动态规划
- openstack从零开始(0)——概述
- UVa227——Puzzle
- JSP与Servlet区别简述
- Switch Case语句中多个值匹配一个代码块的写法
- 基于JAVA语言的多线程技术