使用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

最新文章

  1. IOS开发之进阶篇第一章 - 姿势识别器UIPanGestureRecognizer
  2. tomcat如何按站点调试本机程序
  3. 原型设计工具Axure 建模工具powerdesigner
  4. .Net 提交页面,js修改的Label值会丢掉
  5. Js编码和Java后台解码
  6. C语言、Java的编译系统
  7. BZOJ1232: [Usaco2008Nov]安慰奶牛cheer
  8. Delphi - GetUserNameEx(学一下导出Windows API,以及Array Char充当缓冲区的用法,下标必须从零开始)
  9. Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012
  10. sharepoint 2013 文档库eventhandle权限控制
  11. Windows下Python读取GRIB数据
  12. java中的GC(gabage collection)如何工作
  13. was unable to start within 45 seconds. If the server requires more time, try increasing the timeout
  14. layui,返回的数据不符合规范,正确的成功状态码 (code) 应为:0
  15. CSP中的选择
  16. Django框架的简介
  17. The Chinese Postman Problem HIT - 2739(有向图中国邮路问题)
  18. process 多进程写法 multiprocessing
  19. Spring boot 下使用 Swagger
  20. 图解TCP/IP(一)

热门文章

  1. Hibernate报错:Caused by: java.sql.SQLException: Field &#39;ID&#39; doesn&#39;t have a default value
  2. yii2.0 高级版 restful api使用
  3. Android6.0之后的权限机制对App开发的影响
  4. Android虚拟、实体键盘不能同时使用?
  5. Linux下iptables介绍
  6. HDU2043 密码
  7. 【解题报告】CF Round #320 (Div. 2)
  8. FTRL笔记
  9. tensorflow图像基本处理
  10. 搭建Hadoop2.6.0+Eclipse开发调试环境(以及log4j.properties的配置)