Java操作XML的工具:JAXB

JavaArchitecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAX或DOM。JAXB 隐藏了细节并且取消了SAX和DOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。     JAXB(javaArchitecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。  Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。

一、重要概念

  • JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
  • Marshaller接口,将Java对象序列化为XML数据。
  • Unmarshaller接口,将XML数据反序列化为Java对象。
  • @XmlType,将Java类或枚举类型映射到XML模式类型
  • @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
  • @XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
  • @XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
  • @XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
  • @XmlRootElement,将Java类或枚举类型映射到XML元素。
  • @XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
  • @XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。

二、工具类

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

import org.apache.poi.ss.formula.functions.T;

import javax.xml.bind.*;
import javax.xml.namespace.QName;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;

public class JAXBUtil {

    /**
     * beanToXml
     * @param obj
     * @param encoding
     * @return
     */
    public static String toXml(Object obj,String encoding) {
        try {
            StringWriter sw = new StringWriter();
            JAXBContext context = JAXBCache.instance().getJAXBContext(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xm头声明信息
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            marshaller.marshal(obj, sw);
            return sw.toString().replace("ns2:","").replace(":ns2","");
        } catch(JAXBException e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * xmlToBean
     * @param xml
     * @param c
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T toBean(String xml, Class<T> c,String encoding) {
        T t = null;
        try {
            JAXBContext context = JAXBContext.newInstance(c);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            t = (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
}

  

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
public final class JAXBCache {
    private static final JAXBCache instance = new JAXBCache();
    private final ConcurrentMap<String, JAXBContext> contextCache = new ConcurrentHashMap<String, JAXBContext>();
    private JAXBCache() {
    }
    public static JAXBCache instance() {
        return instance;
    }
    JAXBContext getJAXBContext(Class<?> clazz) throws JAXBException {
        JAXBContext context = contextCache.get(clazz.getName());
        if ( context == null )
        {
            context = JAXBContext.newInstance(clazz);
            contextCache.putIfAbsent(clazz.getName(), context);
        }
        return context;
    }
}

  

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

public class XMLNameSpace {
    public static final String ADMIN_PREFIX = "";
    public static final String ADMIN_URI = "http://WebServices.WS.JointownTech.com//";
}

  

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

import com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;
import com.thoughtworks.xstream.annotations.XStreamAlias;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

/**
 * Created by wls on 2017/8/15.
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder= {"result","errorDesc","elecPrescription"})
public class AddPrescriptionToMes2ItemResponse {
//    @XStreamAlias("result")
    @XmlElement(name="result",namespace = XMLNameSpace.ADMIN_URI)
    private String result;
    @XmlElement(required = false)
    private String errorDesc;
    @XmlElement(required = false)
    private ElecPrescription elecPrescription;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getErrorDesc() {
        return errorDesc;
    }

    public void setErrorDesc(String errorDesc) {
        this.errorDesc = errorDesc;
    }

    public ElecPrescription getElecPrescription() {
        return elecPrescription;
    }

    public void setElecPrescription(ElecPrescription elecPrescription) {
        this.elecPrescription = elecPrescription;
    }

    @Override
    public String toString() {
        return "AddPrescriptionToMes2ItemResponse{" +
            "result=‘" + result + ‘\‘‘ +
            ", errorDesc=‘" + errorDesc + ‘\‘‘ +
            ", elecPrescription=" + elecPrescription +
            ‘}‘;
    }
}

  

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

/**
 * Created by wls on 2017/8/15.
 */
//@XStreamAlias("string")
@XmlRootElement(name = "string",namespace = XMLNameSpace.ADMIN_URI)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder= {"response"})
public class AddPrescriptionToMes2Response {
    @XmlElement(name = "response",namespace = XMLNameSpace.ADMIN_URI)
    private AddPrescriptionToMes2ItemResponse response;

    public AddPrescriptionToMes2ItemResponse getResponse() {
        return response;
    }

    public void setResponse(AddPrescriptionToMes2ItemResponse response) {
        this.response = response;
    }

    @Override
    public String toString() {
        return "AddPrescriptionToMes2Response{" +
            "response=" + response +
            ‘}‘;
    }
}

  

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

import com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

/**
 * Created by wls on 2017/8/17.
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder= {"result","errorDesc"},namespace = XMLNameSpace.ADMIN_URI)
public class SetWXPrescriptionInfoItemResponse {
    @XmlElement(name = "result",namespace = XMLNameSpace.ADMIN_URI)
    private ElecPrescription result;
    private String errorDesc;

    public ElecPrescription getResult() {
        return result;
    }

    public void setResult(ElecPrescription result) {
        this.result = result;
    }

    public String getErrorDesc() {
        return errorDesc;
    }

    public void setErrorDesc(String errorDesc) {
        this.errorDesc = errorDesc;
    }

}

  

package com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import javax.xml.bind.annotation.*;

/**
 * Created by wls on 2017/8/17.
 */
//@XStreamAlias("string")
@XmlRootElement(name = "string",namespace = XMLNameSpace.ADMIN_URI)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder= {"response"})
public class SetWXPrescriptionInfoResponse {
    @XmlElement(name = "response",namespace = XMLNameSpace.ADMIN_URI)
    private SetWXPrescriptionInfoItemResponse response;

    public SetWXPrescriptionInfoItemResponse getResponse() {
        return response;
    }

    public void setResponse(SetWXPrescriptionInfoItemResponse response) {
        this.response = response;
    }
}

  三、测试类

package com.ehaoyao.jobcenter.test;

import com.alibaba.fastjson.JSONObject;
import com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.AddPrescriptionToMes2Response;
import com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.JAXBUtil;
import com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.SetWXPrescriptionInfoResponse;
import com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;
import org.apache.poi.ss.formula.functions.T;

import static org.junit.Assert.*;

public class JaxbUtilTest {

    public static void main(String[] args) {
        ElecPrescription elecPrescription = new ElecPrescription();
        elecPrescription.setAddress("测试地址");
        elecPrescription.setAge(12);
        elecPrescription.setAgentNum(1);
        elecPrescription.setBillDates("2017-08-19 12:02:21");
        elecPrescription.setBlank2("1");
        elecPrescription.setBlank3("1");
        elecPrescription.setBusinessId("1435");
        String ret = JAXBUtil.toXml(elecPrescription,"UTF-8");
        System.out.println(ret);
        elecPrescription = (ElecPrescription) JAXBUtil.toBean(ret,ElecPrescription.class,"UTF-8");
        System.out.println(elecPrescription);

        ret = "<string xmlns=\"http://WebServices.WS.JointownTech.com//\"><response><result>1</result></response></string>";
        AddPrescriptionToMes2Response addPrescriptionToMes2Response = JAXBUtil.toBean(ret,AddPrescriptionToMes2Response.class,"UTF-8");
        System.out.println(addPrescriptionToMes2Response!=null? JSONObject.toJSONString(addPrescriptionToMes2Response):null);

        ret = "<string xmlns=\"http://WebServices.WS.JointownTech.com//\"><response><result><BillDates>2017-08-16</BillDates><OutPrescriptionCode>100004</OutPrescriptionCode><OutPrescriptionSn>1004</OutPrescriptionSn><tpyq>代煎</tpyq><zgyq></zgyq><Patient>张三</Patient><Gender>女</Gender><Age>12</Age><CFDates>2017-08-17</CFDates><IsPregnancy>否</IsPregnancy><cflx>外用</cflx><AgentNum>1</AgentNum><Remark></Remark><Opinion></Opinion><BusinessName>好药师三方渠道</BusinessName><orgname>湖北公司</orgname><Dosages>1</Dosages><jyyq>1</jyyq><jyfa>微压(密闭)解表(15min)</jyfa><PatientCode></PatientCode><PictureIP>http://10.2.72.200:131/DCIM/010100003639731150</PictureIP><GoodsDatas><GoodsData><GoodsName>炒蒺藜</GoodsName><Dosage>1</Dosage><GoodsTpyq>无</GoodsTpyq><InvoiceP>0</InvoiceP></GoodsData></GoodsDatas><LogisticsCost>0</LogisticsCost><ProcessingCost>0</ProcessingCost><cfzt>作废</cfzt><cfjd><CFREVIEWSTAFF></CFREVIEWSTAFF><CFREVIEWTIME></CFREVIEWTIME><MIXSTAFF></MIXSTAFF><MIXREQUESTTIME></MIXREQUESTTIME><MIXSURETIME></MIXSURETIME><MIXREVIEWSTAFF></MIXREVIEWSTAFF><MIXREVIEWTIME></MIXREVIEWTIME><SOAKSTAFF></SOAKSTAFF><SOAKREQUESTTIME></SOAKREQUESTTIME><SOAKSURETIME></SOAKSURETIME><TISANESTAFF></TISANESTAFF><TISANEREQUESTTIME></TISANEREQUESTTIME><TISANESURETIME></TISANESURETIME>  <OINTMENTSTAFF></OINTMENTSTAFF><OINTMENTREQUESTTIME></OINTMENTREQUESTTIME><OINTMENTSURETIME></OINTMENTSURETIME><INNERPACKINGSTAFF></INNERPACKINGSTAFF><INNERPACKINGTIME></INNERPACKINGTIME><OUTERPACKINGSTAFF>zyadmin</OUTERPACKINGSTAFF><OUTERPACKINGTIME>2017-08-16 16:41:56</OUTERPACKINGTIME></cfjd><psjd><LogisticsCompany></LogisticsCompany><ExpressNumber></ExpressNumber></psjd></result></response></string>";
        SetWXPrescriptionInfoResponse setWXPrescriptionInfoResponse = JAXBUtil.toBean(ret,SetWXPrescriptionInfoResponse.class,"UTF-8");
        System.out.println(setWXPrescriptionInfoResponse!=null? JSONObject.toJSONString(setWXPrescriptionInfoResponse):null);
    }
}
}

  

  四、运行效果

  

时间: 2024-12-19 04:46:18

Java操作XML的工具:JAXB的相关文章

Java操作XML的JAXB工具

在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上的资料,简单说明一下java操作xml的一些东西. 1.先定义一个XML Schema文件.比如: [html] view plain copy print? <?xml version="1.0" encoding="UTF-8" standalone=&quo

java操作xml的一个小例子

最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要定义好bean的层次结构就可以了,第三方包会自动生成和解析xml. 但是今天发现,这个包有两个问题: 一个是比较复杂(我是菜鸟,求别喷,我真的觉得他挺复杂的..).比如说你要想处理既有属性又有值的xml就比较麻烦.(@XStreamConverter注解这种方法报这个错:com.thoughtwor

java操作xml文档

目前最常用的XML解析技术是DOM和SAX. DOM是基于XML的树结构来完成解析的,适用于多次访问的XML文档,但是DOM解析比较消耗资源:而SAX是基于事件解析,适用于大数据量的XML文档,占用资源少,内存消耗小. DOM是文档对象模型(Document Object Model) 首先DOM会将XML文档映射成一颗倒挂的树,在这棵树中,每个节点都是以节点对象的形式存在的. 我们通过操作这些对象就可以完成XML文件的读写任务了. 我们可以直接根据节点的名称或属性查找该节点对象,也可以根据一个

java操作XML文件

XML文件可以用来作为一种小型数据库存在,但更多时候在项目中都是用来当成配置文件用的,也就避免不了对XML文件的增上改查操作. 在java中,解析XML文件的方式大致分为两种:DOM解析,SAX解析 先来说DOM解析方式:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容. 用的较为多的是Dom4j工具(非官方)解析,简单介绍下Dom4j的使用,具体API文档请下载

用java操作XML文件(DOM解析方式)

XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DOM解析方式 在java工程中导入dom4j.jar包. (一)用java读XML文件 <1>创建SAXReader对象. RAXReader reader=new RAXReader(); <2>调用RAXReader的Document read(File file)方法,获取xml文

Java操作XML文件 dom4j 篇

在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; //工具包 import java.util.Iterator; import java.util.List; //dom4j包 import org.dom

Java demo之Java操作XML

Java是一门高级编程语言,自然少不了对各种文件进行操作的功能.现在笔者就来写一个操作XML的demo供大家参考和学习.首先要知道Java对XML操作的方式并非只有一种,那么究竟哪种方式更高效,哪种方式更适用或主流呢?Java主要有四种方式操作XML文件,下面我们就用代码下载来看一看,比较一下.     以下是Java创建XML文件的四种主流方式. Java代码    public class CreateTest { /** * DOM方式生成xml文档 */ private void DOM

Java中XML解析工具范例

1.直接代码部分: 1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.util.List; 4 import org.jdom.Document; 5 import org.jdom.Element; 6 import org.jdom.input.SAXBuilder; 7 import org.xml.sax.InputSource; 8 9 /** 10 * 作用: XML解析工具类,其中的属性根据

Java操作xml

package jiexi; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; //JAXP DOM方式解析XML文档实例 public class JaxpCRUD { public static v