java6.0新特性<五>

0.引言

本篇接上篇 java 6.0 新特性<四>

1.XML的流API

1.1简介

XML的流API,简称Stax,也就是读写XML文档的API。既然已经有了SAX(解析XML的简单API)和DOM(文档对象模型),我们为什么还要SAX呢?SAX和DOM都有它们自己的优点和缺点,Stax,从一定程度上,是为了解决SAX和DOM中的缺点而生的,不是说Stax的出现是为了代替SAX和DOM。

SAX基于推送-解析模型,提供了事件驱动的XML解析。推送-解析模型,就是说应用程序需要把监听器注册到解析器,然后,通过回调方法得到结果,所以SAX是推送-解析模型,而Stax是拉取-解析模型,也就是说应用程序通过从解析器拉取事件来控制整个XML解析的过程。

DOM的缺点是,解析的时候,它会把整个XML文件放在内存中,如果这个XML很大,这样会出现内存不足等问题,Stax不是遵从这个模型,同时,它还有选项,用来控制在读取文档的时候,跳过大文档的一部分。

Stax的核心API归纳为两部分:

  • 1.光标 API
  • 2.事件遍历API

应用程序可以使用这两个API的任意一个来解析XML文档,下面的章节就让我们来看看这些API的具体细节:

1.2 光标API

光标API用来遍历XML文档,可以把光标想象成指向XML文档开始节点的一个指针,然后,从前向后遍历文档。光标API的工作模型很简单,当一个给定的XML文档需要解析的时候,解析器开始读XML文档,如果发现任何的节点(开始元素、属性、文本、结束元素等),它就停止,然后,如果需要的话,获取此节点的信息到应用程序。这个光标是向前光标,也就是说,它不能回退,在光标API下,读和写的操作都可以进行的。

1.3 简单示例

下面是一个在光标API的帮助下,读取XML文档的示例:

myCalendar.xml

With my ManagerAt the Conference HallJune 09 200710.30AMFor my Girl Friend01 December

ReadingUsingCursorApi.java

package net.javabeat.articles.java6.newfeatures.stax; 
import java.io.*;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
 
public class ReadingUsingCurorApi {
 
    private XMLInputFactory inputFactory = null;
    private XMLStreamReader xmlReader = null;
 
    public ReadingUsingCurorApi() {
        inputFactory = XMLInputFactory.newInstance();
    }
 
    public void read() throws Exception{ 
        xmlReader = inputFactory.createXMLStreamReader(new FileReader(".\\src\\myCalendar.xml"));
 
        while (xmlReader.hasNext()){ 
            Integer eventType = xmlReader.next();
            if (eventType.equals(XMLEvent.START_ELEMENT)){
                System.out.print(" " + xmlReader.getName() + " ");
            }else if (eventType.equals(XMLEvent.CHARACTERS)){
                System.out.print(" " + xmlReader.getText() + " ");
            }else if (eventType.equals(XMLEvent.ATTRIBUTE)){
                System.out.print(" " + xmlReader.getName() + " ");
            }else if (eventType.equals(XMLEvent.END_ELEMENT)){
                System.out.print(" " + xmlReader.getName() + " ");
            }
        }
        xmlReader.close();
    }
 
    public static void main(String args[]){
        try{
            ReadingUsingCurorApi obj = new ReadingUsingCurorApi();
            obj.read();
        }catch(Exception exception){
            exception.printStackTrace();
        }
    }
}

XMLInputFactory是一个用来创建XMLStreamReader输入流的工厂类,通过XMLInputFactory.createXMLStreamReader()方法创建XMLStreamReader实例,在创建的时候,需要传入要解析的XML文件,如果调用XMLStreamReader.hasNext()和XMLStreamReader.next()方法,就开始解析XML内容,就这样,整个XML文档就会被遍历,在遍历的过程中,就可以获得所需要的信息。

1.4事件遍历API

事件遍历API的工作模型和光标API没有太大的区别,在遍历整个XML文档的时候,如果发现一个节点,会把这个节点以XML事件的形式返回给正在处理这个XML文档的应用程序,应用程序可以通过查看是否有下一个节点来遍历整个XML文档。事件遍历API是基于光标API实现的。

1.5简单示例

下面是关于事件遍历API的简单实例(XML文件和上个示例的文件相同):

ReadingUsingEventIterator.java

package net.javabeat.articles.java6.newfeatures.stax; 
import java.io.*;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
 
public class ReadingUsingEventIteratorApi {
 
    private XMLInputFactory inputFactory = null;
    private XMLEventReader xmlEventReader = null;
 
    public ReadingUsingEventIteratorApi() {
        inputFactory = XMLInputFactory.newInstance();
    }
 
    public void read() throws Exception{
 
        xmlEventReader = inputFactory.createXMLEventReader(new FileReader(".\\src\\myCalendar.xml"));
 
        while (xmlEventReader.hasNext()){ 
            XMLEvent xmlEvent = xmlEventReader.nextEvent();
            if (xmlEvent.isStartElement()){
                System.out.print(" " + xmlEvent.asStartElement().getName() + " ");
            }else if (xmlEvent.isCharacters()){
                System.out.print(" " + xmlEvent.asCharacters().getData() + " ");
            }else if (xmlEvent.isEndElement()){
                System.out.print(" " + xmlEvent.asEndElement().getName() + " ");
            }
        } 
        xmlEventReader.close();
    }
 
    public static void main(String args[]){
        try{
            ReadingUsingEventIteratorApi obj = new ReadingUsingEventIteratorApi();
            obj.read();
        }catch(Exception exception){
            exception.printStackTrace();
        }
    }
}

这个示例和上个示例不同的地方,就是怎么去获取XML文档的内容,在这里是通过XML事件来获取的。

2.结论

本篇主要是了解一下如果使用Stax中的光标API和事件遍历API来读取XML文档。如果想了解如何XML绑定相关的细节,可以移步这里.

备注:

原文地址:http://www.javabeat.net/2007/06/java-6-0-features-part-2-pluggable-annotation-processing-api/

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>