科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java SE6新特性: XML API 与Web服务3

Java SE6新特性: XML API 与Web服务3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

文章主要介绍 Java SE 6 在 API 库方面的部分新特性,通过一些例子和讲解,帮助开发者在编程实践当中更好的运用 Java SE 6,提高开发效率。

作者:沈羽 来源:IT专家网 2008年5月9日

关键字: API XML Java SE 6 java

  • 评论
  • 分享微博
  • 分享邮件
StAX 框架(Streaming API for XML)

  SAX 框架的缺点是不能记录正在处理元素的上下文。但是优点是运行时占内存空间比较小,效率高。DOM 框架由于在处理 XML 时需要为其构造一棵树,所以特点正好相反。StAX 框架出现于 Java SE 6 中,它的设计目标就是要结合 SAX 框架和 DOM 框架的优点。既要求运行时效率,也要求保持元素的上下文状态。清单 5 是一段使用 StAX 框架处理 XML 文件的代码。

  清单 5. 使用 StAX 框架处理 XML 文件

  

import java.io.*;

import javax.xml.stream.*;
import javax.xml.stream.events.*;

public class StAXTest {

    public static void main(String[] args) {
        XMLInputFactory inputFactory = XMLInputFactory.newInstance();
        InputStream input = new ByteArrayInputStream(
            ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
    "<work-contact-info>" +
"<Location>Shanghai-shuion-333</Location>" +
"<Postal>200020</Postal>" +
"<Tel><fix>63262299</fix><mobile>1581344454</mobile></Tel>" +
"<Appellation>Mr. Wang</Appellation>" +
"</work-contact-info>").getBytes());
        try {
            XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext()) {
                XMLEvent event = xmlEventReader.nextEvent();

                if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
                    System.out.println(startElement.getName().toString());
                }

                if (event.isCharacters()) {
                    Characters text = event.asCharacters();
                    if (!text.isWhiteSpace()) {
                        System.out.println("\t" + text.getData());
                    }
                }
            }
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }
}

  观察后可以发现 StAX 框架和 SAX 框架具有相似的地方。StAX 有 Event.isStartElement 方法,SAX 有 DefaultHandler.startElement 方法。StAX 有 Event.isCharacter 方法,SAX 有 DefaultHandler.character 方法。实际上这两个框架处理 XML 文件的时候使用了相似的模型——将 XML 文件作为元素组成的流,而不同于 DOM 的树模型。解析 XML 文件时,应用程序调用 XMLEventReader 的 nextEvent 方法解析下一个元素(或者是解析同一个元素,根据解析的不同阶段,产生不同元素),StAX 就会通过 XMLEventReader 产生一个事件。比如针对同一个元素,可能会产生 StartElement 和 EndElement 事件。形象的说 XMLEventReader 就像是一根绳子,拽一下,解析一个元素,产生一个事件。于是这种技术也被称为”Pull Parser”技术。StAX 在处理 XML 文件时,产生的所有事件是通过一个 Iterator(XMLEventReader 继承了 Iterator)返回的。应用程序通过这个 Iterator 能知道某个解析事件的前后分别是什么。这类信息就是一个元素的上下文信息。

XSLT 数据转换框架(The Extensible Stylesheet Language Transformations APIs)

  一般来说 XML 文件格式被认为是一种很好的数据交换格式。于是 Java SE 6 SDK 基于以上介绍的三种 XML 处理机制,提供了一个 XML 转换框架。XSLT 框架负责进行转换 —— 包括将 XML 文件转换成其他形式如 HTML,和将其他形式的文件转换成 XML 文件。更进一步说,这个框架可以接受 DOM 作为其输入和输出;可以接受 SAX 解析器作为输入或者产生 SAX 事件作为输出;可以接受 I/O Stream 作为输入和输出;当然也支持用户自定义形式的输入和输出。图 5 显示了这种依赖关系:

  图 5. XSLT 框架的依赖关系

  图 5. XSLT 框架的依赖关系

  转换框架的输入输出对象的类型并不要求是一一对应的。比如,使用 DOMSource 做为输入,可以使用 StreamResult 作为输出。清单 5 是一段伪代码,用来显示 JDK 将不同 javax.xml.transform.Source 转换成不同 javax.xml.transform.Result 子类型的过程:

  清单 5. JDK 转换框架的转换过程

 

// Construct input
1. factory = XMLParserDocumentFactory->NEW
2. parser = factory->NewParser
3. document = parser->Parse(File)

// Wrap input/output
4. source = Source->NEW( document )
5. sink = Result->NEW

// Construct transformer
6. tFactory = TransformerFactory->NEW
7. transformer = tFactory->NewTransformer

// Transform
8. transformer->Transfer( source, sink)

  通过这个过程的转化,一个 javax.xml.transform.Source 可以转化成为类型 javax.xml.transform.Result。JDK 提供了如 图 5 所示的 4 种 Result 子类型,用户也可以定义自己的 Result 类型。另一方面,用户自定义的数据解析器或者数据文件,也可以作为 Transformer 的输入。下面一个例子,针对一个数据文件,首先生成了一棵 DOM 树,然后又根据这棵 DOM 树,提取了所有的联系信息,生成了一个文本文件。清单 6 给出了这个数据文件:

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章