主要介绍使用jaxb对xml进行解析, 互转.

jaxb 是相对较多的xml工具, 只需要在javaBean的属性上添加相应注解, 就可以使用工具进行解析. 具体使用过程如下:

1. 编写javaBean并添加注解

使用过程中一般常用@XmlRootElement, @XmlAccessorType, @XmlElement, @XmlAttribute四个注解, 其余使用方式可以再自行深入研究.

1
2
3
4
5
@XmlRootElement: 根元素
@XmlAccessorType: java对象生成xml文件时对java对象属性的访问方式
属性为XmlAccessType.FIELD 指java所有成员变量
@XmlElement: 子节点, name 可指定节点名
@XmlAttribute: 映射为xml文件的属性, name 可指定属性名

javaBean:

1
2
3
4
5
6
7
8
9
10
11
@Data
@XmlRootElement(name = "alipay")
@XmlAccessorType(XmlAccessType.FIELD)
class AliPayXml {

@XmlElement(name = "alipay_buyer_login_id" )
private String buyerLoginId;

@XmlElement(name = "alipay_buyer_user_id")
private String buyerUserId;
}
2. 使用 JaxbUtil

JaxbUtil代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.liuzhihang.tool.xml;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
* Jaxb 工具
*
* @author liuzhihang
* @date 2017/11/28 19:13
*/
public class JaxbUtil {

private static final String CHARTSET = "UTF-8";

public static String bean2Xml(Object obj) throws JAXBException {
return bean2Xml(obj, CHARTSET);
}

public static String bean2Xml(Object obj, String chartset) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, chartset);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.getBuffer().toString();
}

public static <T> T xml2Bean(String xmlString, Class<T> clazz) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
T t = (T) unmarshaller.unmarshal(new StringReader(xmlString));
return t;
}
}

3. 测试代码

待测试字符串: xmlStr

1
2
3
4
<alipay>
<alipay_buyer_login_id>176****3035</alipay_buyer_login_id>
<alipay_buyer_user_id>2088912868994947</alipay_buyer_user_id>
</alipay>

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/**
* @Description:
* @Author: liuzhihang
* @Date: 2017/12/17 23:11
*/
public class JaxbTest {

public static void main(String[] args) throws JAXBException {
String aliPayXmlStr = "<alipay>\n" +
" <alipay_buyer_login_id>176****3035</alipay_buyer_login_id>\n" +
" <alipay_buyer_user_id>2088912868994947</alipay_buyer_user_id>\n" +
"</alipay>";

AliPayXml aliPayXml = JaxbUtil.xml2Bean(aliPayXmlStr, AliPayXml.class);
System.out.println(JSON.toJSONString(aliPayXml));
}
}

测试结果:

打印的为json格式结果, 可debugger查看. 同样也可以将javaBean转换为xmlStr

1
{"buyerLoginId":"176****3035","buyerUserId":"2088912868994947"}