在网上找了很久,找到的一个比较好的xml解析方法,封装好的解析xml报文的方法:
public class analyxml{
public Mapmap = new HashMap();
public Map parse(String soap) throws DocumentException {
Document doc = DocumentHelper.parseText(soap);// 报文转成doc对象
Element root = doc.getRootElement();// 获取根元素,准备递归解析这个XML树
getCode(root);
return map;
}
public void getCode(Element root) {
if (root.elements() != null) {
Listlist = root.elements();// 如果当前跟节点有子节点,找到子节点
for (Element e : list) {// 遍历每个节点
if (e.elements().size() > 0) {
getCode(e);// 当前节点不为空的话,递归遍历子节点;
}
if (e.elements().size() == 0) {
map.put(e.getName(), e.getTextTrim());
} // 如果为叶子节点,那么直接把名字和值放入map
}
}
}
}
测试xml报文:
FMSPAY0010
04
20181029085400000001
20181023085400
20181023
20181105153740558
银行编号或密码不正确!
测试类:
import java.util.Map;
import org.dom4j.DocumentException;
import com.com.analyxml;
public class test2 {
public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
String xml = "FMSPAY001004201810290854000000012018102308540020181023990220181105161524325银行编号或密码不正确!";
analyxml aly = new analyxml();
Map map = aly.parse(xml);
String ReturnCode = map.get("ReturnCode").toString().trim();
String ResponseTime = map.get("ResponseTime").toString().trim();
System.out.println("ReturnCode===" + ReturnCode);
System.out.println("ResponseTime===" + ResponseTime);
}
}
结果为:
由于项目需要尽可能的把错误提示的明显一点,(如果请求委托方的信息有问题,委托方也会返回xml报文回来,但是所有标签都是空值,)所以要判断xml的所有标签是否都是空值,在网上找了很久没有找到合适的判断xml是否为空的方法,于是写了一个小方法,如下: (利用的是set集合的不可重复性)
public static boolean ishave(Mapmap){
//利用set的不可重复性来判断Map中是否所有的value都是空
Set hs = new HashSet();
boolean status = false;
//遍历Map
for (Entryentry : map.entrySet()) {
System.out.println("key= " + entry.getKey());
System.out.println("value= " + entry.getValue());
hs.add(entry.getValue());
}
if(hs.size()>1){
status = true;
}
return status;
}