首页 > 编程语言 >java学习笔记DOM4J解析(7)

java学习笔记DOM4J解析(7)

时间:2022-11-30 12:07:54浏览次数:68  
标签:java name DOM4J doc linkman Element 获取 file 解析

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]</email>
</linkman>
<linkman>
<name>张三</name>
<phone>1353243247</phone>
<email>[email protected]</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进行联合的处理。

源码面前,了无秘密



标签:java,name,DOM4J,doc,linkman,Element,获取,file,解析
From: https://blog.51cto.com/zhenghongxin/5898186

相关文章

  • Java学习笔记XML(3)
    XML简介XML即可扩展的标记语言。因此该语言中所有的标签都是没有预先定义的,开发者可以自己随意的指定。目前为止所有的标记的语言都属于开源的语言。由W3C组织进行一个基本......
  • Java中将double转换为int
    可以通过三种方式将double转换为int1、将double转换为int—使用类型转换2、将double转换为int—使用Math.round()3、将double转换为int—使用Double.IntValue()1.......
  • Python 中 -m 的典型用法、原理解析与发展演变
    在命令行中使用Python时,它可以接收大约20个选项(option),语法格式如下:python[-bBdEhiIOqsSuvVWx?][-ccommand|-mmodule-name|script|-][args]本文想要聊聊比较......
  • 你必须要知道的JavaScript数据结构与面试题解答
    英文原文|https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m原文作者|RyanThelin和AmandaFawcett译文翻译|web前端开发(web_qdkf)解决编码......
  • 如何使用函数式编程写更简洁的JavaScript代码
    英文| https://dev.to/r0r71z/javascript-write-cleaner-code-with-functional-programming-279a翻译|web前端开发(ID:web_qdkf)作为一个Web全栈开发人员,我花了很多时间......
  • 从零启动一个JAVA SSM项目详细步骤目录
    详解大型互联网项目服务端架构演进历程JAVA环境配置​​1、Linux软件源配置操作​​​​2、Linux系统jdk安装实操​​​​3、Linux系统tomcat安装​​​​4、Linux下Maven......
  • 这8个很棒的JavaScript测试库,你可以尝试用起来
    英文| https://medium.com/better-programming/8-awesome-javascript-testing-libraries-43e09141fdc2翻译|web前端开发(ID:web_qdkf)测试代码是任何大型公司或项目的强......
  • JavaScript入门①-基础知识筑基
    01、JavaScript基础知识JavaScript(缩写:JS)是一种具有面向对象能力的、解释型的程序语言,基于对象和事件驱动,具有相对安全性的客户端脚本语言。JavaScript是一门完备的动态......
  • java base64转图片
    方法:传入文件路径和base64位的编码/***base64转为图片*@parampath*文件路径:到文件夹即可,代码里会在文件夹里生成对应的jpg文件*@pa......
  • 10个 JavaScript 开发小技巧
    英文| https://www.geeksforgeeks.org/javascript-top-10-tips-and-tricks/?ref=rp翻译|web前端开发(ID:web_qdkf)对于Web开发或跨平台开发,JavaScript越来越流行。以前,它......