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文件的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee id="F2300982" groupName="Theam1">
<name oldName="zhangliang">andrew</name>
<sex>M</sex>
<age>30</age>
</employee>
</employees>
示例程序中创建的example3.xml文件的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee dept="sale">
<name>andrew</name>
<sex>m</sex>
<age>29</age>
</employee>
</employees>
这里的代码仅仅示范了一下用Dom4j解析和创建XML文档的基本功能,Dom4j还有许多其它的功能,有待于研究。