dom4J使用笔记
使用dom4j是目前最常用的解析XML的方法,dom4j解析集DOM和SAX技术优点于一身,要使用dom4j 还是先要导入jar:
dom4j-1.6.1.jar (dom4j最主要的jar包,可以独立存在) , jaxen-1.1.6.jar (支持Xpath技术)
需要解析的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<student id="123">
<name>lz</name>
<age>21</age>
</student>
<student>
<name>zhanshang</name>
<age>20</age>
</student>
</person>
dom4j解析的步骤:
步骤一:得到Document对象
//1.创建解析器
SAXReader reader=new SAXReader();
//2.解析XML文件,得到Document
Document document = reader.read(url);
步骤二 调用Document对象的getRootElement()方法得到根标签,返回的是Element对象
Element root = document.getRootElement();
步骤三 使用ELement的API进行操作,如果没找到想要的方法,可以到其父接口Node中寻找,注意:这里使用的类都是org.dom4j 包下的
Element对象常用的方法:element("标签名")获得该标签的第一个元素 elements()获得所有的子标签 elements("标签名")获得所有的该标签的子元素 getParent()获得父节点 addElement()添加标签 getText()获得文本值 setText("文本值")设置文本值
查询元素
查询操作主要是用element和elements方法
/**
* 查询所有name和age的值
* @throws Exception
*/
@Test
public void fun1() throws Exception{
//1.创建解析器
SAXReader reader=new SAXReader();
//2.解析XML文件,得到Document
Document document = reader.read("src/person.xml");
//3.得到根标签
Element root = document.getRootElement();
//4.进行具体操作
List<Element> elements = root.elements("student");
for (Element element : elements) {
Element name = element.element("name");
String nameText = name.getText();
Element age = element.element("age");
String ageText = age.getText();
System.out.println("name:"+nameText+" age:"+ageText);
}
}
结果输出:
name:lz age:21
name:zhanshang age:20
查询出某一个元素
查询一:
/**
* 查询得到第一个student标签的name
* @throws Exception
*/
@Test
public void fun2() throws Exception{
SAXReader reader=new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
Element student = root.element("student");
Element name = student.element("name");
System.out.println(name.getText());
}
输出结果为:
lz
查询二:
/**
* 查询得到第二个student标签的age
* @throws Exception
*/
@Test
public void fun3() throws Exception{
SAXReader reader=new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
List<Element> students = root.elements("student");
Element student2 = students.get(1);
Element age = student2.element("age");
System.out.println(age.getText());
}
输出结果为:
20
在末尾添加节点
先要确定要添加位置的父节点,然后使用该父节点的addElement("标签名")添加节点,需要添加文本节点的话使用setText("文本值")方法,最后别忘了回写XML
/**
* 在末尾添加节点
* @throws Exception
*/
@Test
public void fun4() throws Exception{
//1.创建解析器
SAXReader reader=new SAXReader();
//2.解析XML文件得到Document
Document document = reader.read("src/person.xml");
//3.得到根标签
Element root = document.getRootElement();
//在第一个student元素后添加school
Element student = root.element("student");
Element school = student.addElement("school");
school.setText("lynu");
//回写XML
OutputFormat format=OutputFormat.createPrettyPrint(); //带缩进的格式
XMLWriter writer=new XMLWriter(new FileOutputStream("src/person.xml"), format);
writer.write(document);
writer.close();
}
回写XML使用的是OutputFormat类和XMLWriter类,这两个类都是org.dom4j.io 包下的,OutputFormat 类还有个createCompactFormat()方法可以压缩XML文件中的空格和换行,使用dom4j不会像jaxp那样破坏XML文件的格式。因为XMLWriter类使用流的技术,所以要记得使用完关闭
结果显示为:
<?xml version="1.0" encoding="UTF-8"?> <person>
<student id="123">
<name>lz</name>
<age>21</age>
<school>lynu</school>
</student>
<student>
<name>zhanshang</name>
<age>20</age>
</student>
</person>
第一个student标签多了个school子标签
在特定位置添加节点
其实在特定位置添加元素就是使用父节点调用elements()方法的其子元素列表,是一个List集合,接下来就是操作List集合,使用List的add(位置,标签) ,当然不要忘了再添加将集合前,将这个元素创建出来:DocumentHelper.createElement(标签名) ,DocumentHelper类也是org.dom4j 包下的
/**
* 在特定位置(第二个student的age前面)添加school节点
* @throws Exception
*/
@Test
public void fun5() throws Exception{
SAXReader reader=new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
Element student2 = (Element) root.elements().get(1); //得到第二个student
List<Element> elements = student2.elements(); //得到student的子标签集合
Element school = DocumentHelper.createElement("school"); //创建school节点
school.setText("lynu");
elements.add(1, school); //在对应为位置添加(操作list集合)
//回写XML
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream("src/person.xml"), format);
writer.write(document);
writer.close();
}
结果显示为:
<?xml version="1.0" encoding="UTF-8"?> <person>
<student id="123">
<name>lz</name>
<age>21</age>
<school>lynu</school>
</student>
<student>
<name>zhanshang</name>
<school>lynu</school>
<age>20</age>
</student>
</person>
第二个student也都添加了school子节点
修改节点的值
修改节点就是先找到需要修改的节点,然后使用setText("文本值")
/**
* 修改节点的值
* @throws Exception
*/
@Test
public void fun6() throws Exception{
SAXReader reader=new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
Element student1 = root.element("student");
Element age1 = student1.element("age");
age1.setText("100");
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream("src/person.xml"), format);
writer.write(document);
writer.close();
}
结果显示为:
<?xml version="1.0" encoding="UTF-8"?> <person>
<student id="123">
<name>lz</name>
<age>100</age>
<school>lynu</school>
</student>
<student>
<name>zhanshang</name>
<school>lynu</school>
<age>20</age>
</student>
</person>
第一个student的age修改为100
删除节点
删除节点还是需要先找到其父节点,然后根据父节点调用remove(节点)删除
/**
* 删除节点(删除所有school)
* @throws Exception
*/
@Test
public void fun7() throws Exception{
SAXReader reader=new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
List<Element> elements = root.elements("student");
for (Element element : elements) {
//删除节点,需要根据要删除节点的父节点来删除
Element school = element.element("school"); //得到要删除的节点
element.remove(school);
}
//回写XML
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream("src/person.xml"), format);
writer.write(document);
writer.close();
}
结果显示为:
<?xml version="1.0" encoding="UTF-8"?> <person>
<student id="123">
<name>lz</name>
<age>100</age>
</student>
<student>
<name>zhanshang</name>
<age>20</age>
</student>
</person>
所有的school标签被删除了
获得属性的值
先得到对应的标签,然后使用attributeValue("属性名")得到属性值
/**
* 获得属性值
* @throws Exception
*/
@Test
public void fun8() throws Exception{
SAXReader reader=new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
Element student1 = root.element("student");
String id = student1.attributeValue("id");
System.out.println(id);
}
结果输出为:
123
第一个student标签上有一个id属性,id属性值为123
XPath
获取某个元素使用dom4j原生的方法虽然很方便,但是使用XPath之后会发现获得一个元素更为方便了,使用dom4j支持XPath就需要 jaxen-1.1.6.jar zhegejar包,先来看看Xpath的语法:
第一种形式:/AAA/DDD/BBB 表示一层一层获得AAA下面的DDD下面的BBB
第二种形式://BBB 表示只要名为BBB的都可以获得
第三种形式:/* 所有元素
第四种形式:BBB[1]表示第一个BBB元素 BBB[last()]表示最后一个BBB元素
第五种形式://BBB[@id] 表示获得所有有id属性的BBB元素
第六种形式://BBB[@id='1'] 表示元素名为BBB,BBB元素有id属性,且属性值为1的元素
dom4j提供了两个方法用于支持XPath : selectNodes("XPath表达式") 获得多个节点, selectSingleNode("XPath表达式") 获得一个节点
获得标签的值
/**
* 获得所有name标签的值
* @throws Exception
*/
@Test
public void fun1() throws Exception{
//1.获得document
Document document = new SAXReader().read("src/person.xml");
//2.调用Document对象的API,使用XPath表达式
List<Node> list = document.selectNodes("//name");
//遍历输出
for (Node node : list) {
System.out.println(node.getText());
}
}
结果输出为:
lz
zhanshang
获得某一个标签的值
/**
* 获得某一个标签(name)的值
* @throws Exception
*/
@Test
public void fun2() throws Exception{
Document document = new SAXReader().read("src/person.xml");
Node node = document.selectSingleNode("//student[@id='123']/name"); //获得某一个标签
System.out.println(node.getText());
}
结果输出为:
lz
dom4J使用笔记的更多相关文章
- Dom4j 学习笔记
dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...
- Dom4j学习笔记
一.Loading XML Data 以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象.一个Document对象表示了内存中的一棵XML树,可以在这个XML树中进行 ...
- dom4j处理带命名空间的XML-使用XPath(转)
dom4j处理带命名空间的XML-使用XPath 博客分类: XML XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 使 ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- JavaWeb学习笔记——DOM4J
下载的地址为:http://www.dom4j.org/dom4j-1.6.1/ import java.io.File; import java.io.FileOutputStream; impor ...
- XML学习笔记(2)--dom4j操作XML
1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...
- javaEE学习笔记-利用DOM4J解析xml至数据库
xml代码文件名:test02.xml <ACCESOS> <item> <SOCIO> <NUMERO>00045050</NUMERO> ...
- dom4j 笔记【转】
SAXReader reader = new SAXReader(); Document doc = reader.read(...); List childNodes = doc.selectNod ...
- Javaweb学习笔记——(六)——————xml中jaxp两种解析方式和dom4j运用
1.xml的scheam约束 dtd的语法:<!ElEMENT 元素名称 约束> **schema符合xml的语法,xml语句 **一个xml中可以有多个schema,多个schema使用 ...
随机推荐
- Python中注释的添加
1.Python中注释,有助于我们对程序的理解:但注释不需要每行都写,可以在方法前面注释该方法的功能 或重要的一行进行注释. 2.单行注释,使用#号: 3.多行注释,使用""&qu ...
- 圣诞节为大家推荐一些学习java书籍
怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题 初级 ...
- 高并发异步uwsgi+web.py+gevent
为什么用web.py? python的web框架有很多,比如webpy.flask.bottle等,但是为什么我们选了webpy呢?想了好久,未果,硬要给解释,我想可能原因有两个:第一个是兄弟项目组用 ...
- rabbitMQ高可用
镜像模式 镜像模式和普通模式的区别就是,队列的数据都镜像了一份到所有的节点上.这样任何一个节点失效,不会影响整个集群的使用. 在实现上,mirror queue内部有一套选举算法,会选出一个maste ...
- Spring之基础
Spring之目的 Spring致力于简化企业级Java开发,促进代码的松散耦合.成功的关键在于依赖注入(DI)和面向切面编程(AOP) Spring之DI DI是组装应用对象的一种方 ...
- 音乐随想——斯美塔那—G小调钢琴协奏曲
乐源 Music -> Piano Trio -> Smetana:Piano Trioin G minor Op.15 总结 每一乐章都会有一段美到极致的主旋律. 第一乐章 起头即有凄凉 ...
- C# 速编神器LinqPad(新版5.25)
点此下载5.25 (支持.net4.6,有调试器)(页面有广告,一直点免费下载即可)(可用)密码 lp123456 批处理如下. @echo off start /b LINQPad.exe -n ...
- Roslyn 的确定性构建
注意到每次编译完之后,你的 dll 或者 exe 是不一样的吗?本来这并没有什么大不了的,但大家都知道数字和鹅厂的安全软件遍布在我们大(tiān)陆(cháo)地区的大量电脑上,它们的查杀策略是——凡 ...
- LOJ3044. 「ZJOI2019」Minimax 搜索
LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小 ...
- CentOS常用基础命令汇总
1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours: ...