技术中心

这里象征着我们的态度和能力

>Java的xml解析器
发布者:中国IT实验室    信息来源:中国IT实验室    发布时间:2012-01-09      浏览次数:5587
分享到:

新浪微博

腾讯微博

QQ空间

豆瓣网

QQ好友

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

    在JDK 6.0中基于StAX分析XML数据
   
    J2EE/XML 开发者通常都是使用文档对象模型(DOM)API或简单的API for XML(SAX) API来分析XML文档。然而,这些API都有其缺点。其中,DOM API的缺点之一是消耗大量的内存,因为在该XML文档可以被导航之前,必须创建一个完整的XML文档的内存结构。而SAX API的缺点在于,它实例了一种推分析模型API,其中分析事件是由分析器生成的。比较之下,StAX则是基于一种拉分析模型。在本文中,你将首先创建你 自己的XML文档,然后学习使用各种不同方法来对之进行分析;最后,我们使用事件生成的StAX拉方法。
   
    一、 推分析之于拉分析
   
    比较于推分析,拉分析具有如下一些优点:
   
    1. 在拉分析中,事件是由分析应用程序生成的,因此把分析规则提供到客户端而不是分析器。
   
    2. 拉分析的代码更简单并且它比推分析有更少的库。
   
    3. 拉分析客户端能同时读多个XML文档。
   
    4. 拉分析允许你过滤XML文档并且跳过分析事件。
   
    二、 了解StAX
   
    针对于XML的流式API(StAX),是在2004年3月的JSR 173规范中引入,这是一种针对XML的流式拉分析API.StAX是JDK 6.0提供的一种新特征,你可以从此处下载它的测试版本试用。
   
    一个推模型分析器不断地生成事件,直到XML文档被完全分析结束。但是,拉分析由应用程序进行调整;因此,分析事件是由应用程序生成的。这意味着,使用 StaX,你可以推迟分析-在分析时跳过元素并且分析多个文档。在使用DOM API的时候,你必须把整个的XML文档分析成一棵DOM结构,这样也就降低了分析效率。而借助于StAX,在分析XML文档时生成分析事件。有关于 StAX分析器与其它分析器的比较在此不多介绍。
   
    StAX API的实现是使用了Java Web服务开发(JWSDP)1.6,并结合了Sun Java流式XML分析器(SJSXP)-它位于javax.xml.stream包中。XMLStreamReader接口用于分析一个XML文档,而 XMLStreamWriter接口用于生成一个XML文档。XMLEventReader负责使用一个对象事件迭代子分析XML事件-这与 XMLStreamReader所使用的光标机制形成对照。本教程将基于JDK 6.0中的StAX实现来完成对一个XML文档的分析。
   
    其实,StaX仅仅是JDK 6.0所提供的XML新特征之一。新的JDK 6.0还提供了对针对于XML-Web服务的Java架构(JAX-WS)2.0,针对于XML绑定的Java API(JAXB) 2.0,XML数字签名API的支持,甚至还支持SQL:2003 XML数据类型。
   
    三、 初步安装
   
    如果你正在使用JDK 6.0,那么默认情况下,StAX API位于Classpath中。如果你在使用JWSDP 1.6,请把JWSDP 1.6 StAX API添加到classpath中。这需要把sjsxplib jsr173_api.jar和sjsxplibsjsxp.jar添加到CLASSPATH变量中。在目录下安装JWSDP 1.6.Jsr173_api.jar相应于JSR-173 API JAR,Sjsxp.jar相应于SJXSP实现JAR.
   
    四、 使用XMLStreamWriter进行写操作
   
    首先,你要创建将待分析的XML文档。由StAX的XMLStreamWriter生成XML.然而,XMLStreamWriter的一个限制是,它 不一定会生成良构的文档-而且生成的文档也不一定是有效的。你需要确保生成的XML文档是良构的。列表1是一个由XMLStreamWriter生成的原 始XML文档的示例。
   
    在此,你试图使用XMLStreamWriter API生成列表1中的catalog.xml.在本节中的代码片断节选自XMLWriter.java应用程序,显示于列表2中。首先,你将导入StAX包类,请参考下列编码:
   
    import javax.xml.stream.*;
   
    import javax.xml.stream.events.*;
   
    import javax.xml.stream.XMLOutputFactory;
   
    你要从一个XMLOutputFactory中得到你的XMLStreamWriter.因此,首先你必须创建一个新的XMLOutputFactory:
   
    XMLOutputFactory outputFactory=XMLOutputFactory.newInstance();
   
    接下来,创建一个FileWriter以输出XML文档-它将被生成到一个XML文件中:
   
    FileWriter output=new FileWriter(new File("C:/STAX/catalog.xml"));
   
    接下来,创建一个XMLStreamWriter:
   
    XMLStreamWriter XMLStreamWriterr=outputFactory.createXMLStreamWriter(output);
   
    现在,使用writeStartDocument()方法创建一个文档开头。添加要在XML声明中指定的编码和版本(记住,指定的编码并不是生成的 XML文档的编码)。如果你需要指定XML文档的编码,该怎么办呢?当从一个XMLOutputFactory对象创建一个 XMLStreamWriter对象时,你会这样做:
   
    XMLStreamWriter.writeStartDocument("UTF-8","1.0");
   
    使用writeComment()方法以输出一个注释:
   
    XMLStreamWriter.writeComment("A OReilly Journal Catalog");
   
    使用writeProcessingInstruction()方法以输出一条处理指令:
   
    XMLStreamWriter.writeProcessingInstruction("catalog","journal=OReilly");
   
    使用writeStartElement()方法以输出catalog元素的开始(元素前缀和命名空间URI也可以在这个方法中指定的):
   
    XMLStreamWriter.writeStartElement("journal","catalog","http://OnJava.com/Journal");
   
    使用writeNamespace()方法以添加journal命名空间声明(命名空间前缀和命名空间URI也是在这个方法中指定的):
   
    XMLStreamWriter.writeNamespace("journal","http://OnJava.com/Journal");
   
    再次使用writeNamespace()方法添加xsi命名空间:
   
    XMLStreamWriter.writeNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
   
    使用writeAttribute()方法添加xsi:namespaceSchemaLocation属性:
   
    XMLStreamWriter.writeAttribute("xsi:noNamespaceSchemaLocation","file://c:/Schemas/catalog.xsd");
   
    使用writeAttribute()方法添加publisher属性:
   
    XMLStreamWriter.writeAttribute("publisher","OReilly");
   
    输出journal元素的开始。当增加一个新元素时,前一个元素的>括号也被添加上:
   
    XMLStreamWriter.writeStartElement("journal","journal","http:
   
    //OnJava.com/Journal");
   
    使用writeAttribute()方法以添加date和title属性。然后,使用writeElement()方法以添加article和title元素。然后,使用writeCharacters()方法输出title元素的文本:
   
    XMLStreamWriter.writeCharacters("Data Binding with XMLBeans");
   
    任何包含文本或子元素的元素都要有一个结束标签。使用writeEndElement()元素来添加title元素的结束标签:
   
    XMLStreamWriter.writeEndElement();
   
    添加author元素和journal元素的结束标签。在writeEndElement()方法中,不必要指定元素前缀和命名空间URI.以类似方式添加另一个journal元素。然后,添加catalog元素的结束标签。最后,输出缓冲的数据:
   
    XMLStreamWriter.flush();
   
    最后一步,关闭XMLStreamWriter.
   
    XMLStreamWriter.close();
   
    这就是生成catalog.xml的过程。
   
    源码中的列表2展示了完整的Java应用程序-XMLWriter.java.这个应用程序可以作为一个命令行应用程序运行或在一种例如Eclipse这样的IDE中运行。
   
    五、 使用XMLStreamReader进行分析
   
    通过使用XMLStreamReader API分析列表1中的文档,我们来详细分析一下其工作原理。XMLStreamReader使用一种光标分析XML文档。它的接口包含一个next()方 法-由它分析下一个分析事件。getEventType()方法返回事件类型。后面的代码片断来自于XMLParser.java应用程序,详见列表3.
   
    在这个XMLParser.java应用程序中,首先,你要导入StAX类:
   
    import javax.xml.stream.*;
   
    import javax.xml.stream.events.*;
   
    import javax.xml.stream.XMLInputFactory;
   
    然后,创建一个XMLInputFactory,由此你会得到一个XMLStreamReader:
   
    XMLInputFactory inputFactory=XMLInputFactory.newInstance();

[1] [2] 下一页

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730
Baidu
map