`
jiaguwen123
  • 浏览: 405374 次
  • 性别: 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

分享到:
评论

相关推荐

    使用STAF/STAX实现测试自动化和持续集成

    本文简要地介绍STAF/STAX测试自动化框架,并且展示如何使用它来构建一个框架,在复杂试验台中实现测试自动化和持续集成。回归测试往往用于确保软件变更不会在软件中引入新的问题或故障。另外,还可以用它来确保您...

    用STAF/STAX+LAMP实现多任务的自动化测试框架

    本文内容包括:前言功能特性体系结构拓扑结构设计实现配置使用总结参考文献本文介绍了一种基于LAMP+STAF/STAX的自动化测试框架,以及该框架在WVS(WebSphereVoiceServer)产品测试中的应用。该框架具有界面友好,操作...

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

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

    JAVA6新特性介绍

    JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML...另外,JAXB在底层是用STAX(JSR173)来处理XML文档。

    JAVA6新特性介绍.zip

    jdk1.6新特性 ...3.StAX 4.使用Compiler API 5.轻量级Http Server API 6.插入式注解处理API(Pluggable Annotation Processing API) 7.用Console开发控制台程序 8.对脚本语言的支持 9.Common Annotations

    JAVA与XML.rar

    第三版还彻底重写了有关网络技术的章节,与原先的内容相比,这一部分针对目前引起广泛关注的技术热点进行介绍,例如使用RSS进行内容同步和开发Web 2.0的应用程序。 您将学习到如何为同步的内容创建、读取或者修改RSS...

    Java and XML, 3rd Edition

    第三版还彻底重写了有关网络技术的章节,与原先的内容相比,这一部分针对目前引起广泛关注的技术热点进行介绍,例如使用RSS进行内容同步和开发Web 2.0的应用程序。 您将学习到如何为同步的内容创建、读取或者修改RSS...

    jackson-jar

    本文将概括介绍Jackson的主要功能和相关功能的使用示例。 2. 使用方式 Jackson提供三种可选的json处理方式: 1) Streaming API 又称Incremental parsing/generation, 受StAX API启发,以非关联递增方式读写...

    XFire开发指南,很详细的书

    XFire是下一代的java SOAP框架。XFire提供了非常方便的API,使用这些API可以开发面向服务(SOA)的程序。它支持各种标准,性能优良(基于低内存的STAX模型),该书详细介绍了Xfire开发过程。

    Android读写XML.docx

    首先介绍下Android SDK与Java SDK在读写XML文件方面,数据包之间的关系。Android 平台最大的一个优势在于它利用了 Java 编程语言。Android SDK 并未向标准 Java Runtime Environment (JRE) 提供一切可用功能,但它...

    Java核心技术II(第8版)

    4.11 LDAP介绍 4.11.1 配置LDAP服务器 4.11.2 访问LDAP目录信息 第五章 国际化 5.1 Locales 5.2 数字格式 5.2.1 货币 5.3 日期和时间 5.4 排序 5.4.1 排序强度 5.4.2 分解 10.5 消息格式化 10.5.1 选择格式 10.6 ...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

Global site tag (gtag.js) - Google Analytics