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. ICA和PCA

    http://wenku.baidu.com/link?url=BsmIM7T4CU1D_MgiBzu4Ul1oLnM2Qpmc0sCfXIcD9S20qq3BEkSnuY4RUc7gDZoeFR1N ...

  2. java中的日期操作Calendar和Date

    1. Calendar转Date Calendar calendar = Calendar.getInstance(); Date date = calendar.getTime(); 2. Date ...

  3. iOS 动态下载系统提供的中文字体

    使用系统提供的中文字体,既可避免版权问题,又可以减小应用体积 #pragma mark - 判断字体是否已经被下载 - (BOOL)isFontDownLoaded:(NSString *)fontN ...

  4. 【转】oracle内存分配和调优总结

    转自 http://blog.itpub.net/12272958/viewspace-696834/ 一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且 ...

  5. SVN更新报错

    将服务器SVN文件更新到本地是出现下图错误 报错中已经提示可以通过clean up来清理,若直接执行release lock,则不会解决问题. 原因:本地的项目中存在过期的工作副本 解决办法:选择该文 ...

  6. Servlet-RequestDispatcher.forward方法

    forward方法与Include方法非常相似,但有5点不同 1,在调用forward方法之前,输出缓冲区的数据会被清空,也就是说,在使用forward方法进行请求转发时,只可能输出别转发的web资源 ...

  7. ipython安装

    sudo pip install jupyter 然后用jupyter notebook来运行

  8. 将网页另存为PDF文件的方法

    使用google chrome浏览器测试,其他浏览器应该也是差不多的方法. 步骤1: 打开需要转换的网页: 步骤2: 点击右上角的三点按键,或者快捷键Ctrl+P,调用的打印页面: 步骤3: 选择目标 ...

  9. Hibernate4.1之后关于占位符的问题

    hibernate 4.1之后对于HQL中查询参数的占位符做了改进,如果仍然用老式的占位符会有类似如下的告警信息 [main] WARN [org.hibernate.hql.internal.ast ...

  10. [原创]cocos2d-x研习录-第三阶 背景音乐和音效

    在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...