利用dom4j解析XML報文,解析出所有的節點以及內容
阿新 • • 發佈:2019-01-31
先說一下最開始自己的需求吧,我需要把一段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;
}