使用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. c# 获取随机数字/字符/时间

    using System; using System.Text; namespace HuaTong.General.Utility { /// <summary> /// 随机字符/数字 ...

  2. ffmpeg新老接口对比

    http://blog.csdn.net/leixiaohua1020/article/details/41013567

  3. 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息

    注释 像Java开发语言一样,Drools文件中也可以添加注释.注释部分Drools引擎是会将其忽略调的.单行注释使用"//",示例如下: rule "Testing C ...

  4. java List 学习

    要学习List<E>接口,首先,我知道它还有一个父接口Collection<E>.而Collection<E>又有一个超级接口Iterable<T>. ...

  5. 【剑指offer】链表中倒数第k个节点,C++实现(链表)

    1.题目 输入一个链表,输出该链表中倒数第k个结点.链表的尾节点是倒数第一个节点. struct ListNode { int val; struct ListNode *next; } 2.思路   ...

  6. php自动添加相关文章

    {pc:content action="relation" relation="$relation" id="$id" catid=&quo ...

  7. js检测三角形是否包含一个点

    pointInTriangle:function(x0, y0, x1, y1, x2, y2, x3, y3) { var divisor = (y2 - y3)*(x1 - x3) + (x3 - ...

  8. day5 io模型

    五种概览:http://www.cnblogs.com/xiehongfeng100/p/4763225.html http://sukai.me/linux-five-io-models/  内有多 ...

  9. HTTP Client Performance Improvements

    HTTP Client Performance Improvements https://blogs.msdn.microsoft.com/webdev/2018/10/17/asp-net-core ...

  10. BZOJ4543 [POI2014]Hotel加强版

    题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...