https://github.com/javaee/jaxb-v2
https://github.com/javaee/jaxb-v2JAXB 用户指南 (javaee.github.io)
https://javaee.github.io/jaxb-v2/doc/user-guide/ch03.html
JAXB 概述
JAXB(Java Architecture for XML Binding)是J2SE和J2EE平台的一部分,让开发者能够快速完成Java类和XML的互相映射。
JAXB 允许Java人员将Java类映射为XML表示方式。其实,JAXB是一个业界标准,是一项可以根据XML Schema产生Java类的技术,并且可以将Java对象树的内容写到XML文档中。
JAXBContext
JAXBContext类提供客户端的JAXB API入口点。 它为管理实现JAXB绑定框架操作所必需的XML / Java绑定信息提供了一个抽象:unmarshal,marshal和validate。
Marshaller.class :Marshaller类负责管理将Java内容树序列化为XML数据的过程
Unmarshaller.class :Unmarshaller类管理将XML数据反序列化为新创建的Java内容树的过程,可选地在未编组的情况下验证XML数据
Validator.class:从JAXB 2.0开始,此类已被弃用且可选。 Validator类负责控制运行时内容树的验证
客户端应用程序通常使用newInstance方法的这两种样式之一获取此类的新实例;
static JAXBContext newInstance(类... classesToBeBound)
获得一个新的 JAXBContext类的实例。
static JAXBContext newInstance(类[] classesToBeBound, Map<String,?> properties)
获得一个新的 JAXBContext类的实例。
解组&编组
参考 JAXBContext、Unmarshaller、Marshaller 类注释
// Example: Code fragment
@XmlRootElement
class Point {
int x; //属性都不得为private protected
int y;
Point(int _x,int _y) {x=_x;y=_y;} // 需要提供构造方法,全参、无参
}
// Example: Code fragment
@XmlRootElement
class Point3D extends Point {
int z;
Point3D(int _x,int _y,int _z) {super(_x,_y);z=_z;}
}
//Example: Code fragment corresponding to XML output *
marshal( new Point3D(3,5,0), System.out );
<!-- Example: XML output -->
<!-- The element name is point3D not point -->
<point3D>
<x>3</x>
<y>5</y>
<z>0</z>
</point3D>
<!-- Example: XML schema definition -->
<xs:element name="point3D" type="point3D">
<xs:complexType name="point3D">
<xs:complexContent>
<xs:extension base="point">
<xs:sequence>
<xs:element name="z" type="xs:int">
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
javax.xml.bind.JAXBContext#newInstance(java.lang.Class...)
获取JAXBContext类的一个新实例。
客户端应用程序必须提供新上下文对象需要识别的类列表。新上下文不仅将识别所有指定的类,而且还将识别从指定的类中直接/间接静态引用的任何类。引用类的子类和@XmlTransient引用类都没有向JAXBContext注册
// 如果执行newInstance(Foo.class),新创建的JAXBContext将同时识别Foo和Bar,但不识别Zot或FooBar:
class Foo {
@XmlTransient FooBar c;// 不识别@XmlTransient标注的类
Bar b; // Bar类型的数据有两个 不会识别成子类
static Zoo zoo; // 直接使用的静态类会识别 & 间接引用的也会识别
}
class Bar { int x; }
class Zot extends Bar { int y; }
class FooBar { }
class Zoo { }
XML schema 元素 | 菜鸟教程 (runoob.com)
javax.xml.bind.annotation
Unmarshaller 与 Marshaller 在编组或解组时候需要一些辅助的注解
@XmlRootElement(name = "point" , namespace = "point") //根元素标签需要指定命名空间 targetNamespace="point" 参见 javax.xml.bind.annotation.XmlSchema
@XmlAccessorType(XmlAccessType.FIELD) // 序列化时候使用字段注入值
class Point {
@XmlElement(name = "x") //代表子元素<point> <x>
private int x;
@XmlElement(name = "x")
// @XmlAttribute // 代表标签的属性 <point y=? >
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Point() {
}
Point(int _x, int _y) {
x = _x;
y = _y;
}
}