JAXB学习

项目中需要解析接收到的xml报文,由于字段太多,就需要有映射技术来解决,传统的dom4j操作起来就过于繁琐。因为要响应的数据也需要转化成xml格式,所有选用该技术还是比较方便的。

1.JAXB的作用
    **JAXB(Java Architecture for XML Binding)是J2SE和J2EE平台的一部分,让开发者能够快速完成Java类和XML的互相映射。
2.常用术语:
    **Marshal:将Java对象转换为XML的过程
    **UnMarshal:将XML转换为Java对象的过程
3.两种实现方式
    **JAXB 的 xjc 工具定义 schema 通过XSD(XML Schema Definition)文档生成Java类的方式。
        第一种方式比较通用,但需要使用者具有熟练的XSD编写经验。
    **Java Annotation 注解 JAXB通过分析java类中的标记(annotation),将java类转换为相应的XML文档。
        第二种方案,必须是编程人员手工添加这些标记(注解标记)。
4.对外提供的接口有三个
    (1)JAXBContext 类
        ##应用的入口,用于管理XML/Java绑定信息。
    (2)Marshaller 接口
        ##将Java对象序列化为XML数据。
    (3)Unmarshaller 接口
        ##将XML数据反序列化为Java对象。
5.常用注解
    @XmlRootElement   类级别的注解。将类映射为xml全局元素,也就是根元素。如果要使用 JAXB ,则该注解必不可少。
    @XmlType  类级别的注解
        参数 name 定义XML Schema中type的名称
        参数 propOrder  指定映射XML时的节点顺序,使用该属性时,必须列出JavaBean对象中的所有字段,否则会报错。
    @XmlAccessorType  类级别的注解。定义这个类中的何种类型需要映射到XML。
        XmlAccessType.FIELD:映射这个类中的所有字段到XML
    @XmlElement  字段,方法,参数级别的注解。该注解可以将被注解的(非静态)字段,或者被注解的get/set方法对应的字段映射为本地元素,也就是子元素。

 /**
     * 将java序列化为xml
     */
    public static void java2xml(ROOT req_root) throws JAXBException {
        //获取上下文环境 将java的bean和要转化的xml进行绑定
        JAXBContext jaxbContext = JAXBContext.newInstance(ROOT.class);
        //创建 Marshaller 实例(序列化)
        Marshaller marshaller = jaxbContext.createMarshaller();
        // 设置转换参数 -> 这里举例是告诉序列化器是否格式化输出
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        // 构建输出环境 -> 这里使用标准输出,输出到控制台Console
        PrintStream out = System.out;
        // 将所需对象序列化 -> 该方法没有返回值
        marshaller.marshal(req_root, out);
    }

    /**
     * 将xml反序列化为java
     */
    public static void xml2java(String xml) throws JAXBException {
        // 获取JAXB的上下文环境,需要传入具体的 Java bean -> 这里使用Student
        JAXBContext context = JAXBContext.newInstance(ROOT.class);
        // 创建 UnMarshaller 实例
        Unmarshaller unmarshaller = context.createUnmarshaller();
        // 加载需要转换的XML数据 -> 这里使用InputStream,还可以使用File,Reader等
        //InputStream stream = SimpleTest.class.getClassLoader().getResourceAsStream("lesson1.xml");
        StringReader reader = new StringReader(xml);
        // 将XML数据序列化 -> 该方法的返回值为Object基类,需要强转类型
        ROOT req_root = (ROOT) unmarshaller.unmarshal(reader);
        // 将结果打印到控制台
        System.out.println(req_root);
        String std400acur = req_root.getStd400acur();
        //可以直接从获取的
        System.out.println(std400acur);

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值