java类:javax.xml.bind.JAXBContext
它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组、编组和验证。
1.编写工具类
/**
* Jaxb工具类
*
* @author LittleNewbie
* @date 2016年10月11日
*/
public class JaxbUtil {
public static final String DEFAULT_ENCODING = "UTF-8";
/**
* pojo转换成xml 默认编码UTF-8
*
* @param obj 待转化的对象
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj) throws Exception {
return convertToXml(obj, DEFAULT_ENCODING);
}
/**
* pojo转换成xml
*
* @param obj 待转化的对象
* @param encoding 编码
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj, String encoding) throws Exception {
String result = null;
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
return result;
}
/**
* xml转换成JavaBean
*
* @param xml xml格式字符串
* @param t 待转化的对象
* @return 转化后的对象
* @throws Exception JAXBException
*/
@SuppressWarnings("unchecked")
public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
T obj = null;
JAXBContext context = JAXBContext.newInstance(t);
Unmarshaller unmarshaller = context.createUnmarshaller();
obj = (T) unmarshaller.unmarshal(new StringReader(xml));
return obj;
}
}
2.为pojo简单java对象添加注解
2.1 xml顶级元素
/**
* 请求报文基础类
* 请求报文的实现方式:
* 1.使用默认的顶级标签元素<Request><Request/>:直接创建该类对象;
* 2.使用其他顶级标签元素:继承该类,并添加注解@XmlRootElement(name = "rootName") rootName区分大小写
*
* @author LittleNewbie
* @date 2016年10月11日
*/
//类中的每个非静态、非瞬态字段将会自动绑定到 XML,除非由 XmlTransient 注释
@XmlAccessorType(XmlAccessType.FIELD)
//xml顶级元素标签
@XmlRootElement(name = "Request")
public class RequestPacket {
/**
* 请求包体消息
*/
private MsgBody msgBody;
public RequestPacket() {
}
//getter setter...
}
2.2 xml顶级元素,继承2.1
/**
* 数据请求报文-根节点
* @author LittleNewbie
* @date 2016年10月11日
*
*/
@XmlRootElement(name = "DATARequest")
public class DataRequestPacket extends RequestPacket {
public DataRequestPacket() {
}
}
2.3 xml元素标签,包含其他元素标签
/**
* 请求包体消息
* @author LittleNewbie
* @date 2016年10月11日
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
public class MsgBody {
@XmlElementWrapper(name = "CONDITIONLIST")
@XmlElement(name = "CONDITION")
private List<String> conditionList;
/**
* 如果不添加XmlElement注解,默认以属性名生成xml元素标签
*/
@XmlElement(name = "DATALIST")
private String dataList;
private String config;
public MsgBody() {
}
//getter setter...
}
3.测试代码及运行结果
测试代码
RequestPacket root = new DataRequestPacket();
MsgBody body = new MsgBody();
String[] conditions = { "condition_1", "condition_2" };
body.setConditionList(Arrays.asList(conditions));
body.setDataList("");
//这里不设置config值,属性值为null,将不会转为xml标签
//body.setConfig("");
root.setMsgBody(body);
String xmlStr = JaxbUtil.convertToXml(root);
System.out.println(xmlStr);
结果
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- 顶级元素为DataRequestPacket的@XmlRootElement注解值 -->
<DATARequest>
<!-- 默认为属性(字段)名 -->
<msgBody>
<!-- 这里对照pojo一看就懂了 -->
<CONDITIONLIST>
<CONDITION>condition_1</CONDITION>
<CONDITION>condition_2</CONDITION>
</CONDITIONLIST>
<!-- @XmlElement注解 -->
<DATALIST></DATALIST>
<!-- config值为null,不对其进行转换 -->
</msgBody>
</DATARequest>
4.附加操作
4.1 过滤 standalone="yes"
xmlStr.replaceFirst(" standalone=\"yes\"", "")
4.2 将xml元素标签转为大写
String regex = "<(/*[A-Za-z]+)>";
Matcher matcher = Pattern.compile(regex).matcher(xmlStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "<" + matcher.group(1).toUpperCase() + ">");
}
matcher.appendTail(sb);
sb.toString();
4.3 获取xml元素标签内容
4.3.1 xml元素标签唯一
/**
* 获取xml字符串中元素标签值
* <p>xml中元素标签唯一</p>
*
* @param responseXml 响应报文(xml字符串格式)
* @param element 元素名(不区分大小写)
* @return
* @throws Exception
*/
public static String getXmlSingleElementValue(String responseXml, String element) {
//元素名大写<ELEMENT>(.*)<ELEMENT/>
StringBuffer regex = new StringBuffer();
regex.append("<").append(element.toUpperCase()).append(">");
regex.append("(.*)");
regex.append("</").append(element.toUpperCase()).append(">");
String str = "";
Matcher matcher = Pattern.compile(regex.toString()).matcher(responseXml);
while (matcher.find()) {
str = matcher.group(1);
}
return str;
}
4.3.1 xml元素标签不唯一(存在多个)
/**
* 获取xml字符串中元素标签值
* <p>xml存在多个该元素标签</p>
* <p>exmple:<DATA></DATA></p>
*
* @param responseXml 响应报文(xml字符串格式)
* @param element 元素名(不区分大小写)
* @return
* @throws Exception
*/
public static List<String> getXmlListElementValue(String responseXml, String element) {
List<String> list = new ArrayList<String>();
//元素名大写<ELEMENT>([^</ELEMENT>]*)</ELEMENT>
StringBuffer regex = new StringBuffer();
regex.append("<").append(element.toUpperCase()).append(">");
regex.append("([^</" + element.toUpperCase() + ">]*)");
regex.append("</").append(element.toUpperCase()).append(">");
Matcher matcher = Pattern.compile(regex.toString()).matcher(responseXml);
while (matcher.find()) {
list.add(matcher.group(1));
}
return list;
}
来源:oschina
链接:https://my.oschina.net/u/2887518/blog/777507