Java操作XML文件

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还有许多其它的功能,有待于研究。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值