java使用dom4j解析xml文件

前端之家收集整理的这篇文章主要介绍了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</nameage  ="int">22age>bbb>23>ccc>21>
>

加入我们解析上面这个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();
             (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?

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

    void dgXml(Element element) {
        if (element.nodeCount() > 0) { 还有子节点
            Iterator<?> it = element.elementIterator();
             (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();
                    (ait.hasNext()){
                        Attribute attribute = (Attribute) ait.next();
                        System.out.print(attribute.getName()+"|"+attribute.getText()+";");
                    }
                }
                System.out.println("]");
                dgXml(e);
            }
        }

    }

 

 

 

猜你在找的Java相关文章