Java解析XML-JDK-JAXB官方指导文档

  • Post author:
  • Post category:java





https://github.com/javaee/jaxb-v2



https://github.com/javaee/jaxb-v2






JAXB 用户指南 (javaee.github.io)


icon-default.png?t=N6B9
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;
    }
}



版权声明:本文为qq_34922830原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。