jaxb 解析 XML。。。

题前话:-------------相对于繁琐的dom4j SAX Final 代码更简洁 性能更高 适配性更强 工作量更少。我们只需要写好requestDTO 请求数据模型 一个构造函数 跟一个返回XML  String  转换成返回responseDTO  model 根据返回数据做相应业务操作就可以了。下面说 requestDTO 请求模型的注解详解。在做这个之前。。用dom4j 做的XML解析。。想到尽100个XML的解析,很崩溃。然后从DOM4J 果断切换到jaxb 其中 时间格式化  以及同名组件的处理 被坑过。本人小白第一次写博文。希望跟大神多多交流。然后请各位大神轻喷。






import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.springframework.util.StringUtils;
import org.w3c.dom.Node;

/*
 * @Description:JAXB用于XML的转换
 *=====================================================================================================
 *
 *
 *=====================================================================================================            
 * @author                     LiangChun   
 * @date                     2017年11月24日
 * @version V1.0
 */
public class JAXBUtil {

    /**
     * 获取JAXBContext实例。
     *
     * @param
     * @return
     */
    private static final JAXBContext getJAXBContext(Class<?> c) {
        JAXBContext jaxbContext = null;
        try {
            jaxbContext = JAXBContext.newInstance(c);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return jaxbContext;
    }

    /**
     * 将报文节点反序列化为实体类
     *
     * @param xml
     * @param classs
     * @return
     */
    public static final Object documentToModel(String xml, Class<?> c) {
        if (StringUtils.isEmpty(xml)) {
            return null;
        }
        Object object = null;
        JAXBContext jaxbContext = getJAXBContext(c);
        try {
            // 得到反序列化实例Unmarshaller
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            object = unmarshaller.unmarshal(new StringReader(xml));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return object;
    }

    public static final String modelToXMLGBK(Object obj, boolean flag) {
        return modelToXML(obj, "GBK", flag);
    }

    public static final String modelToXMLUTF8(Object obj, boolean flag) {
        return modelToXML(obj, "UTF-8", flag);
    }
    
    /**
     * 将实体类转序列化为对应String类型xml节点
     *
     * @param obj        实体对象
     * @param flag         是否去除报文头 true是/false否
     * @return
     */
    public static final String modelToXML(Object obj, String encoding ,boolean flag) {
        StringWriter writer = new StringWriter();
        JAXBContext jaxbContext = getJAXBContext(obj.getClass());
        String result = null;
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            // 设置序列化的编码格式
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            // 设置格式化输出
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            // 去掉报文头
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, flag);
            marshaller.marshal(obj, writer);
            result = writer.toString();
            // result=result.replaceAll(" ", "");
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        System.out.println("未设置格式化输出:" + result);
        return result;
    }

    /**
     * 将实体类转序列化为对应node节点
     *
     * @param obj
     *            实体类
     * @param node
     *            创建的新节点
     * @return
     */
    public static final Node modelToNode(Object obj, Node node) {
        JAXBContext jaxbContext = getJAXBContext(obj.getClass());
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(obj, node);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return node;
    }

}



-----------------------------------------------------分割线 上面是jaxbUtil 可以完成xml 的解析 xml转model  model 转xml 注释很详细-----------------------------




@XmlRootElement(name = "User") // 根节点名称

@XmlElement(name= "NAME") //子节点名称

@XmlJavaTypeAdapter( DateAdapter.class ) //此处可以格式时间

@XmlElement(name= "SEX") // enum 转成xml 节点

@XmlAccessorType(XmlAccessType.FIELD)  // 如果对接的系统用此注释 效率成倍增加。只需声明的变量名跟XML中的节点相对应即可


文章最后会附上 用到的类


先来最简单的

package com.csdn.request;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * 此处模拟用户请求参数 最简单的
 *
 */
@XmlRootElement(name = "User") // 根节点名称
public class UserRequestDTO implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 5755470921262396696L;
    private String name;// 必传字段
    private String sex;
    private String age;
    private String registerTime;
    private String email;
    private String mobile;// 必传字段
    private String idNumber;// 必传字段

    public String getName() {
        return name;
    }

    @XmlElement(name = "NAME")
    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    @XmlElement(name = "SEX")
    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    @XmlElement(name = "AGE")
    public void setAge(String age) {
        this.age = age;
    }

    public String getRegisterTime() {
        return registerTime;
    }

    @XmlElement(name = "REGISTERTIME")
    public void setRegisterTime(String registerTime) {
        this.registerTime = registerTime;
    }

    public String getEmail() {
        return email;
    }

    @XmlElement(name = "EMAIL")
    public void setEmail(String email) {
        this.email = email;
    }

    public String getMobile() {
        return mobile;
    }

    @XmlElement(name = "MOBILE")
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getIdNumber() {
        return idNumber;
    }

    @XmlElement(name = "IDNUMBER")
    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public UserRequestDTO() {
        super();
    }

    // 必传字段构造函数
    public UserRequestDTO(String name, String mobile, String idNumber) {
        super();
        this.name = name;
        this.mobile = mobile;
        this.idNumber = idNumber;
    }

    // 全参构造函数
    public UserRequestDTO(String name, String sex, String age, String registerTime, String email, String mobile,
            String idNumber) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.registerTime = registerTime;
        this.email = email;
        this.mobile = mobile;
        this.idNumber = idNumber;
    }

}




对应测试类


package com.csdn.test;

import com.csdn.request.UserRequestDTO;
import com.csdn.util.JAXBUtil;

/**
 * 测试类的转换
 *
 */
public class TestJaxb {
    public static void main(String[] args) {
        UserRequestDTO userReq=new UserRequestDTO("学jaxb", "13166666666", "430523199211117811");
        System.out.println(JAXBUtil.modelToXML(userReq, "GBK", true));
        
    }

}



然后关于enum  date 以及组件的处理。

----------------------------------------------------------requestDTO-------------------------------

package com.csdn.request;

import java.io.Serializable;
import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.csdn.adapter.DateAdapter;
import com.csdn.compent.Platform;
import com.csdn.enump.SexEnum;

/**
 * 此处模拟用户请求参数 升级版
 *
 */
@XmlRootElement(name = "User2") // 根节点名称
public class UserRequestDTO2 implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 5755470921262396622L;
    private String name;// 必传
    // 枚举格式化取值
    private SexEnum sex;
    private int age;
    // 注册时间 日期格式化
    private Date registerTime;
    private String email;
    private String mobile;// 必传
    private String idNumber;// 必传
    // 对象组件
    private Platform platform;// 必传

    public String getName() {
        return name;
    }

    @XmlElement(name = "NAME")
    public void setName(String name) {
        this.name = name;
    }

    public SexEnum getSex() {
        return sex;
    }

    @XmlElement(name = "SEX")
    public void setSex(SexEnum sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    @XmlElement(name = "AGE")
    public void setAge(int age) {
        this.age = age;
    }

    public Date getRegisterTime() {
        return registerTime;
    }

    @XmlElement(name = "REGISTERTIME")
    @XmlJavaTypeAdapter(DateAdapter.class) // 此处可以格式时间
    public void setRegisterTime(Date registerTime) {
        this.registerTime = registerTime;
    }

    public String getEmail() {
        return email;
    }

    @XmlElement(name = "EMAIL")
    public void setEmail(String email) {
        this.email = email;
    }

    public String getMobile() {
        return mobile;
    }

    @XmlElement(name = "MOBILE")
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getIdNumber() {
        return idNumber;
    }

    @XmlElement(name = "IDNUMBER")
    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public Platform getPlatform() {
        return platform;
    }

    @XmlElement(name = "PLATFORM")
    public void setPlatform(Platform platform) {
        this.platform = platform;
    }

    public UserRequestDTO2() {
        super();
    }

    // 必有字段构造函数
    public UserRequestDTO2(String name, String mobile, String idNumber) {
        super();
        this.name = name;
        this.mobile = mobile;
        this.idNumber = idNumber;
    }

    // 全参构造函数
    public UserRequestDTO2(String name, SexEnum sex, int age, Date registerTime, String email, String mobile,
            String idNumber, Platform platform) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.registerTime = registerTime;
        this.email = email;
        this.mobile = mobile;
        this.idNumber = idNumber;
        this.platform = platform;
    }

    @Override
    public String toString() {
        return "UserRequestDTO2 [name=" + name + ", sex=" + sex + ", age=" + age + ", registerTime=" + registerTime
                + ", email=" + email + ", mobile=" + mobile + ", idNumber=" + idNumber + ", platform=" + platform + "]";
    }

}



------------------------------------------------SexEnum枚举-----------------------------------------------

package com.csdn.enump;

import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;

@XmlEnum(String.class)
public enum SexEnum {
    
    @XmlEnumValue("男")MALE("MALE","男"),
    @XmlEnumValue("女")FEMALE("FEMALE","女"),
    @XmlEnumValue("其他")OTHER("OTHER","其他");
    

    private final String code;
    private final String msg;

    SexEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 根据编码获取信息
     *
     * @param code
     * @return
     */
    public static String getMsgByCode(String code) {
        for (SexEnum v : SexEnum.values()) {
            if (v.getCode().equals(code)) {
                return v.getMsg();
            }
        }
        return "未知结果";
    }

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

}


-------------------------------------------------------DateAdapter时间格式化处理------

package com.csdn.adapter;

import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import com.csdn.util.DateUtils;

public class DateAdapter extends XmlAdapter<String, Date> {
    @Override
    public Date unmarshal(String v) throws Exception {
        return DateUtils.formatStringYMD(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        return DateUtils.formatDateYMD(v);
    }
}


-----------------------------------------------  dateUtils 对应方法------------------------------------

 /**
     * 将字符串转化为JAVA时间类型。
     *
     * @param dateStr。字符串。
     * @return date。JAVA时间类型。
     */
    public static Date formatStringYMD(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        try {
            return sdf.parse(dateStr);
        } catch (Exception e) {
            return null;
        }
    }


 public static String formatDateYMD(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(date);
    }



应该很全了。。怎么不能添加demo 附件。。表示很尴尬

有问题请联系邮箱    huangliangchun@163.com

时光逆流,你我不老。一起coding, 一起成长。



--------------------------------------------------------------


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值