




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、StAXThe Streaming API for XML (StAX)王健StAX:This is the homepage for the StAX Reference Implementation (RI). StAX is a standard XML processing API that allows you to stream XML data from and to your application. This StAX implementation is the standard pull parser(拉解析) implementation for JSR-173 spec
2、ification. Features of the Reference Implementation:Small memory footprintImplementation of most core features: non-validating DTD-aware parser and serializerOpen Source (Apache License (AL) 2.0)Features of StAX API:The standard pull parser interface (included in JDK 1.6,(已经包含到jdk1.6里面) downloadable
3、 separately for 1.4, 1.5) StAX 概述 从一开始,Java API for XML Processing (JAXP) 就提供了两种方法来处理 XML:文档对象模型(DOMDocument Object Model文档对象模型)方法是用标准的对象模型表示 XML 文档;Simple API for XML (SAX简单XML访问接口) 方法使用应用程序提供的事件处理程序来处理 XML。JSR-173 提出了一种面向流的新方法:Streaming API for XML (StAX)。其最终版本于 2004 年 3 月发布,并成为了 JAXP 1.4(将包含在即将发布
4、的 Java 6 中)的一部分。 如其名称所暗示的那样,StAX 把重点放在流上。实际上,StAX 与其他方法的区别就在于应用程序能够把 XML 作为一个事件流来处理。将 XML 作为一组事件来处理的想法并不新颖(事实上 SAX 已经提出来了),但不同之处在于 StAX 允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。 基本原理 应用程序首先必须获得一个具体的XMLInputFactory。根据传统的 JAXP 风格,要用到抽象工厂模式;XMLInputFactory类提供了静态的newInstance(或是newFactory)方法,它负责定位和实
5、例化具体的工厂。配置该实例可设置定制或者预先定义好的属性(其名称在类 XMLInputFactory 中定义)。最后,为了使用基于指针的 API,应用程序还要通过调用某个createXMLStreamReader方法获得一个XMLStreamReader。如果要使用基于事件迭代器的 API,应用程序就要调用createXMLEventReader方法获得一个XMLEventReader 为什么使用 StAX? 开始学习一种新的处理 XML 的 API 之前,可能要问是否值得这样做。事实上,StAX 所采用的基于拉的方法和其他方法相比有一些突出的优点。首先,不管使用哪种 API 风格,都是应用程
6、序调用读取器(解析器)而不是相反。通过保留解析过程的控制权,可以简化调用代码来准确地处理它预期的内容。或者发生意外时停止解析。此外,由于该方法不基于处理程序回调,应用程序不需要像使用 SAX 那样模拟解析器的状态。StAX 仍然保留了 SAX 相对于 DOM 的优点。通过把重心从结果对象模型转移到解析流本身,从理论上说应用程序能够处理无限的 XML 流,因为事件固有的临时性,不会在内存中累积起来。对于那些使用 XML 作为消息传递协议而非表示文档内容的那些应用程序尤其重要,比如 Web 服务或即时消息应用程序。比方说,如果只是将其转换成特定于应用程序的对象模型然后就将其丢弃,那么为 Web 服
7、务路由器 servlet 提供一个 DOM 就没有多少用处。使用 StAX 直接转化成应用程序模型效率更高。对于 Extensible Messaging and Presence Protocol(XMPP)客户机,根本不能使用 DOM,因为 XMPP 客户机/服务器流是随着用户输入的消息实时生成。等待流的关闭标签(以便最终建立 DOM)就意味着等待整个会话结束。通过把 XML 作为一系列的事件来处理,应用程序能够以最合适的方式响应每个事件(比如显示收到的即时消息等等)。由于其双向性,StAX 也支持链式处理,特别是在事件层上。接收事件(无论什么来源)的能力被封装在 XMLEventCons
8、umer(XMLEventWriter 的扩展)接口中。因此,可以模块化地编写应用程序从 XMLEventReader(也是一个普通的迭代器,可以按迭代器处理)读取和处理 XML 事件、然后传递给事件消费者(如果需要可以进一步扩展处理链)。在第 2 部分将看到,也可使用应用程序提供的筛选器(实现了 EventFilter 接口的类)来定制 XMLEventReader 或者使用 EventReaderDelegate 修饰已有的 XMLEventReader。总而言之,和 DOM 以及 SAX 相比,StAX 使应用程序更贴近底层的 XML。使用 StAX,应用程序不仅可以建立需要的对象模型(
9、而不需要处理标准 DOM),而且可以随时这样做,而不必等到解析器回调。下一节将深入讨论基于指针的 API 以及如何有效地使用它处理 XML 流。StAX VS SAX:StAX比SAX更加简单易用。StAX可以读写XML文档,而SAX只可以读文档。下图上各种解析方式的对比:快速示例:以下是一段基本的XML文件:快速示例:使用StAX对文进行解析:快速示例:几个关键点:XMLStreamReader.hasNext() 判断是否还有下一个节点,如元素或是文本。Int next = XMLStreamReader.next() 返回一个整数,确定是何种元素。XMLStreamReader.getL
10、ocalName() 返回元素的节点名称。XMLStreamReader.getText() 返回文本。XMLStreamReader.getAttributeValue(nameSpace,attName) 返回属性值。使用XMLStreamReader解析 XML 示例2:使用 StAX 编写 XML 文档/* Rose*/Testpublic void testB() throws Exception XMLOutputFactory factory = XMLOutputFactory.newFactory();XMLStreamWriter writer = factory.createXMLStreamWriter(System.out);writer.writeStartDocument(UTF-8, 1.0);/文档开始writer.writeStartElement(users);/文本的根元素writer.writeStartElement(user);writer.writeAttribu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024湖南潇湘科技技工学校工作人员招聘考试及答案
- 2024湖南建筑高级技工学校工作人员招聘考试及答案
- 星级家政服务人员雇佣合同
- 建筑设备租赁合同范本指南
- 股权转让合同保证金协议
- 企业合同管理效率提升与创新路径
- 网络打假安全课件
- 植物模拟习题(含答案)
- 核心条款集装箱货物运输合作协议
- 工程行业企业文化
- 四年级下英语Unit1PartBLet'slearn
- 水稳基层振动成型法科研路段施工技术
- 陕西省社区社会组织负责人备案表
- 微信生态运营全景解读
- 《陕西省全过程工程咨询服务导则(试行)》
- 辩论理论之需根解损(需要性、根属性、解决力、损益比)
- (完整版)道路交通事故现场图绘制课件
- 现代一体化手术室建设发展现状及展望
- 经纬度数转换工具
- NB_T 10438-2020《风力发电机组 电控偏航控制系统技术条件》_(高清最新)
- 混凝土凝结时间计算及报告(样表)
评论
0/150
提交评论