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 ...
随机推荐
- C++ 获取特定进程的CPU使用率<转>
C++ 获取特定进程的CPU使用率 近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程.于是想写一个小程序在后台记录每个进程的CPU使用情况 ...
- Python运维开发基础05-语法基础
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...
- Python 入门学习(贰)文件/文件夹正则表达式批量重命名工具
基于 Udacity 的 Python 入门课程 Programming Foundations with Python 基于 Python 2.7 思路 Project 2 是一个去除文件名中所有数 ...
- linq join一些忘记的操作
- sklearn中决策树算法DesiciontTreeClassifier()调用以及sklearn自带的数据包sklearn.datasets.load_iris()的应用
决策树方法的简单调用记录一下 clf=tree.DecisionTreeClassifier() dataMat=[];labelMat=[] dataPath='D:/machinelearning ...
- centos下修改文件后如何保存退出
centos下修改文件后如何保存退出 保存命令 按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :w ...
- Git 客户端基本配置
Welcome to Git (version -preview20140611) Run 'git help git' to display the help index. Run 'git hel ...
- python 3安装PDFMiner3K
首先确保,你的pyhton是python 3 可在https://www.python.org/downloads/处下载 打开cmd,键入pip3 install pdfminer3k
- Bootstrap轮播
实现原理:隐藏所有要显示的元素,然后指定要显示的为block,宽.高自适应. 结构: 容器:最外层为一个div 使用data-ride="carousel" 来指定为轮播插件.并提 ...
- 企业搜索引擎开发之连接器connector(十九)
连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...