xml解析: dom4j

目录

一、XML解析

1.概述

2.解析方式和解析器

二、Dom4j的基本使用

1.解析原理

2.基本使用

2.常用方法

(1)SaxReader对象

(2)Document对象

(3)Element对象

三、dom4j练习

1.使用dom4j查询xml

2.使用dom4j实现添加操作

3.使用dom4j实现在特定位置添加元素 

4.使用dom4j实现修改节点的操作

5.使用dom4j实现删除节点的操作

6.使用dom4j获取属性的操作

7.使用dom4j支持xpath的操作

8.使用dom4j支持xpath具体操作

一、XML解析

1.概述

当将数据存储在XML后,我们就希望通过程序获取XML的内容。人们为不同问题提供不同的解析方式,使用不同的解析器进行解析,方便开发人员操作XML。

2.解析方式和解析器

开发中比较常见的解析方式有三种,如下:

(1)DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象

a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

b)缺点:XML文档过大,可能出现内存溢出

(2)SAX:是一种速度更快,更有效的方法。她逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都触发对应的事件。(了解)

a)优点:处理速度快,可以处理大文件

b)缺点:只能读,逐行后将释放资源,解析操作繁琐。

(3)PULL:Android内置的XML解析方式,类似SAX。(了解)

 

解析器,就是根据不同的解析方式提供具体实现。

(1)常见的解析开发包

JAXP:sun公司提供支持DOM和SAX开发包

Dom4j:比较简单的的解析开发包(常用)

JDom:与Dom4j类似

Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便(项目中讲解)

二、Dom4j的基本使用

1.解析原理

XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。

2.基本使用

需要引入   jar/dom4j-1.6.1.jar

dom4j 必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了。

2.常用方法

(1)SaxReader对象

(2)Document对象

(3)Element对象

三、dom4j练习

1.使用dom4j查询xml

        //1、创建解析器
        SAXReader reader = new SAXReader();
        //2、得到document
        Document doc = reader.read("src/Person.xml");
        //3、得到根节点
        Element root = doc.getRootElement();
        //4、得到所有的student标签
        List<Element> list = root.elements("student");
        //5.遍历
        for (Element element : list) {
            Element name = element.element("name");
            System.out.println(name.getText());
        }

2.使用dom4j实现添加操作

* 在第一个student标签末尾添加一个元素 <sex>男</sex>

        //创建解析器
        SAXReader sr = new SAXReader();
        //得到document
        Document doc = sr.read("/person.xml");
        //得到根节点
        Element root = doc.getRootElement();
        //得到第一个student节点
        Element e1 = root.element("student");
        //添加sex标签
        Element sex = e1.addElement("sex");
        //给标签添加内容
        sex.setText("男");
        //回写xml,使用XMLWriter类
        OutputFormat opf = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("/person.xml"), opf);
        xmlWriter.write(doc);
        //关闭流
        xmlWriter.close();

3.使用dom4j实现在特定位置添加元素 

* 在所有student下面的age标签之前添加 <hobby>篮球</hobby>

        // 创建解析器
        SAXReader sr = new SAXReader();
        // 得到document
        Document doc = sr.read("/person.xml");
        // 得到根节点
        Element root = doc.getRootElement();
        // 得到所有student标签
        List<Element> list = root.elements("student");
        // 遍历student标签
        for (Element element : list) {
            // 得到student标签的每一个子标签
            List<Element> list2 = element.elements();
            // 使用DocumentHelper类来创建标签
            Element hobby = DocumentHelper.createElement("hobby");
            hobby.setText("篮球");
            // 加到age所在的角标位置
            list2.add(1, hobby);
        }
        // 回写xml
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
                "/person.xml"), new OutputFormat().createPrettyPrint());
        xmlWriter.write(doc);
        // 关闭流
        xmlWriter.close();

4.使用dom4j实现修改节点的操作

* 修改第一个student下面的age元素的值 <age>28</age>

 public static void main(String[] args) throws Exception {
        String path = "person.xml";
        Document doc = createMySAXReader(path);
        // 得到根节点
        Element root = doc.getRootElement();
        //得到第一个student节点
        Element e1 = root.element("student");
        //修改该节点的age值
        e1.element("age").setText("26");
        ReWrite(path, doc);
    }

    public static Document createMySAXReader(String path) throws Exception {
        // 创建解析器
        SAXReader sr = new SAXReader();
        // 得到document
        Document doc = sr.read(path);
        return doc;
    }

    // 回写xml方法
    public static void ReWrite(String path, Document doc) throws Exception {
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),
                new OutputFormat().createPrettyPrint());
        xmlWriter.write(doc);
        xmlWriter.close();
    }

5.使用dom4j实现删除节点的操作

* 删除第一个student下面的<hobby>篮球</hobby>元素

        String path = "person.xml";
        Document doc = createMySAXReader(path);
        // 得到根节点
        Element root = doc.getRootElement();
        // 得到第一个student节点
        Element e1 = root.element("student");
        Element e2 = e1.element("hobby");
        // 通过父节点删除hobby节点
        e1.remove(e2);
        ReWrite(path, doc);

6.使用dom4j获取属性的操作

* 获取第一个student里面的属性id1的值

        String path = "person.xml";
        Document doc = createMySAXReader(path);
        // 得到根节点
        Element root = doc.getRootElement();
        // 得到第一个student节点
        Element e1 = root.element("student");
        // 通过attributeValue()方法得到id1属性的值
        String value=e1.element("name").attributeValue("id");
        System.out.println(value);

7.使用dom4j支持xpath的操作

(1)/AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB元素

(2)//BBB:表示和这个名称相同,只要名称是BBB,都得到

(3)/*:所有元素

(4)BBB[1]:表示第一个BBB元素

(5)BBB[last()]:表示最后一个BBB元素

(6)//BBB[@id]:表示只要BBB元素上面有id属性,都得到

(7)//BBB[@id='b1']:表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

8.使用dom4j支持xpath具体操作

dom4j中要使用xpath,需要引入支持xpath的jar包

 jaxen-1.1-beta-6.jar

在dom4j里面提供了两个方法,用来支持xpath

(1)List selectNodes("表达式"):获取符合表达式的元素集合

(2)Element selectSingleNode("表达式"):获取符合表达式的唯一元素

String path = "src/Person.xml";
Document doc = createMySAXReader(path);
// 使用selectNodes("//name")方法得到所有的name元素
List<Node> list = doc.selectNodes("//name");
// 遍历list集合
for (Node node : list) {
	// 得到name元素里面的值
	System.out.println(node.getText());
}

使用xpath实现:获取第一个student下面的name的值

所有name元素的xpath表示:/person/student[1]/name

selectSingleNode(" /person/student[1]/name");

String path = "src/Person.xml";
Document doc = createMySAXReader(path);
// 使用selectSingleNode方法得到指定的name元素
Node node = doc.selectSingleNode("/person/student[1]/name");
System.out.println(node.getText());

 

展开阅读全文

没有更多推荐了,返回首页