在网上找了很久,找到的一个比较好的xml解析方法,封装好的解析xml报文的方法:
public class analyxml{
public Map<String, Object> map = new HashMap<String, Object>();
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) {
List<Element> list = 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报文:
<?xml version="1.0" encoding="UTF-8"?>
<Service>
<Header>
<ServiceCode>FMSPAY0010</ServiceCode>
<ChannelId>04</ChannelId>
<ExternalReference>20181029085400000001</ExternalReference>
<RequestTime>20181023085400</RequestTime>
<TradeDate>20181023</TradeDate>
<Response>
<ReturnCode></ReturnCode>
<ResponseTime>20181105153740558</ResponseTime>
<ReturnMessage>银行编号或密码不正确!</ReturnMessage>
</Response>
</Header>
</Service>
测试类:
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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Service><Header><ServiceCode>FMSPAY0010</ServiceCode><ChannelId>04</ChannelId><ExternalReference>20181029085400000001</ExternalReference><RequestTime>20181023085400</RequestTime><TradeDate>20181023</TradeDate><Response><ReturnCode>9902</ReturnCode><ResponseTime>20181105161524325</ResponseTime><ReturnMessage>银行编号或密码不正确!</ReturnMessage></Response></Header></Service>";
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(Map<String, Object> map){
//利用set的不可重复性来判断Map中是否所有的value都是空
Set hs = new HashSet();
boolean status = false;
//遍历Map
for (Entry<String, Object> entry : 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;
}