环境:
jdk1.6.0_07
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build hudson-jaxb-ri-2.1-792)
简介
Sun推出JAXB(JavaTM Architecture for XML Binding )已经有很长一段时间了。
JAXB是一套自动映射XML和Java实例的开发接口和工具。JAXB使XML更加方便的编译一个XML SCHEMA到一个或若干个JAVA CLASS。提供了如下功能:从XML到JAVA的映射,访问、更新、验证JAVA的表现,从JAVA到XML的映射。
一个简单的例子:
- <? xml version = "1.0" encoding = "GBK" ?>
- < circle xmlns:an = "http://www.an.net/shape" name = "demoCircle" >
- < center >
- < x > 155 </ x >
- < y > 231 </ y >
- </ center >
- < radius > 15.59 </ radius >
- </ circle >
- < xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
- xmlns:an = "http://www.an.net/shape"
- targetNamespace = "http://www.an.net/shape" elementFormDefault = "qualified" >
- < xs:element name = "circle" >
- < xs:complexType >
- < xs:sequence >
- < xs:element name = "center" type = "an:PointType" />
- < xs:element name = "radius" type = "xs:double" />
- </ xs:sequence >
- < xs:attribute name = "name" type = "xs:string" />
- </ xs:complexType >
- </ xs:element >
- < xs:complexType name = "PointType" >
- < xs:sequence >
- < xs:element name = "x" type = "xs:nonPositiveInteger" />
- < xs:element name = "y" type = "xs:nonPositiveInteger" />
- </ xs:sequence >
- </ xs:complexType >
- </ xs:schema >
编译成java class,命令类似下面:
D:/Java/jaxb/jaxb-ri-20090206/bin>xjc.bat myshape.xsd
把编译成的类引入到测试工程中,加入以下代码使用:
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.math.BigInteger;
- import javax.xml.bind.JAXBContext;
- import javax.xml.bind.Marshaller;
- import javax.xml.bind.Unmarshaller;
- import net.an.shape.Circle;
- public class HelloJaxb {
- public static void main(String[] args) throws Exception {
- JAXBContext jc = JAXBContext.newInstance(Circle.class );
- Unmarshaller cu = jc.createUnmarshaller();
- Object myobj = cu.unmarshal(new BufferedReader( new FileReader( "myshape.xml" )));
- Circle cc = (Circle) myobj;
- cc.setRadius(192.168 );
- cc.getCenter().setX(BigInteger.valueOf(127 ));
- cc.getCenter().setY(BigInteger.valueOf(127 ));
- Marshaller cm = jc.createMarshaller();
- cm.marshal(cc, System.out);
- }
- }
javax.xml.bind.Unmarshaller类可以将xml解析成java对象
javax.xml.bind.Marshaller类可以将java对象输出为xml。
大多数情况下均可以使用JAXB来操作xml,只有一些特殊情况再考虑 SAX、DOM、JDOM、XMLBeans。
注意:有时jaxb编译成java class时,有时有些java字段并不会生成@XmlElement标签,可能由于xsd中有些字段有划线,有些没有造成的?xsd中把字段大写就能跳过这个问题,
可能小写字母搞什么javabean规范,转换大小写的一个bug