java使用dom4j解析xml文件

关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析。假如有如下xml:

       dom4j解析xml其实很简单,只要你有点java基础,知道xml文件。结合下面的xml文件和java代码,多看几遍(代码很简单,不要嫌看代码烦),把他解析的过程看明白,就会很简单

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student>
        <name type="String">aaa</name>
        <age  type="int">22</age>
    </student>
    <student>
        <name type="String">bbb</name>
        <age  type="int">23</age>
    </student>
    <student>
        <name type="String">ccc</name>
        <age  type="int">21</age>
    </student>
</students>

加入我们解析上面这个xml文件,无非是想得到其中的 name值,age值,有时候还需要type值

使用到的类有:org.dom4j.io.SAXReader;
           --read  提供多种读取xml文件的方式,返回一个Domcument对象
       org.dom4j.Document;
          --iterator  使用此法获取node
           --getRootElement  获取根节点
  
       org.dom4j.Attribute;  
          --getName  获取属性名
          --getValue  获取属性值  
                    org.dom4j.Element;  
          --attributes  返回该元素的属性列表
           --attributeValue  根据传入的属性名获取属性值
          --elementIterator  返回包含子元素的迭代器

          --elements  返回包含子元素的列表

  下面看一下java代码

public static void domxml() throws Exception {
        // SAXReader就是一个管道,用一个流的方式,把xml文件读出来
        SAXReader reader = new SAXReader();
        // read 提供多种读取xml文件的方式,返回一个Domcument对象
        Document document = reader.read(new File("F:" + File.separator + "student.xml"));
        // 获取根节点
        Element rootElement = document.getRootElement();
        System.out.println("根的名称:" + rootElement.getName());// 拿到根节点的名称

        Iterator iter = rootElement.elementIterator(); // 获取根节点下的子节点

        while (iter.hasNext()) {
            StringBuffer sb = new StringBuffer("");
            // 子节点
            Element nodeElement = (Element) iter.next();
            // System.out.println("-根下第一层节点名称:"+nodeElement.getName()+",值"+nodeElement.getText());
            sb.append("" + nodeElement.getName() + ":");
            // 节点属性
            Iterator i = nodeElement.elementIterator();
            while (i.hasNext()) {
                Element e = (Element) i.next();
                // System.out.println("--根下第二层节点名称:"+e.getName()+",节点值:"+e.getText());
                sb.append(e.getName() + "-" + e.getText() + ";");
                 //遍历节点属性值
                 List<Attribute> attr=e.attributes();
                 for(Attribute a:attr){
                 System.out.println("---节点属性:"+a.getName()+",属性值"+a.getText());
                 }
            }
            System.out.println(sb);
            sb = null;
        }

    }

如果你看明白了上面的代码,看懂了,你肯定会绝得这里嵌套了两个while,加入有三层的话,是不是得写三个while?

不知道你看我上面的代码后有什么想法?反正我弄明白之后,立马就想到了改用递归写这个解析的方法,于是代码如下:

    public static void dgXml(Element element) {
        if (element.nodeCount() > 0) {// 还有子节点
            Iterator<?> it = element.elementIterator();
            while (it.hasNext()) {
                Element e = (Element) it.next();
                String name = e.getName();
                String value =  e.getTextTrim().equals("")? "空": e.getTextTrim();
                System.out.print(name + "," + value+ ";Data[");
                
                if(e.attributeCount()>0){
                    Iterator<?> ait=e.attributeIterator();
                    while(ait.hasNext()){
                        Attribute attribute = (Attribute) ait.next();
                        System.out.print(attribute.getName()+"|"+attribute.getText()+";");
                    }
                }
                System.out.println("]");
                dgXml(e);
            }
        }

    }

 

 

 

posted @ 2013-08-08 21:40  逃离沙漠  阅读(1533)  评论(0编辑  收藏  举报