java解析XML——dom4j解析

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文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值