dom4j实现XML操作

1.dom4j介绍

1.1.sax解析和dom解析

JAVA 解析 XML 通常有两种方式,DOM 和 SAX。

1.1.1.sax解析

SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API 在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会 被抛弃。

1.1.2.dom解析

基于DOM解析的xml分析器是将其转换为一个对象模型的集合,用树这种数据结构对信息进行储存。通过DOM接口,应用程序可以在任何时候访问xml文档中的任何一部分数据,因此这种利用DOM接口访问的方式也被称为随机访问。

这种方式也有缺陷,因为DOM分析器将整个xml文件转换为了树存放在内存中,当文件结构较大或者数据较复杂的时候,这种方式对内存的要求就比较高,且对于结构复杂的树进行遍历也是一种非常耗时的操作。不过DOM所采用的树结构与xml存储信息的方式相吻合,同时其随机访问还可利用,所以DOM接口还是具有广泛的使用价值。

1.1.3.dom4j

dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

1.1.4.XStream和Dom4j的区别

XStream在处理XML文件和JavaBean对象互转时比较好,dom4j对常用的xml配置文件操作比较好点;首先,Dom4j 处理xml应该是公认的易操作、高效率,特别是对读取和修改xml文件中内容 也提供了丰富的API接口,但是在dom4j在处理XML文件和JavaBean对象互转时,会有些小麻烦,特别是 XML 文件的内容转换成对应的 JavaBean对象的情况,这时 XStream 就显得的得心应手了,除此之外,XStream还可以实现对JSon格式的完美转换,XStream比较小巧,但功能有限,不过大众型的日常操作基本够用;总的来说,如果涉及到XML文件和其它对象的转换 可以考虑下用XStream,其它情况下建议用Dom4j。

2.dom4j 例子( 解析XML 和 增删改 xml节点)

2.1.解析xml

public static String doc2String(Document document)
{
String s = “”;
try
{
//使用输出流来进行转化
ByteArrayOutputStream out = new ByteArrayOutputStream();
//使用GB2312编码
OutputFormat format = new OutputFormat(" ", true, “GB2312”);
XMLWriter writer = new XMLWriter(out, format);
writer.write(document);
s = out.toString(“GB2312”);
}catch(Exception ex)
{
ex.printStackTrace();
}
return s;
}

2.2.增删改xml

2.2.1.增加新节点

package 正式版.XML.增删改查;

import java.io.FileWriter;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Zen {
public static void main(String[] args) throws Exception {

Document doc = new SAXReader().read(“src/正式版/XML/增删改查/Humen.xml”);

Element root = doc.getRootElement();//得到根节点

Element San = root.addElement(“Hum”);//用根节点root创建一个Hum节点 – 添加节点
Element name = San.addElement(“name”);//给新的Hum创建子节点 name和age --添加子节点
Element age = San.addElement(“age”);

name.addAttribute(“id”, “003”);//给name附上属性和属性值    --添加属性
name.setText(“老胡”);//设置name标签内文本内容        --添加文本
age.setText(“20”);//设置age标签内文本内容

//这里是保存,路径相同相当于是更新内容 (文档有变动都需要此操作)
OutputFormat format = new OutputFormat();
format.setEncoding(“UTF-8”);
XMLWriter writer = new XMLWriter(new FileWriter(“src/正式版/XML/增删改查/Humen.xml”),format);
writer.write(doc);
writer.close();
System.out.println(“添加节点成功!!”);
}
}

2.2.2.删除节点

package 正式版.XML.增删改查;

import java.io.FileWriter;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Shan {

public static void main(String[] args) throws Exception {

Document doc = new SAXReader().read(“src/正式版/XML/增删改查/Humen.xml”);//得到文档

Element root = doc.getRootElement();//得到根节点

List list = root.elements();//得到根节点下的所有儿子节点【Hum】

//删节点操作
Element H= list.get(2).element(“name”);//通过第三个Hum,找到name节点
H.detach();//删除第三个Hum中的name节点(精确删节点)

Element H2= list.get(2);//得到第三个Hum节点
H2.detach();// 删除第三个Hum节点–删整个节点(诛九族)

//删属性操作 (一般不会删属性值保留属性的,如有此需求,直接修改属性值为空就好了)
Attribute arr = H.attribute(“id”);//从孙子name脑壳上找到id属性
arr.detach();//删除这个 id==003

//第二种方式 通过父节点调用remove() 可以删子节点 属性 文本 怎么方便怎么用

//这里是保存,路径相同相当于是更新内容
OutputFormat format = new OutputFormat();
format.setEncoding(“UTF-8”);
XMLWriter w = new XMLWriter(new FileWriter(“src/正式版/XML/增删改查/Humen.xml”),format);
w.write(doc);
w.close();
System.out.println(“成功”);
}
}

2.2.3.修改节点

package 正式版.XML.增删改查;

import java.io.FileWriter;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Gai {

public static void main(String[] args) throws Exception {

Document doc = new SAXReader().read(“src/正式版/XML/增删改查/Humen.xml”);//得到文档对象

Element root = doc.getRootElement();//得到根节点

List list = root.elements();//得到根节点下的所有儿子节点【Hum】

Element H= list.get(2).element(“name”);//通过第三个Hum,找到name节点
H.setName(“666”);//修改节点名称

Attribute arr = H.attribute(“id”);//从name节点找到id属性
arr.setValue(“055”);//修改id为055 -修改属性(一般不会修改属性名保留属性值,可删除属性添加属性来实现)

Element H2 = list.get(2).element(“age”);//得到老胡年龄
H2.setText(“18”);//修改age为18 -修改内容

//这里是保存,路径相同相当于是更新内容
OutputFormat format = new OutputFormat();
format.setEncoding(“UTF-8”);
XMLWriter w = new XMLWriter(new FileWriter(“src/正式版/XML/增删改查/Humen.xml”),format);
w.write(doc);
w.close();
System.out.println(“成功”);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值