DOM4J——强大而易用的XML解析器,我们不只是有数据库
DOM4J——强大而易用的XML解析器
-
- DOM4J
-
- 一、DOM4J的导入使用
- 二、认识一些关键角色
- 三、快速开始
-
- 3.1创建一个XML
- 3.2读取XML节点(历遍和指定)
- 3.3规范输出
- 结尾
- 欢迎关注我、一起共勉
DOM4J
是一个Java的XML API,是jdom的升级品,用来读写XML文件.
dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件.
对于一些零碎的信息,使用数据库似乎有些大材小用,我们可以使用XML文件形式保存,也更便于理解和迁移。
更为常见的是,绝大部分配置文件都采取了XML格式的方式,这也变相证明了XML格式的优秀,尽管现在也出现了各式各样的记录格式,json格式也如雷贯耳,不遑多让。
但是,无论如何,重要的不是技术的更迭,而是理解技术的思路,有助于我们更好的理解其他新技术。
一、DOM4J的导入使用
在gradle的项目配置依赖引入中添加
// https://mvnrepository.com/artifact/org.dom4j/dom4j
implementation ‘org.dom4j:dom4j:2.1.1’
点击右上脚更新等待下载完毕
Maven项目的导入差不多,在依赖中添加,然后更新下载依赖库
org.dom4j dom4j 2.1.1
二、认识一些关键角色
Element
Element interface defines an XML element. An element can have declared namespaces, attributes, child nodes and textual content.
该接口定义了一个XML元素。元素可以具有声明的名称空间、属性、子节点和文本内容。 一般以Node实现
Document
Document defines an XML Document.
该接口定义了一个XML文档
DocumentHelper
DocumentHelper is a collection of helper methods for using DOM4J.
工具类 : 一系列帮助使用DMO4J的工具类,基本上都是static方法
XMLWriter
XMLWriter takes a DOM4J tree and formats it to a stream as XM
…
XMLWriter获取DOM4J树,并将其格式化为XML流
三、快速开始
3.1创建一个XML
现在已经可以快速创建一个XML文档并写入了
import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;import java.io.File;import java.io.FileWriter;public class Main { public static void main(String[] args){ / 功能:获取一个XML文档描述对象 */ Document document = DocumentHelper.createDocument(); / 功能:为XML文档添加一个根节点,并返回引用 */ Element root= document.addElement("root"); / 功能:为根节点加入内容 */ root.setText("这是root节点的内容"); try{ / 功能:将document中的内容写入文件中 */ XMLWriter writer = new XMLWriter(new FileWriter(new File("myFirstXML.xml"))); writer.write(document); writer.close(); }catch(Exception ex){ ex.printStackTrace(); } }}
结果如下:
<root>这是root节点的内容</root>
多添加几个子节点
//在这条语句下,添加//Element root= document.addElement("root");//为XML文档添加一个根节点,并返回引用//root.setText("这是root节点的内容");//为根节点加入内容 //为了接下来的节点历遍,我们来多添加几个节点 for(int i=0;i<7;i++){ Element childNode=root.addElement("child"); childNode.setText("我是第 "+i+" 个子节点"); }
内容是挤在一起的,没有缩进和换行,但是格式无误
<root>这是root节点的内容<child>我是第 0 个子节点</child><child>我是第 1 个子节点</child><child>我是第 2 个子节点</child><child>我是第 3 个子节点</child><child>我是第 4 个子节点</child><child>我是第 5 个子节点</child><child>我是第 6 个子节点</child></root>
3.2读取XML节点(历遍和指定)
接下来是读取一个XML文档并读取节点值
public class Main { / 功能:为了更好的更直观展示功能,将在main抛出所有可能异常 */ public static void main(String[] args) throws Exception{ /* 重复的代码省略,只展示添加的部分 */ Document document_=parse("myFirstXML.xml"); / 功能:获取该XML描述对象的根节点 */ Element root_=document_.getRootElement(); / 功能:.getXXX()方法获取相应内容 */ System.out.println(root_.getText()); } / 功能:根据XML文件,读取建立一个XML描述对象,Docutment的实例 */ public static Document parse(String filename) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(new File(filename)); return document; }}//输出"这是root节点的内容",这正是我们在第一阶段写入的根节点的内容
通过Iterator迭代器历遍节点的子节点,加入函数
/ 功能:XML节点的历遍方法 */ public static void bar(Document document) throws DocumentException { / BlankFox~小提示: 一切都从根节点开始 */ Element root = document.getRootElement(); / 功能:历遍根节点下的子节点 */ for (Iterator<Element> it = root.elementIterator(); it.hasNext();) { Element element = it.next(); System.out.println(element.getText()); } / 功能:历遍name名称的子节点 */ System.out.println("限制搜索childW"); for (Iterator<Element> it = root.elementIterator("childW"); it.hasNext();) { Element foo = it.next(); System.out.println(foo.getText()); } }
在main中最后调用
public class Main { / 功能:为了更好的更直观展示功能,将在main抛出所有可能异常 */ public static void main(String[] args) throws Exception{ /* 重复的代码省略,只展示添加的部分 */ Document document_=parse("myFirstXML.xml"); / 功能:获取该XML描述对象的根节点 */ Element root_=document_.getRootElement(); / BlankFox~小提示: .getXXX()方法获取相应内容,,如果不知道用哪个的话,多猜猜看吧 */ System.out.println("使用getText()方法获取内容:"+root_.getText()); System.out.println("历遍其下子节点"); bar(document_); }
输出如下:
使用getText()方法获取内容:这是root节点的内容
历遍其下子节点
我是第 1 个子节点,且拖家带口
我是第 2 个子节点
我是第 3 个子节点,且拖家带口
我是第 4 个子节点
我是第 5 个子节点,且拖家带口
我是第 6 个子节点
我是第 7 个子节点,且拖家带口
限制搜索childW
我是第 1 个子节点,且拖家带口
我是第 3 个子节点,且拖家带口
我是第 5 个子节点,且拖家带口
我是第 7 个子节点,且拖家带口进程已结束,退出代码为 0
单个目标节点搜索
通过XPath表达式访问指定节点
/ 功能:通过节点树指定访问节点 */ public static void bar_(Document document) { / BlankFox~小提示: '//'表示跳过若干中间节点 */ List<Node> list = document.selectNodes("/root//grandson"); for(Node i:list){ System.out.println(i.getText()); } / BlankFox~小提示: Single表示返回匹配到的第一个节点 */ Node node = document.selectSingleNode("/root/childW/grandson"); String name = node.getText(); System.out.println(name); }
输出:
我是第1孙子节点
我是第2孙子节点
我是第3孙子节点
我是第4孙子节点
我是第1孙子节点
XPath表达式报错问题(”NoClassDefError“,导入jaxen库)
// https://mvnrepository.com/artifact/jaxen/jaxen
implementation ‘jaxen:jaxen:1.1.6’
3.3规范输出
官方推荐使用OutputFormat作为参数规范格式,对比如下
/ 功能:将document中的内容写入文件中 */ XMLWriter writer = new XMLWriter(new FileWriter(new File("myFirstXML.xml"))); writer.write(document); writer.close(); / 功能:更加规范的输出 */ OutputFormat format = OutputFormat.createPrettyPrint(); writer = new XMLWriter(new FileWriter(new File("formatXML.xml")), format); writer.write( document ); writer.close();
结尾
如果大家还有更高的使用需求,或者更充足的时间和兴趣
最能够提高自我能力的是对着官网文档学习https://dom4j.github.io/,虽然是英文的,但是界面还是比较简单清晰,代码也很简短
本文部分代码来自官方教程,但是有所删减,并且添加中文注释,摒弃了一些高级内容,适合Java入门者学习
以及完整的API文档连接https://dom4j.github.io/javadoc/2.1.3/
欢迎关注我、一起共勉
⭐️⭐️代码之狐⭐️⭐️
主要内容:
- 时不时更新算法题解,算法与数据结构
- 时不时分享心灵鸡汤,详见杂谈栏
- 目前主要在学Java高级内容(虚拟机、框架什么的),会将书中的知识点提炼总结分享
怎么还没人关注我😢
与50位技术专家面对面
20年技术见证,附赠技术全景图