利用dom4j解析XML报文,解析出所有的节点以及内容

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42256395/article/details/80403374

先说一下最开始自己的需求吧,我需要把一段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;  
    } 


最后说一下  参考文章https://blog.csdn.net/sidihuo/article/details/47318723  如果不对之处,欢迎大家纠正和指出。

展开阅读全文

没有更多推荐了,返回首页