1、dom4j解析xml简介
dom4j,是一个组织,针对xml解析,提供解析器 dom4j。
首先给出样本xml和我自己针对dom4j编写的工具类:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>88</age>
<sax>nv</sax>
<school>beida</school>
</p1>
<p1>
<name id="yangzebin">lisi</name>
<age>30</age>
</p1>
</person>
工具类:
/*
* 在使用该类之前,先将PATH初始化,即设置setPATH方法。
* */
public class Dom4jUtils {
private static String PATH = "";
public static void setPATH(String path){
PATH = path;
}
public static String getPATH(){
return PATH;
}
//根据路径返回document的方法。
public static Document getDocument(){
try{
SAXReader reader = new SAXReader();
Document document = reader.read(PATH);
return document;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
//回写xml(缩进格式)
public static void xmlWriterByPretty(Document document){
try{
OutputFormat format =OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH),format);
xmlWriter.write(document);
xmlWriter.close();
}catch(Exception e){
e.printStackTrace();
}
}
//回写xml(压缩格式)
public static void xmlWritersByCompact(Document document){
try{
OutputFormat format =OutputFormat.createCompactFormat();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH),format);
xmlWriter.write(document);
xmlWriter.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
2、使用dom4j查询xml
//查询xml中所有的name元素的值
public static void selectName() throws Exception{
/*
* 1、创建解析器
* 2、得到document
* 3、得到根节点
*
* 4、得到p1标签
* 5、得到p1下面的name
* 6、得到name的值
* */
Document document =Dom4jUtils.getDocument();
Element root =document.getRootElement();
List<Element> list =root.elements("p1");
for(Element element : list){
//element是每一个p1元素
//得到p1下面的name元素
Element name1=element.element("name");
String s =name1.getText();
System.out.println(s);
}
}
//获取第一个name元素里面的值
public static void selectFirstName() throws Exception{
/*
* 1、创建解析器
* 2、得到document
* 3、得到根节点
*
* 4、得到第一个p1标签
* 5、得到p1中的第一个name标签
* 6、获取其中的值
* */
Dom4jUtils.setPATH("src/dome.xml");
Document document =Dom4jUtils.getDocument();
Element root=document.getRootElement();
//得到第一个p1标签
Element p1 = root.element("p1");
//得到p1中的第一个name标签
Element name =p1.element("name");
//6、获取其中的值
String s1 =name.getText();
System.out.println(s1);
}
//在特定位置添加Node。,在第二个p1下面的age标签之前添加<school>qinghua</school>
public static void addSchool() throws Exception{
/*
* 1、创建解析器
* 2、得到document
* 3、得到根节点
*
* 4、得到所有p1标签,得到第二个p1标签
* 5、得到第二个p1中的所有子标签
* 6、创建school标签
* 7、添加文本
* 8、将school添加到第二个p1标签中的角标1中。
* 10、回写xml
*/
Dom4jUtils.setPATH("src/dome.xml");
Document document =Dom4jUtils.getDocument();
Element root = document.getRootElement();
//得到所有p1标签
List<Element> listp1= root.elements("p1");
//得到第二个p1标签
Element p1By2= listp1.get(1);
//得到第二个p1标签下的所有标签(一层)
List<Element> listNext=p1By2.elements();
//创建元素 school
Element school= DocumentHelper.createElement("school");
//为school添加文本
school.setText("qinghua");
//将school添加到第二个p1标签中的角标1中。
listNext.add(1, school);
//回写xml
Dom4jUtils.xmlWriterByPretty(document);
}
****单独创建element的方法:使用DocumentHelper.createElement(qname);来创建。
//在第一个p1标签的末尾添加一个元素<sex>nv</sex>
public static void addNode() throws Exception{
/*
* 1、创建解析器
* 2、得到document
* 3、得到根节点
*
* 4、得到第一个p1
* 5、在p1下面添加元素
* 6、在添加之后的元素下面添加文本
*
* 7、回写xml
*/
Document document =Dom4jUtils.getDocument();
Element root=document.getRootElement();
Element p1=root.element("p1");
Element sax=p1.addElement("sax");
sax.setText("nv1");
// OutputFormat format = OutputFormat.createPrettyPrint();//有缩进
// OutputFormat format = OutputFormat.createCompactFormat();//无缩进
Dom4jUtils.xmlWriterByPretty(document);
}
4、使用dom4j修改元素
//修改第一个p1下面的age元素的值<age>30</age>
public static void modifyAge(){
/*
* 1、得到document
* 2、得到第一个p1元素,
* 3、得到第一个p1下面的age
* 4、修改值为39,
*
* 5、回写xml
*
* */
Dom4jUtils.setPATH("src/dome.xml");
Document document = Dom4jUtils.getDocument();
Element root =document.getRootElement();
Element p1=root.element("p1");
Element age =p1.element("age");
age.setText("39");
Dom4jUtils.xmlWriterByPretty(document);
}
//删除第一个p1下面的<school>标签
public static void delSchool(){
/*
* 1、得到document
* 2、得到根节点
* 3.得到第一个p1标签
* 4、得到school标签
* 5、通过父标签(p1)删除school标签
* 6、回写xml
* */
Dom4jUtils.setPATH("src/dome.xml");
Document document = Dom4jUtils.getDocument();
Element root =document.getRootElement();
List<Element> list = root.elements("p1");
Element p1 =list.get(1);
Element school=p1.element("school");
p1.remove(school);
Dom4jUtils.xmlWriterByPretty(document);
}
5、查询元素的属性
//获取第二个p1标签中的name的属性值。
public static void getValues(){
/*
* 1、得到document
* 2、得到根节点
* 3.得到第二个p1标签
* 4、得到name标签
* 5、得到name的属性值
* --使用attributeValue(qname)方法获取指定属性名的值。
* */
Dom4jUtils.setPATH("src/dome.xml");
Document document = Dom4jUtils.getDocument();
Element root =document.getRootElement();
List<Element> list = root.elements("p1");
Element p1 =list.get(1);
Element name =p1.element("name");
String nameById =name.attributeValue("id");
System.out.println(nameById);
}
6、下面介绍有关Xpath的表示
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
使用dom4j支持xpath的操作:
可以直接获取到某个元素
常用的获取形式:
第一种形式:
/AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB
第二种形式:
//BBB:表示和这个名称相同,表示只要名称为BBB,都获取
第三种形式:
/*:所有元素
第四种形式:
BBB[1]:表示第一个BBB元素
BBB[last()]:表示最后一个BBB元素
第五种形式:
//BBB[@id]: 表示只要BBB元素上有Id属性,都获取到
第六种形式:
//BBB[@id='b1']:表示元素名称是BBB,在BBB上面有id属性,id属性值为b1
那么如何在dom4j中加以运用呢?
7、使用dom4j支持xpath具体操作
默认情况下,dom4j不支持xpath
需要导包:jaxen-1.1-beta-6.jar
在dom4j里面提供了两个方法,用来支持xpath
selectNodes("xpath表达式"):
- 获取多个节点
selectSingleNode("xpath表达式"):
- 获取单个节点
代码实现:
//使用xpath来实现获取所有name元素里面的值
public static void selectNameByXpath(){
Dom4jUtils.setPATH("src/dome.xml");
Document document =Dom4jUtils.getDocument();
//得到该xml中所有的name节点
List<Element> list=document.selectNodes("//name");
for (Element element : list) {
String name =element.getText();
System.out.println(name);
}
}
使用xpath来实现修改第一个p1下面的age元素里面的值
public static void modifyageByXpath(){
Dom4jUtils.setPATH("src/dome.xml");
Document document =Dom4jUtils.getDocument();
//得到p1下的age标签
Node node =document.selectSingleNode("/person/p1/age");
node.setText("88");
Dom4jUtils.xmlWriterByPretty(document);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。如遇问题请发邮箱405678856@qq.com