目前,主流的XML解析API有SAX和DOM。SAX是基于事件的XML解析API,每次解析时都会从头到尾读取整个文档,然后在解析过程中触发一些事件并调用相应的回调方法进行处理。而DOM是基于树状模型的XML解析API,只需一次读取文档并解析生成文档的树状模型存放在内存里,以后可以对树模型中的节点进行随机访问。
SAX对于只要解析一次的XML文档显得很高效,且节省存储空间,但是如果要对文档的节点进行随机访问时,则会很低效,需要每次对文档进行一次解析。 DOM对文档的节点进行随机访问很方便,但是因为需要把整个文档的树状模型存放在内存里,所以对内存要求较高,不适用于存储受限的场合(如嵌入式设备)。另外,SAX是一种push式的XML解析API,它从XML文档中读到数据,然后将这些数据push给用户程序。
除了SAX和DOM以外,最近又涌现出了一种新的XML解析API,StAX(the Streaming API for XML),它是一种新一代的pull式的XML解析API。StAX与SAX类似的地方是它也是从头到尾读取整个文档并进行解析,但是不同的是StAX读取文档的方式是每次只读取一部分,等用户程序要求时才读取下一部分,文档的读取过程是用户程序可以控制的,所以是一种pull的方式。
下面是一段例程,通过例程我们就可以更好地理解StAX的工作方式了。这段例程用于解析一段XHTML并把其中的各级标题(h1、h2、h3……)的内容给解析出来。
import javax.xml.stream.*;
import java.net.URL;
import java.io.*;
public class XHTMLOutliner {
public static void main(String[] args) {
if (args.length == 0) {
System.err.println("Usage: java XHTMLOutliner url" );
return;
}
String input = args[0];
try {
URL u = new URL(input);
InputStream in = u.openStream();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(in);
int inHeader = 0;
for (int event = parser.next();
event != XMLStreamConstants.END_DOCUMENT;
event = parser.next()) {
switch (event) {
case XMLStreamConstants.START_ELEMENT:
if (isHeader(parser.getLocalName())) {
inHeader++;
}
break;
case XMLStreamConstants.END_ELEMENT:
if (isHeader(parser.getLocalName())) {
inHeader--;
if (inHeader == 0) System.out.println();
}
break;
case XMLStreamConstants.CHARACTERS:
if (inHeader > 0) System.out.print(parser.getText());
break;
case XMLStreamConstants.CDATA:
if (inHeader > 0) System.out.print(parser.getText());
break;
} // end switch
} // end while
parser.close();
}
catch (XMLStreamException ex) {
System.out.println(ex);
}
catch (IOException ex) {
System.out.println("IOException while parsing " + input);
}
}
/**
* Determine if this is an XHTML heading element or not
* @param name tag name
* @return boolean true if this is h1, h2, h3, h4, h5, or h6;
* false otherwise
*/
private static boolean isHeader(String name) {
if (name.equals("h1")) return true;
if (name.equals("h2")) return true;
if (name.equals("h3")) return true;
if (name.equals("h4")) return true;
if (name.equals("h5")) return true;
if (name.equals("h6")) return true;
return false;
}
}
由此可见,StAX的工作方式和iterator模式很相似,用户程序主动调用next方法读入一段数据,用户程序判断这段数据是属于哪种类型(START_DOCUMENT、END_DOCUMENT、START_ELEMENT、END_ELEMENT、CDATA和CHARACTERS 等)的,然后相应的做出处理。
如果用户希望检查XML文档的合法性,可以设置工厂的javax.xml.stream.isValidating属性为真,这样得到的XMLStreamReader 对象在读取XML文档时就会验证其合法性。
factory.setProperty("javax.xml.stream.isValidating", Boolean.TRUE);
但是,StAX解析发现文档非法时并不会抛出异常,而是通过一个XMLReporter接口来报告这种错误。下面这段代码就是常见了一个匿名类的实例,并将其注册作为StAX报告错误的接口。
factory.setXMLReporter(new XMLReporter() {
public void report(String message, String errorType,
Object relatedInformation, Location location) {
System.err.println("Problem in " + location.getLocationURI());
System.err.println("at line " + location.getLineNumber()
+ ", column " + location.getColumnNumber());
System.err.println(message);
}
});
StAX提供了一个特殊的方法require来测试当前文档读取的位置是否满足要求。例如下面这段代码就是要求当前文档读取的位置是一个head开始标记。这个方法很像assert,如果满足条件程序就能继续下去,否则,抛出XMLStreamException,程序将无法继续下去。
parser.require(XMLStreamConstants.START_ELEMENT,
"http://www.w3.org/1999/xhtml",
"head");
StAX还可以生成并输出XML文档。下面是一个例程向data.xml文件中输出一个简单的XML文档。
OutputStream out = new FileOutputStream("data.xml");
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(out);
writer.writeStartDocument("ISO-8859-1", "1.0");
writer.writeStartElement("greeting");
writer.writeAttribute("id", "g1");
writer.writeCharacters("Hello StAX");
writer.writeEndDocument();
writer.flush();
writer.close();
out.close();
stax源码下载
http://stax.codehaus.org/Download
分享到:
相关推荐
**StaxMate介绍** StaxMate是基于STAX的一个增强工具,它为STAX提供了一些额外的功能和便利。StaxMate的核心概念是“节点”,这些节点代表XML文档中的各个部分,如元素、属性、文本等。通过这些节点,开发者可以更...
Java提供了多种解析XML的技术,包括DOM(Document Object Model)、SAX(Simple API for XML)以及本文将详细介绍的StAX(Streaming API for XML)。StAX是一种基于事件驱动的API,适用于大量或流式XML数据的处理。 ...
下面将详细介绍这四种解析XML的方法。 1. SAX(Simple API for XML) SAX是一种事件驱动的解析器,它不会一次性加载整个XML文档到内存中,而是逐行读取,当遇到文档中的元素、属性等时,会触发相应的事件处理器方法...
STAF 3.1.0版本是本介绍关注的重点。 STAF的用户社区非常活跃,包括全球超过170个IBM团队、120多家外部公司,自2001年以来下载量超过80,000次,它在SourceForge.net上一直名列前茅。STAF采用Common Public License...
- **软件要求**:STAX用户指南中会详细介绍运行STAX服务所需的软件环境。 - **硬件要求**:也会列出运行STAX服务所需的最低硬件配置。 #### 安装与配置 - **STAX服务机器**:安装STAX服务的具体步骤,包括环境准备...
下面将详细介绍这三种解析方式,并对比它们的优缺点。 1. DOM(Document Object Model)方式: DOM解析器将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。每个XML元素、属性、文本节点等都有相应的对象...
下面将详细介绍这些解析器的工作原理以及它们在生成XML并返回XML字符串形式时的应用。 1. DOM (Document Object Model) DOM是一种基于树形结构的XML解析模型,它将整个XML文档加载到内存中,形成一个完整的文档对象...
本示例将介绍如何使用StAX进行XML读取,这对于初学者来说是一个很好的起点。本文将深入讲解StAX的基本概念、工作原理以及如何在Java中实现XML的读取。 1. **StAX概述** StAX(Streaming API for XML)是一种基于...
本文将详细介绍几种流行的XML解析技术,包括DOM、SAX、StAX以及基于Java的DOM4J和JDOM等,并对其优缺点进行细致分析。 #### DOM(Document Object Model) DOM是一种将XML文档转换成树形结构的标准模型,通过这种...
每种方法都有其独特的特性和适用场景,下面将详细介绍这四种方法。 1. DOM(Document Object Model)解析: DOM是W3C制定的一种标准,它将XML文档转化为一个对象树,允许开发者通过遍历树形结构来访问和修改XML文档...
### 解析XML方法及其详细介绍 XML(Extensible Markup Language,可扩展标记语言)是由W3C(World Wide Web Consortium)定义的一种元语言,用于描述结构化数据,它以纯文本形式编码,与编程语言、操作系统或传输...
以下是对这四种技术的详细介绍: 1. DOM解析: DOM解析器,如JAXP中的Crimson,将整个XML文档加载到内存中形成一个树形结构,方便开发者通过API遍历和操作XML文档的各个部分。DOM解析的优势在于它提供了一个完整的...
使用Quartz1.8版本,做的任务调度的测试demo,其中该博客中也有相应的介绍,版本不同,操作的类具体的实现不同,但是思路是大体相同的。 另外,为了做比较,另一个资源中,还会有2.0版本的demo。