前言
- dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的,dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的DOM技术,同时它也是一个开放源代码的软件。
- 在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的,如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j
- Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP
以上内容来自于百度百科
在使用它之前,记得要先导一下包
下载地址:https://dom4j.github.io/
(如果下载不了,请翻墙下载)
使用
- 先看一下我们要解析的内容,然后观察一下XML文件的结构与组成
- 但只要简单了解一下就好了,然后继续往后面看
<?xml version="1.0" encoding="utf-8"?>
<data>
<action value="大家请看这里,哈哈哈1">
<array>
<name type="号码">1号</name>
<name type="号码">2号</name>
</array>
<array>
<name>开始咯!</name>
<name>开始咯!</name>
<name>开始咯!</name>
</array>
</action>
</data>
解析节点值
- 写的时候记得要选Dom4j包下的类
- XML文件的主要数据就是节点值,节点值可以是一个文本节点,也可以是其他元素节点
- 比如上面的那个XML文件,根节点是data,根节点的节点值是action节点
SAXReader sax=new SAXReader();
Document doc=sax.read(new File("/storage/emulated/0/360/样本.xml"));
Element root=doc.getRootElement();
Element array=root.element("action").element("array");
System.out.println(array.element("name").getText());
System.out.println(array.elements("name").get(1).getText());
- 运行一下
1号
2号
解析属性值
- 属性是为了给元素提供额外的信息
SAXReader sax=new SAXReader();
Document doc=sax.read(new File("/storage/emulated/0/360/样本.xml"));
Element root=doc.getRootElement();
Element array=root.element("action").element("array");
System.out.println(array.element("name").attributeValue("type"));
System.out.println(array.elements("name").get(1).attributeValue("type"));
- 解析结果
号码
号码
节点转XML字符串
- 属性值和节点值都有了,Dom4j还提供了其他的一些其他方法,比如下面这个
- 可以将任意一个节点转化为XML字符串,具体如下:
SAXReader sax=new SAXReader();
Document doc=sax.read(new File("/storage/emulated/0/360/样本.xml"));
Element root=doc.getRootElement();
Element array=root.element("action").element("array");
System.out.println(array.asXML());
- 输出结果
<array>
<name type="号码">1号</name>
<name type="号码">2号</name>
</array>
遍历数据
- 当我们需要对整个xml文件进行解析时,我们就需要遍历数据,这里我们采用递归方法实现,看起来还算简洁吧!
SAXReader sax=new SAXReader();
Document doc=sax.read(new File("/storage/emulated/0/360/样本.xml"));
Element root=doc.getRootElement();
parse(root);
private static void parse(Element e){
System.out.println(e.getName());
List<Element>list=e.elements();
for (Element element:list){
parse(element);
}
}
增加节点
- 仅仅是解析xml文件怎么行呢,当然还要可以增加呀,哈哈哈…
//创建一个空白文档
Document doc =DocumentHelper.createDocument();
//增加根节点
Element root=doc.addElement("data");
//在根节点中继续增加节点
Element action=root.addElement("action");
//添加一条属性
action.addAttribute("value","这是添加的");
Element array=action.addElement("array");
Element name1=array.addElement("name");
Element name2=array.addElement("name");
name1.addAttribute("type","号码");
name2.addAttribute("type","号码");
name1.addText("1号");
name2.addText("2号");
//写入xml文件
OutputFormat format=OutputFormat.createCompactFormat();
format.setEncoding("utf-8");//GBK
XMLWriter writer=new XMLWriter(new FileOutputStream("/storage/emulated/0/360/样本2.xml"),format);
writer.write(doc);
writer.close();
- 运行结果
<?xml version="1.0" encoding="utf-8"?>
<data>
<action value="这是添加的">
<array>
<name type="号码">1号</name>
<name type="号码">2号</name>
</array>
</action>
</data>
删除节点
- 有的时候,我们需要删除单独的某个节点,这时候,dom4也j能够为我们实现
SAXReader sax=new SAXReader();
Document doc=sax.read(new File("/storage/emulated/0/360/样本2.xml"));
Element array=doc.getRootElement().element("action").element("array");
array.remove(array.element("name"));
//array.remove(array.elements("name").get(0));
OutputFormat format=OutputFormat.createCompactFormat();
format.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("/storage/emulated/0/360/样本3.xml"),format);
writer.write(doc);
writer.close();
- 运行结果
<?xml version="1.0" encoding="utf-8"?>
<data>
<action value="这是添加的">
<array>
<name type="号码">2号</name>
</array>
</action>
</data>
修改节点
- 如果一个xml文件不能修改,那么xml文件的作用就会大大的打折扣了
SAXReader sax=new SAXReader();
Document doc=sax.read(new File("/storage/emulated/0/360/样本2.xml"));
Element array=doc.getRootElement().element("action").element("array");
array.setAttributeValue("test","修改xml文件");
OutputFormat format=OutputFormat.createCompactFormat();
format.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("/storage/emulated/0/360/样本3.xml"),format);
writer.write(doc);
writer.close();
- 运行结果
<?xml version="1.0" encoding="utf-8"?>
<data>
<action value="这是添加的">
<array test="修改xml文件">
<name type="号码">2号</name>
</array>
</action>
</data>
本文到此结束