javaSE学习笔记DOM4J解析(7)

DOM4J即Document Object Model for Java使用java技术以文档方式解析XML数据的模型。

DOM4J是开源组织提供的一个免费的、强大的XML解析工具,如果开发者需要在项目中使用那么需要下载并引入jar包。

dom4j is an Open Source XML framework for Java. dom4j allows you to read, write, navigate, create and modify XML documents. dom4j integrates with DOM and SAX and is seamlessly integrated with full XPath support

下载:http://sourceforge.net/projects/dom4j

引入:dom4j-1.6.1.jar (核心包)、 jaxen-1.1-beta-6.jar(Xpath支持包)

1 如何去学习一个开源的工具包?

一般的开源工具中都提供了免费的API文件,开发者可以参考该文档。

DOM4J提供的文档中有一个免费教程可以直接使用。à Quickstart

2 开始解析

1. 准备需要解析的xml文件linkmans.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<linkmans>
    <linkman>
        <name>jack</name>
        <phone>18663243245</phone>
        <email>[email protected]163.com</email>
    </linkman>
    <linkman>
        <name>张三</name>
        <phone>1353243247</phone>
        <email>[email protected]126.com</email>
    </linkman>
</linkmans>
2. 获取解析器
// 2.获取解析器
    public static SAXReader getReader(){
        return new SAXReader();
    }
3. 获取解析对象
// 3.获取解析好的文档对象
    public static Document getDocument(File file)throws Exception{
        // 3.1获取解析器
        SAXReader reader = getReader();
        // 3.2解析文档
        Document doc = reader.read(file);
        return doc;
    }
4. 获取根元素节点
    // 4.获取根元素
    public static void getRoot(File file)throws Exception{
        // 4.1获取解析器
        SAXReader reader = getReader();
        // 4.2解析文档
        Document doc = reader.read(file);
        // 4.3获取根元素
        Element root = doc.getRootElement();
        System.out.println(root.getName());
    }
5. 获取指定的其他的元素
获取其他元素的时候默认需要从根节点开始查找。
    // 5.获取指定的元素
    public static void getElement(File file) throws Exception {
        // 5.1获取解析器
        SAXReader reader = getReader();
        // 5.2解析文档
        Document doc = reader.read(file);
        // 5.3获取根元素
        Element root = doc.getRootElement();
        // 5.4获取所有的linkman
        List list = root.elements("linkman");
        Iterator it = list.iterator();
        // 5.5循环遍历节点
        while (it.hasNext()) {
            Element ele = (Element) it.next();
            System.out.println(ele.getName());
        }
        System.out.println("---------------");
        // 简化
        for (Iterator i = root.elementIterator(); i.hasNext();) {
            Element element = (Element) i.next();
            System.out.println(element.getName());
        }
        // 5.6获取第二个linkman的名字
        Element linkman2 = (Element) list.get(1);
        String name = linkman2.element("name").getText();
        System.out.println(name);
    }
6. 添加元素
// 6. 添加元素
    public static Document addElement(File file)throws Exception{
        // 6.1获取解析器
        SAXReader reader = getReader();
        // 6.2解析文档
        Document doc = reader.read(file);
        // 6.3获取根元素
        Element root = doc.getRootElement();
        // 6.4创建新元素
        Element new_linkman = DocumentHelper.createElement("linkman");
        Element new_name = DocumentHelper.createElement("name");
        Element new_phone = DocumentHelper.createElement("phone");
        Element new_email = DocumentHelper.createElement("email");

        new_name.setText("焦宁波");
        new_phone.setText("186xxxxxxxxx");
        new_email.setText("[email protected]");
        // 6.5建立关系
        new_linkman.add(new_name);
        new_linkman.add(new_phone);
        new_linkman.add(new_email);
        root.add(new_linkman);
        return doc;
    }
7. 修改的document需要进行持久化的操作,因此需要提供以下的方法
// 提供一个工具方法将内存中的Document写入XML文件
    public static void writeDocument2XML(Document doc, File file)throws Exception{
       // 创建创建一个转换对象
       XMLWriter writer = new XMLWriter(
        // 可以解决输入的数据时中文的乱码问题
new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
       // 将doc写入指定文件
       writer.write(doc);
       // 释放资源
       writer.close();
    }
8. 修改元素
    // 8. 修改元素
    public static Document modifyElement(File file) throws Exception {
        // 8.1获取解析器
        SAXReader reader = getReader();
        // 8.2解析文档
        Document doc = reader.read(file);
        // 8.3获取根元素
        Element root = doc.getRootElement();
        // 8.4直接获取第二个linkman的name
        Element name =
((Element)root.elements("linkman").get(1)).element("name");
        name.setText("李四");
        return doc;
    }
9. 删除元素
// 9. 删除元素
    public static Document removeAll(File file)throws Exception{
        // 9.1获取解析器
        SAXReader reader = getReader();
        // 9.2解析文档
        Document doc = reader.read(file);
        // 9.3获取根元素
        Element root = doc.getRootElement();
        // 9.4获取所有的linkman
        List list = root.elements("linkman");
        // 9.4循环断绝关系
        for(Object temp :list){
           // 转型
           Element linkman = (Element)temp;
           // 断绝关系
           root.remove(linkman);
        }
        return doc;
    }
10. 属性的操作
    // 10. 属性操作
    public static Document optionAttribute(File file)throws Exception{
        // 10.1获取解析器
        SAXReader reader = getReader();
        // 10.2解析文档
        Document doc = reader.read(file);
        // 10.3获取根元素
        Element root = doc.getRootElement();
        // 10.4获取所有的linkman
        List list = root.elements("linkman");
        // 10.4循环添加属性
        int count = 0;
        for(Object temp :list){
           // 转型
           Element linkman = (Element)temp;
           // 添加属性
           linkman.add(DocumentHelper.createAttribute(linkman,
"id", "00"+(count+1)));
           count++;
        }
        // 10.5获取焦宁波的id
        Element linkman3 = (Element) list.get(2);
        String value = linkman3.attribute("id").getText();
        System.out.println(value);
        // 10.6修改属性
        linkman3.attribute("id").setText("007");
        // 10.7删除属性
        linkman3.remove(linkman3.attribute("id"));
        return doc;
    }    
问题:阅读以下的代码,并说出以下的代码的缺点。
// 获取linkman中的linkman
    public static void findQuestion(File file)throws Exception{
        // 10.1获取解析器
        SAXReader reader = getReader();
        // 10.2解析文档
        Document doc = reader.read(file);
        Element inner_name = doc.getRootElement()  // 获取根元素
.element("linkman")        // 获取第一个linkman元素
.element("linkman")        // 获取第一个linkman中的第一个linkman元素
.element("name");             // 获取上面的name元素
        System.out.println(inner_name.getText());
    }

发现如果需要遍历一个比较深的元素节点,那么需要多次的element()。

如:存储一个自己的隐私文件需要建立100个文件夹吗?

那么如果路径比较长需要进行路径访问的方式的优化。

如果在DOM4J进行解析查找元素可以使用类似Windows中的路径模式来查找元素那么就变得简单且高效。

如果使用xpath代码可以简化如下:

// 使用xpath解决以上的问题
    public static void findAnswer(File file)throws Exception{
        // 10.1获取解析器
        SAXReader reader = getReader();
        // 10.2解析文档
        Document doc = reader.read(file);
        Element name = (Element)
doc.selectSingleNode("/linkmans/linkman[1]/linkman/name");
        System.out.println(name.getText());
    }

以上的代码可以通过xpath快速的查找指定的元素节点,因此以后在实际的开发中我们如果需要解析XML数据那么就需要DOM4J+Xpath进行联合的处理。

时间: 2024-07-30 15:53:17

javaSE学习笔记DOM4J解析(7)的相关文章

javaSE学习笔记SAX解析(6)

SAX即Simple Api for Xml就是一个简单的操作XML数据的一套SUN提供的API机制. SAX采用的解析的原理是基于事件触发的机制. SAX技术只能进行XML数据的读取. 1.准备需要解析的XML文件linkmans.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?> <linkmans> <linkman> <name>

javaSE学习笔记XML解析技术(5)

JAXP技术 JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术.大家可以参见SUN的以下两个包: javax.xml.parsers.*                                   à主要存储的是解析器 org.w3c.dom.*或org.w3c.sax.*     à主要存储的是DOM解析或SAX解析需要的API DOM解析主要采用DOM树的方式进行XML的数据

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

JavaSE学习笔记(五)——类与对象

一.  类和对象 1.1           面向对象与面向过程的区别 1.面向过程 采用面向过程必须了解整个过程,每个步骤都有因果关系,每个因果关系都构成了一个步骤,多个步骤就构成了一个系统,因为存在因果关系每个步骤很难分离,非常紧密,耦合度高,当任何一步骤出现问题,将会影响到所有的系统.如:采用面向过程生产电脑,那么他不会分CPU.主板和硬盘,它会按照电脑的工作流程一次成型. 2.面向对象 面向对象对会将现实世界分割成不同的单元(对象),实现各个对象,如果完成某个功能,只需要将各个对象协作起

JavaSE学习笔记(一)———Java简介与基础

一.  Java语言简介 1.1           计算机语言的发展过程 计算机语言发展主要分为三个阶段: 1.第一代:机器语言 2.第二代:低级语言 3.第三代:高级语言 1.2           Java发展简史 1.Java 是一种程序开发语言,既然是一门语言,就像其他语言一样,具备一定的语法 和自己的数据结构. 2.Java语言来源于sun公司,sun指的是斯坦福大学网络.由james gosling领导并开发. Java语言的具体发展历程 1991~1995  Sun 为了占领智能

JavaSE学习笔记(3)

XML简介 XML即可扩展的标记语言.因此该语言中所有的标签都是没有预先定义的,开发者可以自己随意的指定. 目前为止所有的标记的语言都属于开源的语言.由W3C组织进行一个基本的维护. 因此大家学习这些语言的时候应该参考W3C公布的文档. XML作用 1.可以用作软件的配置文件. 2.可以实现独立平台的数据传输. C à XML à Java   天气预报 3.Web Service. 4.可以描述带关系的数据. XML体验 XML文件其实在实际的开发中可以帮助开发者进行描述一些带关系的数据.  

javaSE学习笔记Xpath简介与web服务器(8)

Xpath是一个独立的一个路径语言,主要的目的是为了查找路径中的元素. 那么DOM4J默认支持Xpath的路径查找. 常用的方法有以下的两种: selectNodes(“xpath”) ? 查询指定路径的所有的元素 selectSingleNode(“xpath”) ? 查询指定路径的第一个元素 ? 常用的Xpath路径写法 /AAA 指定从XML文档的根开始写路径 //BBB 指定从整个XML中搜索满足的元素名 /AAA/CCC/DDD/* 指定路径下所有的元素 //* 指定获取所有的元素 /

javaSE学习笔记—HTTP协议(10)

客户端浏览器和服务器Tomcat要进行基本的请求和响应的处理. 其实浏览器和服务器通信的数据的格式已经使用协议进行固定好了,只要双方发送固定格式的数据,那么就可以完成基本的通信. 如果开发者需要查看这样的数据格式,那么就需要安装一个浏览器的HTTP协议相关的插件. 如果要深入的学习浏览器和服务器通信的数据,那么需要详细的掌握他们之间发送的数据内容. 1  请求信息 GET / HTTP/1.1 ? 请求行 Accept: */* Accept-Language: zh-cn,en-US;q=0.

JavaWeb学习笔记——XML解析

DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding="UTF-8"?> <addresslist> <linkman> <name>张三</name> <email>www.baidu.com</email> </linkman> <linkman>