java解析XML——dom4j解析

来源:互联网 发布:mac office 2016破解版 编辑:程序博客网 时间:2024/06/16 04:21
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,
 具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它. 对主流的java XML
 API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来
 越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。
 使用Dom4j开发,需下载dom4j相应的jar文件 1.官网下载: http://www.dom4j.org/dom4j-1.6.1/
 2.dom4j是sourceforge.NET上的一个开源项目,因此可以到http://sourceforge.net/projects/dom4j
 或者https://dom4j.github.io/下载其最新版.同时,后者也是相应的教程。
 然后打开dom4j-1.6.1的解压文件,在这里可以看到有docs帮助的文件夹,也有需要使用dom4j解析xml
  文件的dom4j-1.6.1.jar文件.我们只需要把dom4j-1.6.1.jar文件构建到我们开发的项目中就可以使用dom4j开发了.

1、环境准备:下载dom4j-1.6.1.jar

2. 基本介绍:解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

(1)自己创建Document对象

    Document document = DocumentHelper.createDocument();  
    Element root = document.addElement("students");  

 其中students是根节点,可以继续添加其他节点等操作。

(2)读取XML文件获取Document对象


    //创建SAXReader对象  
            SAXReader reader = new SAXReader();  
            //读取文件 转换成Document  
            Document document = reader.read(new File("XXXX.xml"));  

(3)读取XML文本内容获取Document对象

    String xmlStr = "<students>......</students>";  
            Document document = DocumentHelper.parseText(xmlStr);

3. 具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students>    <student>        <name sex="man">小明</name>        <nickName>明明</nickName>        <age>20</age>        <address>北京</address>    </student>    <student>        <name sex="woman">小红</name>        <nickName>红红</nickName>        <age>20</age>        <address>上海</address>    </student>    <student>        <name sex="man">小亮</name>        <nickName>亮亮</nickName>        <age>30</age>        <address>广州</address>    </student>    <student-0>        <name sex="man">小亮-0</name>        <nickName>亮亮-0</nickName>        <age>200</age>        <address>广州-0</address>    </student-0></students>




(2)解析文件并且遍历打印:
private void parseXml(int flag) {        long startTime = System.currentTimeMillis();        System.out.println("Dom4j开始解析: " + startTime);Bean1 bean = null;        try {                                        // 创建SAXReader对象                SAXReader reader = new SAXReader();                // 读取文件 转换成Document                Document document = reader.read(xmlFile);                        // 获取根节点元素对象            Element rootElement = document.getRootElement();// 第一种方法遍历            // listNodes(rootElement);            // 第二种方法遍历            List<Element> elements = rootElement.elements();            for (Element child : elements) {                // 未知属性名情况下                /*                 * List<Attribute> attributeList = child.attributes(); for                 * (Attribute attr : attributeList) {                 * System.out.println(attr.getName() + ": " + attr.getValue());                 * }                 */                // 已知属性名情况下                Element child2 = child.element("name");                Attribute attribute = child2.attribute("sex");                System.out.println("sex: " + attribute.getText());                // 未知子元素名情况下                /*                 * List<Element> elementList = child.elements(); for (Element                 * ele : elementList) { System.out.println(ele.getName() + ": "                 * + ele.getText()); } System.out.println();                 */                // 已知子元素名的情况下                System.out.println("name: " + child.elementText("name"));                System.out.println("age: " + child.elementText("age"));                System.out.println("address: " + child.elementText("address"));                System.out.println("nickName: " + child.elementText("nickName"));                // 这行是为了格式化美观而存在                System.out.println();            }        } catch (DocumentException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        long finishTime = System.currentTimeMillis();        long time = finishTime - startTime;        System.out.println("结束解析: " + finishTime + "\nDom4j解析耗时:" + time);        for (Bean1 student : datas) {            System.out.println(student.toString());        }    }/**     *  遍历当前节点下的所有节点     * @param node     */    public void listNodes(Element node) {        System.out.println("当前节点的名称:" + node.getName());        // 首先获取当前节点的所有属性节点        List<Attribute> list = node.attributes();        // 遍历属性节点        for (Attribute attribute : list) {            System.out.println("属性" + attribute.getName() + ":" + attribute.getValue());        }        // 如果当前节点内容不为空,则输出        if (!(node.getTextTrim().equals(""))) {            System.out.println(node.getName() + ":" + node.getText());        }        // 同时迭代当前节点下面的所有子节点        // 使用递归        Iterator<Element> iterator = node.elementIterator();        while (iterator.hasNext()) {            Element e = iterator.next();            listNodes(e);        }    }





(3)添加/删除节点

   
private void addOrRemoveNode() {        try {            // 增加新的节点            System.out.println("增加/删除节点开始");            SAXReader reader = new SAXReader();            Document document = reader.read(xmlFile);            Element root = document.getRootElement();            // 错了,root就是students的节点。            // Element element = root.element("students");            Element studentEl = root.addElement("student001");            Element nameEl = studentEl.addElement("name");            nameEl.addAttribute("sex", "woman");            nameEl.setText("小黄");            Element nickNameEl = studentEl.addElement("nickName");            nickNameEl.setText("阿黄");            Element ageEl = studentEl.addElement("age");            ageEl.setText("28");            Element addEl = studentEl.addElement("address");            addEl.setText("甘肃省兰州市");            // 删除student-0的节点            Element el2remove = root.element("student-0");            Element age2 = el2remove.element("age");            root.remove(el2remove);            writeDocmuent2File(document);            System.out.println("添加/删除节点完成");                    } catch (Exception e) {        }    }




(4)添加/删除节点中的某个属性值
    
 
  private void addOrRemoveAttr() {        try {            SAXReader reader = new SAXReader();            Document document = reader.read(xmlFile);            Element root = document.getRootElement();            // 删除属性            Element student0 = root.element("student-0");            Element name0 = student0.element("name");            Attribute sex0 = name0.attribute("sex");            name0.remove(sex0);            // 添加属性            Element address0 = student0.element("address");            address0.addAttribute("国家", "中国");            writeDocmuent2File(document);        } catch (Exception e) {        }    }




     (5) 更新节点的值或属性值
    
   
private void updateValue(){        try{            SAXReader reader = new SAXReader();            Document document = reader.read(xmlFile);            Element root = document.getRootElement();                        Element student1 = root.element("student-1");            Element name1 = student1.element("name");            Attribute sex1 = name1.attribute("sex");                        //下面两句,效果一样。//            sex1.setValue("hahahahah");            sex1.setText("enenenen");            Element address1 = student1.element("address");            address1.setText("芝加哥");                        writeDocmuent2File(document);                    }catch(Exception e ){}    }





(6)将XML内容写入到文件

private void writeDocmuent2File(Document docment) throws Exception {        // 输出格式        // 紧凑的格式        // OutputFormat format = OutputFormat.createCompactFormat();        // 排版缩进的格式        OutputFormat format = OutputFormat.createPrettyPrint();        format.setEncoding("utf-8");        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"), format);        writer.write(docment);        writer.flush();        writer.close();    }


demo传送门:
https://github.com/215836017/ParseXML_java

https://github.com/215836017/ParserXML_android

注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
    Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。