有用的Java工具—XML解析工具StAx

StAX
在千禧年左右,当 XML 第一次出现在很多 Java 开发人员面前时,有两种基本的解析 XML 文件的方法。SAX 解析器实际是由程序员对事件调用一系列回调方法的大型状态机。DOM 解析器将整个 XML 文档加入内存,并切割成离散的对象,它们连接在一起形成一个树。该树描述了文档的整个 XML Infoset 表示法。这两个解析器都有缺点:SAX 太低级,无法使用,DOM 代价太大,尤其对于大的 XML 文件 — 整个树成了一个庞然大物。

幸运的是,Java 开发人员找到第三种方法来解析 XML 文件,通过对文档建模成 “节点”,它们可以从文档流中一次取出一个,检查,然后处理或丢弃。这些 “节点” 的 “流” 提供了 SAX 和 DOM 的中间地带,名为 “Streaming API for XML”,或者叫做StAX。(此缩写用于区分新的 API 与原来的 SAX 解析器,它与此同名。)StAX 解析器后来包装到了 JDK 中,在 javax.xml.stream 包。

使用 StAX 相当简单:实例化 XMLEventReader,将它指向一个格式良好的 XML 文件,然后一次 “拉出” 一个节点(通常用 while 循环),查看。例如,在清单 1 中,列举出了 Ant 构造脚本中的所有目标:

只是让 StAX 指向目标
import java.io.*;
import javax.xml.namespace.QName;
import javax.xml.stream.*;
import javax.xml.stream.events.*;

public class Targets {
	public void getTag(String[] args) throws Exception {
		for (String arg : args) {
			XMLEventReader xsr = XMLInputFactory.newInstance()
					.createXMLEventReader(new FileReader(arg));
			while (xsr.hasNext()) {
				XMLEvent evt = xsr.nextEvent();
				switch (evt.getEventType()) {
				case XMLEvent.START_ELEMENT: {
					StartElement se = evt.asStartElement();
					if (se.getName().getLocalPart().equals("cell")) {
						Attribute targetName = se.getAttributeByName(new QName("desc")); // Found a target!
						System.out.println(targetName.getValue());
					}
					break;
				} // Ignore everything else
				}
			}
		}
	}
	
	public static void main(String[] args) throws Exception {
		Targets t = new Targets();
		String[] xml = {"src/TestA.xml","src/TestB.xml"};
		t.getTag(xml);
	}
}

StAX 解析器不会替换所有的 SAX 和 DOM 代码。但肯定会让某些任务容易些。尤其对完成不需要知道 XML 文档整个树结构的任务相当方便。

请注意,如果事件对象级别太高,无法使用,StAX 也有一个低级 API 在 XMLStreamReader 中。尽管也许没有阅读器有用,StAX 还有一个 XMLEventWriter,同样,还有一个 XMLStreamWriter 类用于 XML 输出。

--------------------------------------------
摘自 http://developer.51cto.com/art/201010/230491.htm
代码经过自己修改过,具有通用性。XML示例文件见附件。

你可能感兴趣的:(java,jdk,xml,ant,脚本)