Dom4j递归遍历XML所有元素

做一个递归遍历XML的例子,为更为复杂的解析工作做基础。
 
 
目标:遍历所有的元素节点,并且取出来其中的值,结果打印到控制台。
 
源代码如下:
本程序依赖DOM4j包。
 
import org.dom4j.Document; 
import org.dom4j.DocumentHelper; 
import org.dom4j.DocumentException; 
import org.dom4j.Element; 

import java.util.*; 

/** 
* Created by IntelliJ IDEA.<br> 
* <b>User</b>: leizhimin<br> 
* <b>Date</b>: 2008-4-14 14:02:12<br> 
* <b>Note</b>: Java递归遍历XML所有元素 
*/
 
public  class XmlTest { 

//    private static Map<String, String> xmlmap = new HashMap<String, String>(); 
     //存储xml元素信息的容器 
     private  static List<Leaf> elemList =  new ArrayList<Leaf>(); 

     //要测试的xml对象 
     private  static String srcXml =  "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" + 
             "<doc>\n" + 
             "    <person>\n" + 
             "        <name>某人</name>\n" + 
             "        <adds>            \n" + 
             "            <add ID=\"10002\">\n" + 
             "                <BS>10002</BS>\n" + 
             "                <note>西安市太白路</note>\n" + 
             "            </add>\n" + 
             "            <add ID=\"\">\n" + 
             "                <BS>10002</BS>\n" + 
             "                <note>空ID节点啊</note>\n" + 
             "            </add>\n" + 
             "            <add>\n" + 
             "                <BS>10002</BS>\n" + 
             "                <note>空ID节点啊</note>\n" + 
             "            </add>\n" + 
             "\t\t\t<add ID=\"10001\">\n" + 
             "\t\t\t\t<BS xmlns=\"10001\"/>\n" + 
             "                <note>西安市太白路2</note>\n" + 
             "            </add>\n" + 
             "\t\t</adds>\n" + 
             "    </person>\n" + 
             "    <other>\n" + 
             "        <name ID=\"HEHE\">ASDF</name>\n" + 
             "    </other>\n" + 
             "</doc>"

     public  static  void main(String args[])  throws DocumentException { 
        XmlTest test =  new XmlTest(); 
        Element root = test.getRootElement(); 
        test.getElementList(root); 
        String x = test.getListString(elemList); 

        System.out.println( "-----------原xml内容------------"); 
        System.out.println(srcXml); 
        System.out.println( "-----------解析结果------------"); 
        System.out.println(x); 

    } 

     /** 
     * 获取根元素 
     * 
     * @return 
     * @throws DocumentException 
     */
 
     public Element getRootElement()  throws DocumentException { 
        Document srcdoc = DocumentHelper.parseText(srcXml); 
        Element elem = srcdoc.getRootElement(); 
         return elem; 
    } 

     /** 
     * 递归遍历方法 
     * 
     * @param element 
     */
 
     public  void getElementList(Element element) { 
        List elements = element.elements(); 
         if (elements.size() == 0) { 
             //没有子元素 
            String xpath = element.getPath(); 
            String value = element.getTextTrim(); 
            elemList.add( new Leaf(xpath, value)); 
        }  else { 
             //有子元素 
             for (Iterator it = elements.iterator(); it.hasNext();) { 
                Element elem = (Element) it.next(); 
                 //递归遍历 
                getElementList(elem); 
            } 
        } 
    } 

     public String getListString(List<Leaf> elemList) { 
        StringBuffer sb =  new StringBuffer(); 
         for (Iterator<Leaf> it = elemList.iterator(); it.hasNext();) { 
            Leaf leaf = it.next(); 
            sb.append(leaf.getXpath()).append( " = ").append(leaf.getValue()).append( "\n"); 
        } 
         return sb.toString(); 
    } 


/** 
* xml节点数据结构 
*/
 
class Leaf { 
     private String xpath;          // 
     private String value; 

     public Leaf(String xpath, String value) { 
         this.xpath = xpath; 
         this.value = value; 
    } 

     public String getXpath() { 
         return xpath; 
    } 

     public  void setXpath(String xpath) { 
         this.xpath = xpath; 
    } 

     public String getValue() { 
         return value; 
    } 

     public  void setValue(String value) { 
         this.value = value; 
    } 
}
 
运行结果:
 
-----------原xml内容------------ 
<? xml  version ="1.0"  encoding ="GBK" ?> 
< doc > 
     < person > 
         < name >某人 </ name > 
         < adds >             
             < add  ID ="10002" > 
                 < BS >10002 </ BS > 
                 < note >西安市太白路 </ note > 
             </ add > 
             < add ID="" > 
                 < BS >10002 </ BS > 
                 < note >空ID节点啊 </ note > 
             </ add > 
             < add > 
                 < BS >10002 </ BS > 
                 < note >空ID节点啊 </ note > 
             </ add > 
       < add  ID ="10001" > 
     < BS  xmlns ="10001" /> 
                 < note >西安市太白路2 </ note > 
             </ add > 
   </ adds > 
     </ person > 
     < other > 
         < name  ID ="HEHE" >ASDF </ name > 
     </ other > 
</ doc > 
-----------解析结果------------ 
/doc/person/name = 某人 
/doc/person/adds/add/BS = 10002 
/doc/person/adds/add/note = 西安市太白路 
/doc/person/adds/add/BS = 10002 
/doc/person/adds/add/note = 空ID节点啊 
/doc/person/adds/add/BS = 10002 
/doc/person/adds/add/note = 空ID节点啊 
/doc/person/adds/add/*[name()='BS'] =  
/doc/person/adds/add/note = 西安市太白路2 
/doc/other/name = ASDF 


Process finished with exit code 0
 
可以发现,有很多xpath相同的值域。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/71669,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值