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()方法增加文本节点。
1 for (Admin item : allAdmins) 2 { 3 Element admin = root.addElement("admin"); 4 5 admin.addAttribute("aid", item.getAid()); 6 admin.addElement("rid").addText(String.valueOf(item.getRid())); 7 admin.addElement("type").addText(String.valueOf(item.getType())); 8 admin.addElement("lastdate").addText(String.valueOf(item.getLastdate())); 9 admin.addElement("flag").addText(String.valueOf(item.getFlag()));10 }
4 将内存中的document保存到本地文件中。使用OutputFormat设置XML格式,使用XMLWriter将内存的document写到磁盘上。
1 public static void saveToFile(String path, Document document) throws Exception2 { 3 OutputFormat format = OutputFormat.createPrettyPrint();4 format.setEncoding("UTF-8");5 OutputStream os = new FileOutputStream(path);6 XMLWriter xmlWriter = new XMLWriter(os, format);7 xmlWriter.write(document);8 }
5 将本地文件读取到内存中。使用SAXReader。
1 public static Document loadFromFile(String path) throws Exception2 {3 SAXReader reader = new SAXReader();4 Document document = reader.read(new File(path));5 return document;6 }
6 对document进行更新。使用getRoot()方法可以获取根节点。使用elements()方法可以获取所有指定名称的元素节点,以List<Element>的方式返回。使用remove方法可以删除一个节点。
public static void changeStructure(Document document) { Element root = document.getRootElement(); ListallElements = 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";// ListallAdmins = 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 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 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 findAllAdmins() throws Exception { List allAdmins = new ArrayList (); 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; }}