XML(六):DOM4J解析XML实例

XML源文件:

<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name= "123"></Type>
        <Type name= "456"></Type>
        <Type name= "789"></Type>
    </Brand>
     <Brand name="iphone">
        <Type name= "iphone6"></Type>
        <Type name= "iphone7"></Type>
        <Type name= "iphone4"></Type>
    </Brand>
</PhoneInfo>

一、获取Document对象

代码如下:

    // 获得Document对象
    public void loadDocument() {
        SAXReader saxReader = new SAXReader();
        try {
            document = saxReader.read(new File("手机信息.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

DOM4J中用来解析原始XML文件的工具是SAXReader 的read方法。由SAXReader 实例化出来的saxReader 对象就对应DOM里面的解析器。

二、遍历:显示手机的品牌和型号

代码如下:

// 显示手机的品牌和型号
    public void showPhoneInfo() {
        // 获取XML的根节点
        Element root = document.getRootElement();
        // 获取所有的Brand
        Iterator eleBrands = root.elementIterator();
        while (eleBrands.hasNext()) {
            Element brand = (Element)eleBrands.next();
            System.out.println(brand.attributeValue("name"));
            Iterator eleTypes = brand.elementIterator();
            while (eleTypes.hasNext()) {
                Element type = (Element)eleTypes.next();
                System.out.println("\t" + type.attributeValue("name"));
            }
        }
    }

先获取根元素,然后通过迭代器的方式来遍历。获取属性值的方法是attributeValue()。

三、保存修改到XML文件

代码如下:

// 保存修改到XML文件
    public void saveXML(String path) {
        /*OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");*/
        XMLWriter writer = null;
        try {
            writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"));
            writer.write(document);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

分析:保存修改到XML文件的方法是XMLWriter对象的write方法。可以把XMLWriter看做是跟ObjectWriter一样的东西,只不过一个是写对象,一个是写XML。在XMLWriter实例化的时候,里面可以放一个Writer对象,一般可以用OutputStreamWriter,因为这个在写出去的时候可以指定字符编码格式,避免乱码。
同时,OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8");这段代码的作用是指定输出时候的各种格式,底层机理不清楚,视频也没讲明白。这里实例化出来的XMLWriter对象在构造的时候有一种构造方法是有OutputFormat参数的,所以如果需要用这个构造方法的话,就需要这两句代码了。

四、新增手机品牌信息

代码如下:

// 增加新的手机品牌信息
    public void addNewPhone() {
        // 获得XML的根元素
        Element root = document.getRootElement();
        // 创建Brand
        Element eleBrand = root.addElement("Brand");
        eleBrand.addAttribute("name", "三星");
        // 创建Type
        Element eleType = eleBrand.addElement("Type");
        eleType.addAttribute("name", "Note2");
        saveXML("newInfo.xml");
    }

分析:这端代码的逻辑是直接在根节点下面去加元素节点,然后再在该元素节点下面去加其下一级的元素节点。其实内部逻辑跟DOM解析一样。

五、修改节点

代码如下:

// 修改节点,加id
    public void updatePhone() {
        Element root = document.getRootElement();
        Iterator eleBrands = root.elementIterator();
        int id = 0;
        while (eleBrands.hasNext()) {
            Element brand = (Element)eleBrands.next();
            id++;
            brand.addAttribute("id", id + "");
        }
        saveXML("newInfo.xml");
    }

分析:其实就是个遍历+设置属性+保存。

六、删除节点

代码如下:

    // 删除节点
    public void deletePhone() {
        Element root = document.getRootElement();
        Iterator eleBrands = root.elementIterator();
        while (eleBrands.hasNext()) {
            Element brand = (Element)eleBrands.next();
            if (brand.attributeValue("name").equals("iphone")) {
                brand.getParent().remove(brand);
            }
        }
        saveXML("newInfo.xml");
    }

分析:其实就是个遍历+删除节点+保存。另外要注意删除节点是调用其父节点来删除的。

七、总结

DOM解析看懂之后再来看DOM4J,简直是小菜一碟。DOM4J比DOM要写的代码行数更少,更加简洁一点。相当于是对DOM4J进行了一次封装,用起来更加方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是XML? XML:extensiable markup language 被称作可扩展标记语言 XML简单的...
    Java3y阅读 7,093评论 5 41
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,724评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • 选译自村上春树的问答栏目(http://www.welluneednt.com) 本篇原文:http://www....
    阿道阅读 1,488评论 0 3
  • (也许,我不应该相信童话) 有一棵树 挂满了红布 听说有一个这样的风俗 不恐怖 却令人想哭 牛奶泡着阳光 温度刚好...
    抄花阴阅读 1,716评论 0 5