`
jiaguwen123
  • 浏览: 413272 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

stax 介绍

    博客分类:
  • XML
阅读更多

目前,主流的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-with-stax2-1.3.0.jar包

    **StaxMate介绍** StaxMate是基于STAX的一个增强工具,它为STAX提供了一些额外的功能和便利。StaxMate的核心概念是“节点”,这些节点代表XML文档中的各个部分,如元素、属性、文本等。通过这些节点,开发者可以更...

    java xml 4 种 解析xml 方法 sax jdom dom stAX

    下面将详细介绍这四种解析XML的方法。 1. SAX(Simple API for XML) SAX是一种事件驱动的解析器,它不会一次性加载整个XML文档到内存中,而是逐行读取,当遇到文档中的元素、属性等时,会触发相应的事件处理器方法...

    Automation with STAF/STAX 3

    STAF 3.1.0版本是本介绍关注的重点。 STAF的用户社区非常活跃,包括全球超过170个IBM团队、120多家外部公司,自2001年以来下载量超过80,000次,它在SourceForge.net上一直名列前茅。STAF采用Common Public License...

    STAX user guide

    - **软件要求**:STAX用户指南中会详细介绍运行STAX服务所需的软件环境。 - **硬件要求**:也会列出运行STAX服务所需的最低硬件配置。 #### 安装与配置 - **STAX服务机器**:安装STAX服务的具体步骤,包括环境准备...

    Java下3中XML解析 DOM方式、SAX方式和StAX方式

    下面将详细介绍这三种解析方式,并对比它们的优缺点。 1. DOM(Document Object Model)方式: DOM解析器将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。每个XML元素、属性、文本节点等都有相应的对象...

    DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式

    下面将详细介绍这些解析器的工作原理以及它们在生成XML并返回XML字符串形式时的应用。 1. DOM (Document Object Model) DOM是一种基于树形结构的XML解析模型,它将整个XML文档加载到内存中,形成一个完整的文档对象...

    简单java读取xml示例

    本示例将介绍如何使用StAX进行XML读取,这对于初学者来说是一个很好的起点。本文将深入讲解StAX的基本概念、工作原理以及如何在Java中实现XML的读取。 1. **StAX概述** StAX(Streaming API for XML)是一种基于...

    多种xml解析技术详细介绍

    本文将详细介绍几种流行的XML解析技术,包括DOM、SAX、StAX以及基于Java的DOM4J和JDOM等,并对其优缺点进行细致分析。 #### DOM(Document Object Model) DOM是一种将XML文档转换成树形结构的标准模型,通过这种...

    java解析xml的四种经典方法

    每种方法都有其独特的特性和适用场景,下面将详细介绍这四种方法。 1. DOM(Document Object Model)解析: DOM是W3C制定的一种标准,它将XML文档转化为一个对象树,允许开发者通过遍历树形结构来访问和修改XML文档...

    解析xml方法以及详细的介绍

    ### 解析XML方法及其详细介绍 XML(Extensible Markup Language,可扩展标记语言)是由W3C(World Wide Web Consortium)定义的一种元语言,用于描述结构化数据,它以纯文本形式编码,与编程语言、操作系统或传输...

    Java中四种XML解析技术.doc

    以下是对这四种技术的详细介绍: 1. DOM解析: DOM解析器,如JAXP中的Crimson,将整个XML文档加载到内存中形成一个树形结构,方便开发者通过API遍历和操作XML文档的各个部分。DOM解析的优势在于它提供了一个完整的...

    java任务调度框架测试例子1.8jar版本

    使用Quartz1.8版本,做的任务调度的测试demo,其中该博客中也有相应的介绍,版本不同,操作的类具体的实现不同,但是思路是大体相同的。 另外,为了做比较,另一个资源中,还会有2.0版本的demo。

Global site tag (gtag.js) - Google Analytics