使用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("文本值")设置文本值

查询元素

查询操作主要是用elementelements方法

/**
* 查询所有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使用笔记的更多相关文章

  1. Dom4j 学习笔记

    dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...

  2. Dom4j学习笔记

    一.Loading XML Data 以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象.一个Document对象表示了内存中的一棵XML树,可以在这个XML树中进行 ...

  3. dom4j处理带命名空间的XML-使用XPath(转)

    dom4j处理带命名空间的XML-使用XPath 博客分类: XML   XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 使 ...

  4. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  5. JavaWeb学习笔记——DOM4J

    下载的地址为:http://www.dom4j.org/dom4j-1.6.1/ import java.io.File; import java.io.FileOutputStream; impor ...

  6. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  7. javaEE学习笔记-利用DOM4J解析xml至数据库

    xml代码文件名:test02.xml <ACCESOS> <item> <SOCIO> <NUMERO>00045050</NUMERO> ...

  8. dom4j 笔记【转】

    SAXReader reader = new SAXReader(); Document doc = reader.read(...); List childNodes = doc.selectNod ...

  9. Javaweb学习笔记——(六)——————xml中jaxp两种解析方式和dom4j运用

    1.xml的scheam约束 dtd的语法:<!ElEMENT 元素名称 约束> **schema符合xml的语法,xml语句 **一个xml中可以有多个schema,多个schema使用 ...

随机推荐

  1. Guid.NewGuid() 和 new Guid()的区别

    Guid.NewGuid().ToString() + "||" + (new Guid()).ToString() b8efacbb-7d43-4da5-9f48-9a75d8c ...

  2. 慕课网-Linux达人养成计划学习笔记

    mkdir -p [目录]创建目录-p 递归创建ls 查看当前目录下的文件和目录等其他文件 cd [目录]命令英文愿意:change directory切换所在目录简化操作cd ~ 进入当前用户的家目 ...

  3. easychm生成帮助文件时出现的目录导航乱码问题

    将html生成帮助文件时出现乱码问题的主要原因是:文件编译格式的问题 (一般的网页都是utf-8格式的,将其改为GB2312就可以了):

  4. CUDA Samples: Calculate Histogram(atomicAdd)

    以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...

  5. Java数据封装类

    项目中用到,比较好用!! 用户前端与后台的交互数据,这个封装类中包含分页.数据.错误码.状态码等信息!! 亲测好用哦! 一个类DataWrapper public class DataWrapper& ...

  6. redis事务浅析

    事务可以简单理解为:把多件事当做一件事情处理,要么一起成功,要么一起失败.在Spring中可以配置一个事务管理器,然后在要进行事务处理的方法上添加@Transactional注解就可以了. 对于red ...

  7. 关于Django的core first 、db first

    db first 根据数据库的表生成类 django : python manage.py inspectdb code first 根据类创建数据库表: django: python manage. ...

  8. Jmter-Test Fragment、Include Controller和Module Controller

    Test Fragment--测试片段 The Test Fragment is used in conjunction with the Include Controller and Module ...

  9. CentOS 7.4中firewall防火墙详解和配置以及切换为iptables防火墙

    转载:https://blog.csdn.net/xlgen157387/article/details/52672988 一.firewall介绍 CentOS 7中防火墙是一个非常的强大的功能,在 ...

  10. apache与nginx对比优势及劣势

    1.nginx相对于apache的优点:轻量级,同样起web 服务,比apache占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能 ...