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 Exception 2 { 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 Exception 2 { 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(); 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; } }