Java操作XML文件常用的有四种方式:Dom,JDom,Sax以及Dom4j。
Dom解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
JDom是基于树的处理XML的Java API,把树加载在内存中,不能处理大于内存的文档。针对实例文档不提供DTD与模式的任何实际模型。
Sax中,当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少。
DOM4J 性能优异、功能强大、极易使用,JVM中解析XML的操作也是以此为基础的。
本文以Dom4j为例介绍如何操作Xml文件。要使用Dom4j,请先去网上下载一个Dom4j的jar包。示例代码如下所示:
package com.test.xml;
import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.List;
import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;
public class Dom4jDemo implements XmlDocument {
public void createXml(String fileName) { //创建文档对象 Document document = DocumentHelper.createDocument(); //添加元素,第一个元素为根元素 Element employees = document.addElement("employees"); //在根元素下添加其它元素 Element employee = employees.addElement("employee"); //为元素添加数据(第一个参数为属性名称,第二个参数为属性值) employee.addAttribute("dept", "sale"); Element name = employee.addElement("name"); //设置该元素的文本值 name.setText("andrew"); Element sex = employee.addElement("sex"); sex.setText("m"); Element age = employee.addElement("age"); age.setText("29"); try { //创建写XML文档的Writer对象 Writer fileWriter = new FileWriter(fileName); //创建美化文档的format对象,如果没有这个对象,生成的XML文档的元素不会换行,不太美观 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter xmlWriter = new XMLWriter(fileWriter, format); xmlWriter.write(document); xmlWriter.close(); } catch (IOException e) { e.printStackTrace(); } }
public void parserXml(String fileName) { File inputXml = new File(fileName); SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read(inputXml); //获取文档的根元素 Element employees = document.getRootElement(); parseElement(employees); } catch (DocumentException e) { System.out.println(e.getMessage()); } System.out.println("dom4j parserXml"); } @SuppressWarnings("unchecked") private void parseElement(Element element) { System.out.println("元素名:" + element.getName()); //获得该元素的所有属性 List attributes = element.attributes(); for (int i = 0; i < attributes.size(); i++) { Attribute arrribute = (Attribute)attributes.get(i); //获得属性名 String name = arrribute.getName(); //获得属性值 String value = arrribute.getValue(); System.out.println("属性" + name + "的值:" + value); } //获得元素的文本的值,并且去掉空格 String text = element.getTextTrim(); if (text != null && text.length() > 0) { System.out.println("元素的文本值:" + text); } //获得元素下的所有子元素,递归调用以获取子元素下的属性及元素信息 List childElements = element.elements(); for (int i = 0; i < childElements.size(); i++) { Element childElement = (Element)childElements.get(i); parseElement(childElement); } } public static void main(String[] args) { Dom4jDemo demo = new Dom4jDemo(); String fileName1 = Dom4jDemo.class.getResource("example.xml").getPath(); demo.parserXml(fileName1); String fileName2 = Dom4jDemo.class.getResource("").getPath() + "example3.xml"; demo.createXml(fileName2); }
}
示例程序中解析的example.xml文件的内容如下所示:
andrew M 30
示例程序中创建的example3.xml文件的内容如下所示:
andrew m 29
这里的代码仅仅示范了一下用Dom4j解析和创建XML文档的基本功能,Dom4j还有许多其它的功能,有待于研究。