• dom4j 的使用需要导入 jar 包, 包括: dom4j-1.6.1 和 jaxen-1.1-beta

    • 步骤: 在项目目录下,"Folder" 创建一个 lib 文件夹
    • 复制 jar 包到 lib 下面
    • 右键 "build path" , 然后 "add to buildpath"
// 示例:
// xml 文档
<?xml version="1.0" encoding="gbk"?>
<person>
<p1 id="102">
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>wangcai</name>
<age>25</age>
</p1>
</person> // 需求一: 查询 xml 中所有 name 元素里面的值
/*
* 思路:
* 1. 创建解析器
* 2. 得到 document 对象
* 3. 得到根节点, getRootElement
* 4. 得到所有的 p1 标签
* element(qname); // 返回标签 qname 下面的第一个符合查找的子标签
* elements(qname); // 返回标签下面的属于 qname 的所有第一层子标签, 结果是 list 集合
* elements(); // 返回标签下面的所有一层子标签
*
* 5. 得到 name 元素
* 6. 获取 name 元素里面的值, getText()
*/ public static void main(String[] args){ // 1. 创建解析器, 需要导入 org.dom4j.io.SAXReader 包
SAXReader saxReader = new SAXReader(); // 2. 获取 document 对象, 需要导入 org.dom4j.Document 包
Document document = saxReader.read("src/person.xml"); // 3. 获取根节点
Element root = document.geteRootElement(); // 4. 获取所有的 p1
List<Element> list = root.elements("p1"); // 5. 遍历 list 集合
for(Element p : list){ // element 就是每一个 p1 元素
// 获取 p1 下面的第一个 name 元素
Element name1 = p.element("name");
// 得到 name 元素里面的值
String s = name1.getText();
}
} // 需求二: 在第一个 p1 标签中的末尾处添加 <sex>male</sex>
/*
* 思路:
* 1. 创建解析器
* 2. 得到 document 对象
* 3. 得到根节点, getRootElement
* 4. 得到第一个 p1 标签
* 5. 在 p1 下面直接添加 p1.addElement("标签名"); 返回 Element 对象
* 6. 在 sex 标签中添加文本, sex.setText("文本内容");
*
* 7. 回写 xml, org.dom4j.io 包
* XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("文件地址"), OutputFormat format);
* 关于第二个参数 OutputFormat format
* 第一种方式: OutputFormat.createPrettyPrint(); 带有缩进效果的输出
* 第二种方式: OutputFormat.createCompactFormat(); 不带格式的输出
* 第三种方式:
* OutputFormat format = new OutputFormat(String indent, boolean newlines);
* 第一个参数: 缩进方式, "\t" 或者 空格; 第二个参数: 是否换行.
* format.setTrimText(true); // 清空文档原有的换行和缩进
*/ public static void main(String[] args){ // 1. 创建解析器,
SAXReader saxReader = new SAXReader(); // 2. 获取 document 对象
Document document = saxReader.read("src/person.xml"); // 3. 获取根节点
Element root = document.getRootElement(); // 4. 获取第一个 p1 标签
Element p = root.element("p1"); // 5. 添加 sex 标签
Element sex2 = p.addElement("sex"); // 6. 添加文本
sex2.setText("male"); // 7. 回写 xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/person.xml"), format);
xmlWriter.write(document);
xmlWriter.close(); // 关闭资源
} // 需求三: 在特定的位置添加元素, 例如在第一个 p1 下面的 age 标签之前添加 <school>University</school>
/*
* 思路:
* 1. 获取解析器
* 2. 得到 document 对象
* 3. 得到第一个 p1 标签
* 4. 获取 p1 标签下面的所有元素: elements(); 返回值类型: List 集合
* 使用 List 集合中的方法, add(int index, E element); 在指定位置添加元素
* 5. 添加元素之前,需要先创建元素
* Element school = DocumentHelper.creatElement("school");
* 6. 在元素中添加文本: school.setText("University");
* 7. 回写 xml
*/ // 升级版, 将获取 document 对象 和 回写 xml 的代码封装成方法
class Dom4jUtils{ // 获取 document 对象
public static Document getDocument(String path){ try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(path);
return document;
} catch (Exception e){
e.printStackTrace();
} return null;
} // 回写 xml 操作
public static void myXmlWriter(Document document, String path){
try{
OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path); format); xmlWriter.write(document);
xmlWriter.close();
} catch (Exception e){
e.printStackTrace();
}
}
} // 需求四: 修改 (需要回写 xml)
// 将 p1 标签下面的 age 标签中的内容修改为 30 /*
* 思路: 使用 setText("30"); 方法
*/ // 需求五: 删除 (需要回写 xml)
// 将第一个 p1 标签下面的 school 标签删除 /*
* 思路:
* 1. 获取第一个 p1 标签
* root.element("p1");
* 2. 获取 p1 标签下面的 school 标签
* Element school2 = p1.element("school");
* 3. 使用父节点, 删除 school 标签
* p1.remove(school2);
*/ // 需求六: 获取属性值
// 获取第一个 p1 里面的属性 id 的值 /*
* 思路:
* p1.attributeValue("属性名"); // 返回值: 属性对应的值
*/

dom4j 解析器使用 XPath 语言操作 xml 文档

  • 导入支持 xpath 的 jar 包, jaxen-1.1-beta-6.jar
  • dom4j 里面提供了两个方法, 用来支持 XPath
    • selectNodes("XPath 表达式"); 表示获取多个节点
    • SelectSingleNode("Xpath 表达式"); 表示获取单个节点
// 示例:
// xml 文档
<?xml version="1.0" encodint="gbk"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>30</price>
</book> <book>
<title lang="cn">Learning XML</title>
<price>26</price>
</book>
</bookstore> // 需求一: 查询
// 查询 xml 文档中所有 title 元素的值 /*
* 思路:
* 1. 获取 document 对象
* 2. 直接使用 document.selectNodes("//title"); 返回 List<Node> 集合
*/ public static void main(String[] args){ Document document = Dom4jUtils.getDocument("src/bookstore.xml"); // 此处 Node 对象, 需要导入 org.dom4j.Node 包
List<Node> list = document.selectNodes("//title"); // 遍历 list 集合
for(Node node : list){ // 获取 title 元素里面的值
String s = node.getText();
System.out.println(s);
}
}

**参考资料:**
- [JavaWeb 视频教程](https://www.bilibili.com/video/av12750191/#page=6)
- [dom4j API 文档](http://tool.oschina.net/apidocs/apidoc?api=dom4j1.6.1%2Fapidocs)
- [dom4j jar包下载](https://dom4j.github.io/)
- [XPath jar包下载](http://mvnrepository.com/artifact/jaxen/jaxen/1.1-beta-6)
- [W3School XPath 教程](http://www.w3school.com.cn/xpath/xpath_syntax.asp)

XML 解析之 dom4j 解析器的更多相关文章

  1. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  2. XML文件解析之DOM4J解析

    1.DOM4J介绍 dom4j的官网是http://www.dom4j.org/dom4j-1.6.1/,最新的版本是1.6.1,根据官网介绍可知.dom4j是一个易用的.开源的库,应用于Java平台 ...

  3. DOM综合案例、SAX解析、StAX解析、DOM4J解析

    今日大纲 1.DOM技术对xml的增删操作 2.使用DOM技术完成联系人管理 3.SAX和StAX解析 4.DOM4J解析 5.XPATH介绍 1.DOM的增删操作 1.1.DOM的增加操作 /* * ...

  4. Java---XML的解析(2)-DOM4J解析/Xpath

    Dom4j: Dom SUN dom在加载时,将所有元素全部加载内存 DOM4j - 第三方. Dom4j是一个开源.灵活的XML API. 目前很多开源框架如struts,hibernate都使用d ...

  5. XML文件解析之DOM解析

    XML文件是一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.基本的解析方式包括DOM解析和SAX解析,具体来说包括DOM解析,SAX解析,DOM4J解 ...

  6. dom4j解析器sax解析xml文件

    1.使用dom4j解析器解析xml ***解析器dom4j是由dom4j组织提供的,针对xml进行解析.dom4j不是Javase的一部分,使用时需要导入dom4j的jar包(官网下载) 在eclip ...

  7. xml之dom4j解析

    * 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...

  8. 使用dom4j解析XML文档

    dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...

  9. javaweb学习总结十三(dom4j方式对XML文档进行解析以及Xpath的使用)

    一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企 ...

随机推荐

  1. 点滴积累【other】---存储过程修改表的所有字段(sql)

    USE [QG_Mis24] GO /****** Object: StoredProcedure [dbo].[p_set] Script Date: 07/11/2013 17:05:38 *** ...

  2. vivado设计四:自定义IP核测试

    在vivado设计三中:http://blog.chinaaet.com/detail/37177已经建立了vivado工程和封装好了自定义IP核. 那么接下来,我们对这个自定义IP核进行测试了:我们 ...

  3. Sublime Text的列模式

    Sublime Text的列模式如何操作? 听语音 | 浏览:6551 | 更新:2014-12-09 13:27 | 标签:软件 Sublime Text的列模式如何操作?各个系统不一样,请跟进系统 ...

  4. oracle 12c grid db 安装的的checklist

    oracle 12c 安装 checklist 关闭 iptables NetworkManager selinux service iptables stop chkconfig iptables ...

  5. 735. Replace With Greatest From Right【medium】

    Given an array of integers, replace every element with the next greatest element (greatest element o ...

  6. Greatest Number 山东省第一届省赛

    Greatest Number Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya likes math, because ...

  7. Splash 笔记

    javascript rendering service a lightweight web browser can execute custom JavaScript in page context ...

  8. [Idea Fragments] PostScript for 3D Print??

    今天看到一篇关于PostScript的文章<编程珠玑番外篇-P PostScript 语言里的珠玑>,尤其是篇尾的这段话,让我对3D Print浮想联翩: 因为 PostScript 语言 ...

  9. SQL Server Replace函数

    REPLACE用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法REPLACE ( 'string_expression1' , 'string_expression2' ...

  10. Grodno 2015 (Urozero May 2015 Day 5) D Triangles

    给出$P(<=10^9)$, 求有多少个有序三元组$(a, b, c),\ gcd(a, b, c) = 1,\ a + b + c <= P$且以它们构成的三角形中存在某个角是另外一个角 ...