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. cglib动态代理代码示例

    cglib动态代理代码示例 引用包cglib-xxx.jar 非Maven项目还需要手动引用包asm-xxx.jar 业务类(不需要定义接口) cglib代理类(实现接口MethodIntercept ...

  2. 【python】 time模块和datetime模块详解 【转】

    一.time模块 time模块中时间表现的格式主要有三种: a.timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b.struct_time时间元组,共 ...

  3. WeakHashMap, NOT A CACHE

    Overview Base Map的实现 基于WeakReference的Entity实现 基于Reference和ReferenceQueue实现 它的弱引用是键,而不是值 它的key会被全自动回收 ...

  4. window 10 javac不是内部或外部命令

    今天在新电脑上配置Java环境变量(window 10),不管怎么配置都是提示“javac不是内部或外部命令”,java,java -version命令是正常的. 后来发现是path路径配置的不对,修 ...

  5. 27.Remove Element(Array)

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  6. react-native 打包 出apk

    先上步骤: 一. 生成签名文件(my-release-key.keystore文件) Android要求所有应用都有一个数字签名才会被允许安装在用户手机上 1.  在项目目录下运行如下命令: keyt ...

  7. scala 排序

    sortBy() 定义: def sortBy[B](fun: (A) =>B) 栗子1: val words = "the quick brown fox jumped over t ...

  8. Luogu 4491 [HAOI2018]染色

    BZOJ 5306 考虑计算恰好出现$s$次的颜色有$k$种的方案数. 首先可以设$lim = min(m, \left \lfloor \frac{n}{s} \right \rfloor)$,我们 ...

  9. [Jenkins]怎样自定义发出邮件的 From Email Address 和 From Name

    在Jenkins上建了一个执行SoapUI的task,想要自定义发送邮件的地址和姓名,怎么办呢? 在Editable Email Notification里面添加Pre-send Script 脚本如 ...

  10. JavaScript 对象属性作实参以及实参对象的callee属性

    参考自<<JavaScript权威指南 第6版>> /* * 将对象属性用作实参, 从而不必记住参数的顺序. */ function arraycopy(from,from_s ...