zoukankan      html  css  js  c++  java
  • 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);
                }
            }
    
        }
  • 相关阅读:
    从Object对象中读取属性的值
    CentOS7安装Mysql
    CentOS初使用命令总结
    linux安装git、node、pm2
    将 ELASTICSEARCH 写入速度优化到极限
    Elasticsearch
    elasticsearch5.0.1集群索引分片丢失的处理
    ELASTICSEARCH健康red的解决
    使用linux远程登录另一台linux
    fiddler构造表单上传文件的请求
  • 原文地址:https://www.cnblogs.com/demingblog/p/3246870.html
Copyright © 2011-2022 走看看