JAXB学习一 (入门)JAXB学习二 (类型绑定)
来源:互联网 发布:网络诈骗案件2017 编辑:程序博客网 时间:2024/06/05 06:49
http://liugang594.iteye.com/blog/1285697
http://liugang594.iteye.com/blog/1285874
JAXB全称Java Architecture for XML Binding,是一个用于在XML和Java对象之间进行映射的规范。使用JAXB,可以自动的将一个XML文档映射成对应的Java对象,也可以将对象保存成XML格式。有很多其他的处理XML结构和对象之间映射的技术,这里只讨论JAXB。
一、安装
首先我们需要去下一份JAXB的实现,可以去SUN(现在的oracle)网站上去下载:http://jaxb.java.net/
下载的是一个份jar文件,可以使用命令"java -jar jaxb**.jar"运行该jar文件,或者在windows(如果是的话)选择做为java应用运行即可。
接受许可之后,在运行的当前目录下就会生成一个文件夹,结构大致为:
这样就算安装成功了。
二、生成模型
安装完以后,就可以开始使用了,首先我们需要有一份schema文件,例如:
- <?xml version="1.0" encoding="UTF-8"?>
- <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.liulutu.com/students/"
- targetNamespace="http://www.liulutu.com/students/">
- <element name="students">
- <complexType>
- <sequence>
- <element name="student" type="tns:StudentType" maxOccurs="unbounded" />
- </sequence>
- </complexType>
- </element>
- <simpleType name="SexType">
- <restriction base="string">
- <enumeration value="Male"></enumeration>
- <enumeration value="Female"></enumeration>
- </restriction>
- </simpleType>
- <complexType name="StudentType">
- <attribute name="sex" type="tns:SexType"></attribute>
- <attribute name="name" type="string"></attribute>
- </complexType>
- </schema>
然后就可以根据这个schema文件生成对应的java模型类文件,可以到jaxb的bin目录下去,使用以下命令生成模型文件:
- xjc.bat students.xsd -d src -p com.liulutu.student.model
其中students.xsd指定要读入的schema文件;-d指定源代码存放目录;-p指定模型对象所在的包。
如果不出意外,上面的schema会对应生成以下模型文件:
三、使用
有了以上模型文件后,就可以开始使用,例如
- 模型到XML
- public class TestMarshaller {
- public static void main(String[] args) throws JAXBException {
- JAXBContext con = JAXBContext.newInstance("com.liulutu.student.model");
- ObjectFactory factory = new ObjectFactory();
- Students students = factory.createStudents();
- addNewStudentTo(factory, students, "aaa", SexType.MALE);
- addNewStudentTo(factory, students, "bbb", SexType.FEMALE);
- Marshaller marshaller = con.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
- marshaller.marshal(students, new File("a.xml"));
- }
- private static void addNewStudentTo(ObjectFactory factory,
- Students students, String name, SexType type) {
- StudentType studentType = factory.createStudentType();
- studentType.setName(name);
- studentType.setSex(type);
- students.getStudent().add(studentType);
- }
- }
保存后的xml文件内容如下:
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <ns2:students xmlns:ns2="http://www.liulutu.com/students/">
- <student name="aaa" sex="Male"/>
- <student name="bbb" sex="Female"/>
- </ns2:students>
- XML到模型
以下代码用来还原以上保存的XML文件对应的模型(假如保存的文件名为a.xml):
- public class TestUnmarshaller {
- public static void main(String[] args) throws JAXBException {
- JAXBContext con = JAXBContext.newInstance("com.liulutu.student.model");
- Unmarshaller unmarshaller = con.createUnmarshaller();
- Students students = (Students) unmarshaller.unmarshal(new File("a.xml"));
- List<StudentType> student = students.getStudent();
- Iterator<StudentType> iterator = student.iterator();
- while(iterator.hasNext()){
- StudentType next = iterator.next();
- System.out.println(next.getName()+" "+next.getSex());
- }
- }
- }
上面一节简单介绍了怎么入门JAXB,这节介绍怎么自定义绑定类型。
JAXB会有一些默认的类型匹配,以下是一张匹配表:
xsd:string
java.lang.String
xsd:integer
java.math.BigInteger
xsd:int
int
xsd.long
long
xsd:short
short
xsd:decimal
java.math.BigDecimal
xsd:float
float
xsd:double
double
xsd:boolean
boolean
xsd:byte
byte
xsd:QName
javax.xml.namespace.QName
xsd:dateTime
javax.xml.datatype.XMLGregorianCalendar
xsd:base64Binary
byte[]
xsd:hexBinary
byte[]
xsd:unsignedInt
long
xsd:unsignedShort
int
xsd:unsignedByte
short
xsd:time
javax.xml.datatype.XMLGregorianCalendar
xsd:date
javax.xml.datatype.XMLGregorianCalendar
xsd:g
javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType
java.lang.Object
xsd:anySimpleType
java.lang.String
xsd:duration
javax.xml.datatype.Duration
xsd:NOTATION
javax.xml.namespace.QName
可以看到dateTime对应的类为"
javax.xml.datatype.XMLGregorianCalendar",通常这不会是我们想要的,可能我们更希望是java.util.Calendar。
要实现这种绑定,就需要我们自定义了。
在JAXB中,可能通过定义一个binding文件来实现自定义绑定类型,例如要匹配dateTime到"java.util.Calendar",可以如下:
- <bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0"
- xmlns:xs="http://www.w3.org/2001/XMLSchema">
- <globalBindings>
- <javaType name="java.util.Calendar" xmlType="xs:date"
- parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
- printMethod="javax.xml.bind.DatatypeConverter.printDate" />
- </globalBindings>
- </bindings>
- <bindings xmlns="http://java.sun.com/xml/ns/jaxb"
- version="2.0"
- xmlns:xs="http://www.w3.org/2001/XMLSchema">
- <globalBindings>
- <javaType name="java.util.Date" xmlType="xs:date"
- parseMethod="com.liulutu.jaxb.DateAadpter.parseDate"
- printMethod="com.liulutu.jaxb.DateAdapter.printDate"
- />
- </globalBindings>
- </binding>
这里你需要行在src下定义一个com.liulutu.jaxb.DateAadpter类,并提供printDate和parseDate方法。如下:
- package com.liulutu.jaxb;
- public class DateAdapter {
- public static Date parseDate(String s) {
- return DatatypeConverter.parseDate(s).getTime();
- }
- public static String printDate(Date dt) {
- Calendar cal = new GregorianCalendar();
- cal.setTime(dt);
- return DatatypeConverter.printDate(cal);
- }
- }
- xjc.bat students.xsd -d src -p com.liulutu.student.model -b bindings.xml
- JAXB学习一 (入门)JAXB学习二 (类型绑定)
- JAXB学习二 (类型绑定)
- JAXB学习一 (入门)
- jAXB学习入门
- JAXB学习三 (验证)
- jaxb学习
- JAXB学习
- Jaxb 学习
- JAXB(一)入门--概述,简单例子
- JAXB学习笔记(一)—— 常用注解
- JAXB学习笔记(一)—— 常用注解
- JAXB学习四 (理解JAXBContext)
- JAXB--@XmlElementWrapper注解(二)
- JAXB--@XmlElementWrapper注解(二)
- JAXB--@XmlElementWrapper注解(二)
- JAXB--简单应用(一)
- JAXB--简单应用(一)
- javaee5 jaxb 学习
- Horizontalscroll自定义编辑横向滑动的位置,
- [Linux] Nutch 2.3.1+ Hbase + Hadoop + Solr 单机指南(一)
- 关于jar包add to build path与放入lib下的区别
- HTML常用鼠标指针样式设置
- poj 2485 Highways
- JAXB学习一 (入门)JAXB学习二 (类型绑定)
- Java EE中Servlet的内置对象
- CentOS FastDFS配置之常见错误
- IOS缓存机制详解
- mvc 数据验证金钱格式decimal格式验证
- Insertion Sort List
- Cocos2dx 3.10音频无法正常播放问题的解决之路
- 控制面板有u盘显示,可是计算机不显示u盘符
- 利用MySQL排序将树结构表数据封装成树结构对象