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. start a new android studio project not working

    现象:点击无响应 解决:Configure -> Project Defaults -> Project Structure -> Platform Settings (SDK) c ...

  2. [ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...

  3. Oracle 数据库SQL性能查看

    作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看 ...

  4. ubuntu kylin 16.04系统的基本安装

    系统版本:ubuntu kylin 16.04 硬件状况:500G HDD+120G SSD 已安装操作系统:WIN 10专业版(craked) ——WIN 10系统是装在SSD的第一个盘符内的.以前 ...

  5. 关于SQL Cookbook里dept与emp表结构以及数据

    用MYSQL 写了一下,将number变成int, to_date去掉即可. DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` ) ...

  6. tar命令

    # tar -cvf /usr/local/auto_bak/test.tar /usr/local/test 仅打包,不压缩 # tar -zcvf /usr/local/auto_bak/test ...

  7. ASP.NET Razor - C# 循环和数组

    语句在循环中会被重复执行. For 循环 如果您需要重复执行相同的语句,您可以设定一个循环. 如果您知道要循环的次数,您可以使用 for 循环.这种类型的循环在向上计数或向下计数时特别有用: 实例 & ...

  8. “System.Data.SqlClient.SqlConnection”的类型初始值设定项引发异常---解决方案

    "System.Data.SqlClient.SqlConnection"的类型初始值设定项引发异常 问题出在了 .net 的C:\WINDOWS\Microsoft.NET\Fr ...

  9. JSON.stringify的使用方法

    语法: JSON.stringify(value [, replacer] [, space]) value:是必须要的字段.就是你输入的对象,比如数组啊,类啊等等. replacer:这个是可选的. ...

  10. easycwmp的编译

    原创作品,转载请注明出处,严禁非法转载. copyright:weishusheng   2015.3.18 email:642613208@qq.com 注:此处的编译指的是直接用系统自带的gcc编 ...