2011-01-21 11:56:16  浏览:4832

java dom4j

做一个递归遍历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"?> " + 
            "<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>"

    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(" "); 
        } 
        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> 
                返回首页