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

https://github.com/javaee/jaxb-v2https://github.com/javaee/jaxb-v2JAXB 用户指南 (javaee.github.io)icon-default.png?t=N6B9https://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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值