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使用 ...
随机推荐
- iOS 阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- ImportError: liblapack.so.3: cannot open shared object file问题
问题: 安装完tensorflow后,在终端输入: python import cv2 出现如下错误: ImportError: liblapack.so.3: cannot open shared ...
- (转)Hive自定义UDAF详解
UDAF有两种,第一种是比较简单的形式,利用抽象类UDAF和UDAFEvaluator,暂不做讨论.主要说一下第二种形式,利用接口GenericUDAFResolver2(或者抽象类AbstractG ...
- (转)MapReduce Design Patterns(chapter 6 (part 2))(十二)
Chain Folding 这是对job 链的一种优化.基本上是一种大体规则:每条记录都会提交给多个mapper,或者给reducer然后给mapper.这种综合处理方法会节省很多读文件和传输数据的时 ...
- visual studio 菜单栏显示异常 插件安装异常 扩展异常修复
这几天在使用Visual studio 的扩展插件的时候,遇见了菜单栏显示异常,解决方案显示异常的问题,如下: 经过自己的一顿摸索,解决方法如下,比如我在安装gitee或github插件之后就出现了这 ...
- 创建你的第一个Flutter应用程序
前言 Flutter,Google推出的跨平台开发框架.就在前几天,Flutter的首个发布预览版(Release Preview 1)正式发布! 即将迎来Flutter 正式版(1.0).本篇将带你 ...
- 上周面试回来后写的Java面试总结,想进BAT必看
上周陪同之前一起工作的同事去面试(乔治,小袁,鹏飞(面试人)),第一站是去深圳,第二站上海,第三站杭州.面试什么公司我在这里就不多说了,你们知道是一线公司就行.其实本来真的没打算写这篇文章,主要是自己 ...
- cocos2d-x 3.17 jsb android运行报错
编译成功,运行失败,提示如下: 2018-11-15 19:09:56.343 2820-2852/net.jd85.test D/cocos2d-x debug info: cocos2d: ful ...
- ranch分析学习(二)
紧接上篇,今天我们来分析监督树的工作者,打工仔执行任务的人.废话不多少我们直接进入正题. 3.ranch_server.erl 整个文件的功能主要是存储tcp对应参数的的信息.信息的存储方式采用的 ...
- SEO - H标签
前言 这两天在做网站的SEO.虽然之前SEO的资料看过很多,但是因为正职是美工的缘故,SEO的具体实施参与的较少.现在的公司有点特殊,SEO团队基本不懂代码,所以需要参与的比较多.以下内容主要是通过自 ...