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 开始解析

. 准备需要解析的xml文件linkmans.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<linkmans>
<linkman>
<name>jack</name>
<phone></phone>
<email>jack@.com</email>
</linkman>
<linkman>
<name>张三</name>
<phone></phone>
<email>zs@.com</email>
</linkman>
</linkmans>
. 获取解析器
// 2.获取解析器
public static SAXReader getReader(){
return new SAXReader();
}
. 获取解析对象
// 3.获取解析好的文档对象
public static Document getDocument(File file)throws Exception{
// 3.1获取解析器
SAXReader reader = getReader();
// 3.2解析文档
Document doc = reader.read(file);
return doc;
}
. 获取根元素节点
// 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.获取指定的元素
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();
String name = linkman2.element("name").getText();
System.out.println(name);
}
. 添加元素
// 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("jnb@itcast.cn");
// 6.5建立关系
new_linkman.add(new_name);
new_linkman.add(new_phone);
new_linkman.add(new_email);
root.add(new_linkman);
return doc;
}
. 修改的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. 修改元素
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()).element("name");
name.setText("李四");
return doc;
}
. 删除元素
// 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. 属性操作
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 = ;
for(Object temp :list){
// 转型
Element linkman = (Element)temp;
// 添加属性
linkman.add(DocumentHelper.createAttribute(linkman,
"id", ""+(count+)));
count++;
}
// 10.5获取焦宁波的id
Element linkman3 = (Element) list.get();
String value = linkman3.attribute("id").getText();
System.out.println(value);
// 10.6修改属性
linkman3.attribute("id").setText("");
// 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进行联合的处理。

java学习笔记DOM4J解析(7)的更多相关文章

  1. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  2. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  3. 20145330第十周《Java学习笔记》

    20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...

  4. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  5. java学习笔记07--日期操作类

    java学习笔记07--日期操作类   一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...

  6. 20155234 2016-2017-2第十周《Java学习笔记》学习总结

    20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...

  7. Java学习笔记之---API的应用

    Java学习笔记之---API的应用 (一)Object类 java.lang.Object 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个 ...

  8. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  9. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

随机推荐

  1. 单片机(TTL)与电脑RS232接口

    2010年11月28日 21:38 1.先介绍电脑上与单片机进行通讯的接口的名称 (1)一般是用电脑串口来进行通讯的,平常大家说的电脑的串口是指台式电脑主机后面的九针接口,如下图 ‍这个接口有个专业的 ...

  2. VS2017连接Oracle设置

    1. 下载安装 Oracle Developer Tools for Visual Studio 2017: 2. 配置tnsnames.ora ODP.Net默认使用安装目录下的 tnsnames. ...

  3. JS在生成csv文件时,","逗号问题处理.

    在生成csv文件时,发现一个问题,因为csv文件本身是依靠逗号进行分列的,所以内容中有逗号时也被强制分列了,处理方法很简单,为内容加上双引号(英文格式)就可以了. 如: "11111,222 ...

  4. rook

    https://github.com/rook/rook https://rook.github.io/docs/rook/master/ Rook是在云本地环境中运行的分布式存储系统的开源编排器. ...

  5. 新手C#重载、重写的学习2018.08.04

    重载:在同一类(class)中,使用相同的方法名称,不同的参数和(不一定)不同的返回值类型构造成的方法. 举例: class OverLoadTest { public void Hello() { ...

  6. [mysql]设置Ubuntu上的MySQL可以远程访问

    今天在win10上用django连接安装在Ubuntu上的MySQL上,始终提示错误(can not connect mysql),但是在Ubuntu上访问是没有问题的.于是开始查找原因: 1. 33 ...

  7. GlobalMemoryStatusEx获取内存

    typedef struct _MEMORYSTATUSEX { DWORD dwLength; DWORD dwMemoryLoad; DWORDLONG ullTotalPhys; DWORDLO ...

  8. CentOS 最新版的下载地址 + 版本选择详解

    CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...

  9. UVa 12186 Another Crisis (DP)

    题意:有一个老板和n个员工,除了老板每个员工都有唯一的上司,老板编号为0,员工们为1-n,工人(没有下属的员工),要交一份请愿书, 但是不能跨级,当一个不是工人的员工接受到直系下属不少于T%的签字时, ...

  10. Redis Quick Start [熟练版]

    一.下载解压 wget http://download.redis.io/redis-stable.tar.gztar xvzf redis-stable.tar.gzcd redis-stable ...