Dom4j解析xml文件-递归遍历所有节点和属性

   Dom4j是Java中常用读取xml文件的工具,就方便性和性能方面,一定程度要优于JDK中Domcument和SAX解析的,感兴趣的童鞋可以看看这篇文章 java解析XML的四种方式及比较,下边我就分享一下用Dom4j对xml文件进行遍历,一看代码就明白了,注释的很详细。

被测试的xml文件test.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <user editor="chenleixing" date="2015-02-15">
        <name>张三</name>
        <year>24</year>
        <sex></sex>
    </user>
    <user editor="zhangxiaochao" date="2015-02-15">
        <name>李四</name>
        <year>24</year>
        <sex></sex>
    </user>
</root>

创建File,获取根节点

        /**
     * 从指定节点开始,递归遍历所有子节点
     * @author chenleixing
     */
    public void getNodes(Element node){
        System.out.println("--------------------");
        
        //当前节点的名称、文本内容和属性
        System.out.println("当前节点名称:"+node.getName());//当前节点名称
        System.out.println("当前节点的内容:"+node.getTextTrim());//当前节点名称
        List<Attribute> listAttr=node.attributes();//当前节点的所有属性的list
        for(Attribute attr:listAttr){//遍历当前节点的所有属性
            String name=attr.getName();//属性名称
            String value=attr.getValue();//属性的值
            System.out.println("属性名称:"+name+"属性值:"+value);
        }
        
        //递归遍历当前节点所有的子节点
        List<Element> listElement=node.elements();//所有一级子节点的list
        for(Element e:listElement){//遍历所有一级子节点
            this.getNodes(e);//递归
        }
    }

从指定节点开始,递归遍历所有节点和属性

        /**
     * 从指定节点开始,递归遍历所有子节点
     * @author chenleixing
     */
    public void getNodes(Element node){
        System.out.println("--------------------");
        
        //当前节点的名称、文本内容和属性
        System.out.println("当前节点名称:"+node.getName());//当前节点名称
        System.out.println("当前节点的内容:"+node.getTextTrim());//当前节点名称
        List<Attribute> listAttr=node.attributes();//当前节点的所有属性的list
        for(Attribute attr:listAttr){//遍历当前节点的所有属性
            String name=attr.getName();//属性名称
            String value=attr.getValue();//属性的值
            System.out.println("属性名称:"+name+"属性值:"+value);
        }
        
        //递归遍历当前节点所有的子节点
        List<Element> listElement=node.elements();//所有一级子节点的list
        for(Element e:listElement){//遍历所有一级子节点
            this.getNodes(e);//递归
        }
    }

输出结果

--------------------
当前节点名称:root
当前节点的内容:
--------------------
当前节点名称:user
当前节点的内容:
属性名称:editor属性值:chenleixing
属性名称:date属性值:2015-02-15
--------------------
当前节点名称:name
当前节点的内容:张三
--------------------
当前节点名称:year
当前节点的内容:24
--------------------
当前节点名称:sex
当前节点的内容:男
--------------------
当前节点名称:user
当前节点的内容:
属性名称:editor属性值:zhangxiaochao
属性名称:date属性值:2015-02-15
--------------------
当前节点名称:name
当前节点的内容:李四
--------------------
当前节点名称:year
当前节点的内容:24
--------------------
当前节点名称:sex
当前节点的内容:女