Java给我们提供了标准的W3C接口实现,已完成对XML的处理。主要有两大类,分别是DOM操作,SAX解析。DOM可以将XML加载到内存中,对XML进行方便的增删查改。由于是将整个XML都加载到内存中,所以一般说来只适合于处理比较小的XML文件。而SAX方式克服了DOM的对文件大小限制,它采用先序的方式遍历整个XML文件。也就是说SAX是有一定的顺序的执行的,一个节点一个节点的加载。这样即使XML文档很大,但不需要将其整个加载到内存中,所以SAX可以处理较大的XML文件。但SAX的缺点是不能对XML文档进行修改,只能顺序读取。

综上所诉,DOM解析和SAX解析二者各有优缺点,相互弥补。

但是毕竟我们希望能有一个统一的方式或工具能够集合DOM和SAX的优点,这样我们可以抛开底层,而专注于工具使用,从而对XML进行方便的操作,从而DOM4J就应运而生了。下面我们从几个方面来讲解DOM4J的用法。

1 在内存中创建一个Document对象。

Document document = DocumentHelper.createDocument();

2 为Document对象生成根节点

Element root = document.addElement("admins");

3 为Document生成子节点。这里我们用一个List<Admin>对象,将List中每个Admin对象加载到document对象中.使用Document的addElement()方法增加根节点。然后调用节点方法addAttribute()增加属性。调用addElement()方法增加子节点。调用addText()方法增加文本节点。

         for (Admin item : allAdmins)
{
Element admin = root.addElement("admin"); admin.addAttribute("aid", item.getAid());
admin.addElement("rid").addText(String.valueOf(item.getRid()));
admin.addElement("type").addText(String.valueOf(item.getType()));
admin.addElement("lastdate").addText(String.valueOf(item.getLastdate()));
admin.addElement("flag").addText(String.valueOf(item.getFlag()));
}

4 将内存中的document保存到本地文件中。使用OutputFormat设置XML格式,使用XMLWriter将内存的document写到磁盘上。

     public static void saveToFile(String path, Document document) throws Exception
{
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
OutputStream os = new FileOutputStream(path);
XMLWriter xmlWriter = new XMLWriter(os, format);
xmlWriter.write(document);
}

5 将本地文件读取到内存中。使用SAXReader。

     public static Document loadFromFile(String path) throws Exception
{
SAXReader reader = new SAXReader();
Document document = reader.read(new File(path));
return document;
}

6 对document进行更新。使用getRoot()方法可以获取根节点。使用elements()方法可以获取所有指定名称的元素节点,以List<Element>的方式返回。使用remove方法可以删除一个节点。

    public static void changeStructure(Document document)
{
Element root = document.getRootElement();
List<Element> allElements = root.elements("admin");
for(Element item : allElements)
{
Attribute attributeAid = item.attribute("aid");
item.addElement(attributeAid.getName()).addText(attributeAid.getValue());
item.remove(attributeAid); }
}

完成代码可以参考下面:

package xmlDom.main;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*; import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; import xmlDom.dbc.DatabaseConnection;
import xmlDom.vo.*; public class Hello
{
public static void main(String[] args) throws Exception
{
String path = "C:\\D\\code\\resource\\newAdmin.xml";
// List<Admin> allAdmins = findAllAdmins();
// Document document = convertToDocument(allAdmins);
// saveToFile(path, document); Document document = loadFromFile(path);
changeStructure(document);
saveToFile(path, document); System.out.println("main done//~");
} public static void changeStructure(Document document)
{
Element root = document.getRootElement();
List<Element> allElements = root.elements("admin");
for(Element item : allElements)
{
Attribute attributeAid = item.attribute("aid");
item.addElement(attributeAid.getName()).addText(attributeAid.getValue());
item.remove(attributeAid); }
} public static void saveToFile(String path, Document document) throws Exception
{
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
OutputStream os = new FileOutputStream(path);
XMLWriter xmlWriter = new XMLWriter(os, format);
xmlWriter.write(document);
} public static Document loadFromFile(String path) throws Exception
{
SAXReader reader = new SAXReader();
Document document = reader.read(new File(path));
return document;
} private static Document convertToDocument(List<Admin> allAdmins) throws Exception
{
Document document = DocumentHelper.createDocument(); Element root = document.addElement("admins");
for (Admin item : allAdmins)
{
Element admin = root.addElement("admin"); admin.addAttribute("aid", item.getAid());
admin.addElement("rid").addText(String.valueOf(item.getRid()));
admin.addElement("type").addText(String.valueOf(item.getType()));
admin.addElement("lastdate").addText(String.valueOf(item.getLastdate()));
admin.addElement("flag").addText(String.valueOf(item.getFlag()));
} return document;
} /**
* 从数据库中将数据查询出来,然后转换成内存中的XML文档
*
* @return
* @throws Exception
*/
public static List<Admin> findAllAdmins() throws Exception
{
List<Admin> allAdmins = new ArrayList<Admin>();
DatabaseConnection dbc = new DatabaseConnection();
Connection conn = dbc.getConnection();
String sql = " SELECT aid,rid,type,lastdate,flag FROM admin ";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
Admin admin = new Admin();
admin.setAid(rs.getString("aid"));
admin.setRid(rs.getInt("rid"));
admin.setType(rs.getInt("type"));
admin.setLastdate(rs.getDate("lastdate"));
admin.setFlag(rs.getInt("flag"));
allAdmins.add(admin);
}
return allAdmins;
}
}

dom4J 学习的更多相关文章

  1. dom4j学习总结(一)

    dom4j学习总结(一) (一)创建Document的基本操作 /**  * xml基本操作  */ public void BaseOperation(){  //创建一个document  Doc ...

  2. dom4j学习

    在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便. 首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包: ...

  3. dom4j 学习总结

    Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platfo ...

  4. Dom4j 学习笔记

    dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...

  5. Dom4j学习笔记

    一.Loading XML Data 以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象.一个Document对象表示了内存中的一棵XML树,可以在这个XML树中进行 ...

  6. dom4j处理带命名空间的XML-使用XPath(转)

    dom4j处理带命名空间的XML-使用XPath 博客分类: XML   XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 使 ...

  7. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  8. java学习笔记DOM4J解析(7)

    DOM4J即Document Object Model for Java使用java技术以文档方式解析XML数据的模型. DOM4J是开源组织提供的一个免费的.强大的XML解析工具,如果开发者需要在项 ...

  9. JavaWeb学习笔记——DOM4J

    下载的地址为:http://www.dom4j.org/dom4j-1.6.1/ import java.io.File; import java.io.FileOutputStream; impor ...

随机推荐

  1. 研华运动控制卡 SoftMotion 技术简介

    SoftMotion为研华在设备自动化中的一项重要核心技术,相较于过去市面上ASIC 运动控制解决方案,研华自动化团队自主技术开发软件运动控制技术,并且透过现场可程序逻辑门阵列 (FPGA, Fiel ...

  2. JavaScript中本地对象、内置对象和宿主对象

    链接:http://www.cnblogs.com/luckyXcc/p/5892896.html(Milk.╮的博客园提供) 其中内置对象只有两种:ECMA-262 只定义了两个内置对象,即 Glo ...

  3. Day25_多线程第二天

    1.单例); } 4.线程之间的通信(多个线程共享同一数据的问题) ; public void print1() throws InterruptedException { synchronized( ...

  4. 转发 通过NAT和防火墙特性和TCP穿透的测评(翻译)

    转自 http://blog.csdn.net/sjin_1314/article/details/18178329 原文:Characterization and Measurement of TC ...

  5. Android倒计时:计算两个时间将得到的时间差转化为倒计时(xx时xx分xx秒格式)

    首先是一个自定义控件: public class RushBuyCountDownTimerView extends LinearLayout { // 小时,十位 private TextView ...

  6. yii 初步安装

    第一步: window下点击>开始 >运行CMD命令. 第二步:进入Yiic文件的目录   (例如在D盘里面 D:/yii/framework) 第三步:D:\yii\framework& ...

  7. UDP收发buffer尺寸对收发包流量的影响

    下午验证一个高流量发包问题时,发现了一个值得记录的问题:socket的收发buffer尺寸是会影响收发包的效率的,高流量通讯时,若socket的收发buffer尺寸过小会一定程度降低收发包效率. 自己 ...

  8. linux c网络编程之函数

    1. struct protoent *protocol=getprotobyname(char *p); 功能:通过协议名获取协议类型信息 解释:p为字符串指针,指向一个协议名,如icmp,stru ...

  9. bzoj 3531 旅行

    动态开点线段树+树链剖分  对于每一种宗教信仰都开一颗线段树 空间: QlogN 即每一次修改都只会改变logN 个点 时间 O(QlogN)  naive题  边没有开两倍  QAQ bzoj 35 ...

  10. 简单的 JSON 对象进行深拷贝最简单的方法

    var json = { a: 123, b: '456' }; var json2 = JSON.parse(JSON.stringify(json)); 只需要先使用 JSON.stringify ...