1. 程式人生 > >利用dom4j解析XML報文,解析出所有的節點以及內容

利用dom4j解析XML報文,解析出所有的節點以及內容

先說一下最開始自己的需求吧,我需要把一段xml的報文裡面最裡面一層的所有節點以及內容全部取出來,按照常規方法都是根據節點名字去取吧  雖然寫出來了 但是很繁瑣  覺得程式碼很冗餘  後來想到了遞迴  用遞迴去取 果然簡單了很多   下面直接貼程式碼了

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class XmlTest2 {
  //順便說一下這兒定義一個靜態物件的原因,最開始我是在遞迴方法中去定義了一個Map,發現每次遞迴時,map中只有一個節點和值,仔細一想,發現每一次遞迴都會
次遞迴都會新生成一個Map,然後我接受到的始終是第一次傳進去的值,所以定義一個靜態物件,每次遞迴都往裡面存,就可以全部取出來了,無論xml報文多少層,都可以解析完成
       public static Map a=new HashMap();
	public static void main(String[] args) {
		String xmldata="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			     + "<Root>"
	                +"<MsgBody>"
	                   +"<Sec>"
	                   + "<SgnInf>"
	                       +"<SingAcctIssId>12345</SingAcctIssId>"
	                   +"</SgnInf>"
	                   + "<InstgInf>"
	                       + "<InstgId>3748584758478</InstgId>"
	                   + "</InstgInf>"
	                   + "</Sec>"
	               + "</MsgBody>"
	            + "</Root>";
	
	Map c=convertXmlToMap(xmldata);
	Map b=new HashMap();
	//遍歷map
	Print(c);

	}
	/**
	 * xml報文轉換為map
	 * @param xmldata
	 * @return
	 */
	public static Map convertXmlToMap(String xmldata){
		Map<String,String> map=new HashMap<String,String>();
	    Document doc=null;
	    
	    try {
	    	//將字串轉換為doc
	    	System.out.println(xmldata);
			doc=DocumentHelper.parseText(xmldata);
			//獲取根節點
			Element root=doc.getRootElement();
			map=getNodes(root);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	  
		return map;
		
	}
	//遍歷map 列印每一個引數
	public static void Print(Map map){
		Iterator it=map.entrySet().iterator();
	    while(it.hasNext()){
	    	Map.Entry entry=(Map.Entry) it.next();
	    	Object key = entry.getKey();  
	    	   Object value = entry.getValue();  
	    	  System.out.println("key=" + key + " value=" + value); 
	   }
       }
	//遞迴遍歷所有節點
   /** 
     * 從指定節點Element node開始,遞迴遍歷其所有子節點 
     */  
    public static Map getNodes(Element node) {  
        System.out.println("-------開始新節點-------------");  
        // 當前節點的名稱、文字內容和屬性  
        System.out.println("當前節點名稱:" + node.getName());// 當前節點名稱  
        System.out.println("當前節點的內容:" + node.getTextTrim());// 當前節點內容
       //值不為空時加入map中去
       if(!node.getTextTrim().isEmpty()){
    	   a.put(node.getName(),node.getTextTrim());
       }
       // 遞迴遍歷當前節點所有的子節點  
        final List<Element> listElement = node.elements();// 所有一級子節點的list  
        for (final Element e : listElement) {// 遍歷所有一級子節點  
            getNodes(e);// 遞迴
        }
	return a;  
    }