Java 解析xml報文放入Map,並判斷所有xml標籤是否為空

喝杯白開水發表於2018-11-06

在網上找了很久,找到的一個比較好的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;
		
	}

 

相關文章