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.
 
* User: leizhimin
 
* Date: 2008-4-14 14:02:12
 
* Note: Java递归遍历XML所有元素 
*/
 
public  class XmlTest { 

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

     //要测试的xml对象 
     private  static String srcXml =  "\n" + 
             "\n" + 
             "    \n" + 
             "        某人\n" + 
             "                    \n" + 
             "            \n" + 
             "                10002\n" + 
             "                西安市太白路\n" + 
             "            \n" + 
             "            \n" + 
             "                10002\n" + 
             "                空ID节点啊\n" + 
             "            \n" + 
             "            \n" + 
             "                10002\n" + 
             "                空ID节点啊\n" + 
             "            \n" + 
             "\t\t\t\n" + 
             "\t\t\t\t\n" + 
             "                西安市太白路2\n" + 
             "            \n" + 
             "\t\t\n" + 
             "    \n" + 
             "    \n" + 
             "        ASDF\n" + 
             "    \n" + 
             ""

     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 elemList) { 
        StringBuffer sb =  new StringBuffer(); 
         for (Iterator 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,如需转载请自行联系原作者

你可能感兴趣的:(java,开发工具,数据结构与算法)