java学习笔记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 开始解析
. 准备需要解析的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)的更多相关文章
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- 20155234 2016-2017-2第十周《Java学习笔记》学习总结
20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...
- Java学习笔记之---API的应用
Java学习笔记之---API的应用 (一)Object类 java.lang.Object 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
随机推荐
- 用WINSOCK API实现同步非阻塞方式的网络通讯
Option Base 0Option Explicit '* ************************************************** *'* 模块名称:Winsock ...
- window 10 下解压缩版MySQL5.7.24的安装
安装步骤: 1.下载mysql-5.6.40-winx64.zip https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.24-winx64.zip ...
- 迷你MVVM框架 avalonjs 沉思录 第3节 动态模板
模板的发明是编程史上的一大里程碑,让我们摆脱了烦锁且易出错的字符串拼接,维护性大大提高. 都在JSP,ASP时代,人们已经学会使用include等语句,将多个页面片断拼接成一个页面. 此外,为了将数据 ...
- Java中的几种设计模式
如果从事JAVA相关的开发,都不可避免的要用到抽象和封装,这是JAVA的一个特点,同时也是每个开发者必须掌握的,JAVA是这样,Android更是如此.而设计模式就是告诉我们应该如何写出高效且更具应用 ...
- 一些jquery常用方法
1.jquery实现平滑滚动到指定锚点 $(document).ready(function() { $("a.topLink").click(function() { $(&qu ...
- sql中从指定位置截取指定长度字符串
1. 字符串函数应用 --从指定索引截取指定长度的字符串 ,) --获取字符串中指定字符的索引(从1开始) select charindex(',','ab,cdefg') --实际应用中的语句 , ...
- iOS正确解决隐藏导航栏后push和pop或dismiss和present闪黑问题
情景: 一级页面不显示导航栏 ,二级页面显示导航栏. 方法一 适用于push/pop: 一级页面中 - (void)viewWillAppear:(BOOL)animated { [super vie ...
- springboot中开发热部署(devtools)
1.只需要在pom文件中引入devtools的依赖即可 <dependency> <groupId>org.springframework.boot</groupId&g ...
- Java程序设计11——异常处理
1 概述 异常机制已经成为判断一门编程语言是否成熟的标准,除了传统的像C语言没有提供异常机制之外,目前主流的编程语言如Java.Ruby.Python都提供了成熟的异常机制.异常机制可以使程序中异常处 ...
- IntelliJ IDEA 2017版 spring-boot-devtools实现热部署
1.配置pom.xml文档 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...