仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 389|回复: 8
打印 上一主题 下一主题

[学习教程] JAVA网页编程之在JDK 6.0中基于StAX剖析XML数据

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:15:16 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。xml|数据  J2EE/XML开辟者一般都是利用文档对象模子(DOM)API或复杂的APIforXML(SAX)API来剖析XML文档。但是,这些API都有其弱点。个中,DOMAPI的弱点之一是损耗大批的内存,由于在该XML文档能够被导航之前,必需创立一个完全的XML文档的内存布局。而SAXAPI的弱点在于,它实例了一种推剖析模子API,个中剖析事务是由剖析器天生的。对照之下,StAX则是基于一种拉剖析模子。在本文中,你将起首创立你本人的XML文档,然后进修利用各类分歧办法来对之举行剖析;最初,我们利用事务天生的StAX拉办法。

  1、推剖析之于拉剖析

  对照于推剖析,拉剖析具有以下一些长处:

  1.在拉剖析中,事务是由剖析使用程序天生的,因而把剖析划定规矩供应到客户端而不是剖析器。

  2.拉剖析的代码更复杂而且它比推剖析有更少的库。

  3.拉剖析客户端能同时读多个XML文档。

  4.拉剖析同意你过滤XML文档而且跳太过析事务。

  2、懂得StAX

  针关于XML的流式API(StAX),是在2004年3月的JSR173标准中引进,这是一种针对XML的流式拉剖析API。StAX是JDK6.0供应的一种新特性,你能够从此处下载它的测试版本试用。

  一个推模子剖析器不休地天生事务,直到XML文档被完整剖析停止。可是,拉剖析由使用程序举行调剂;因而,剖析事务是由使用程序天生的。这意味着,利用StaX,你能够推延剖析-在剖析时跳过元素而且剖析多个文档。在利用DOMAPI的时分,你必需把全部的XML文档剖析成一棵DOM布局,如许也就下降了剖析效力。而借助于StAX,在剖析XML文档时天生剖析事务。有关于StAX剖析器与别的剖析器的对照在此未几先容。

  StAXAPI的完成是利用了JavaWeb服务开辟(JWSDP)1.6,并分离了SunJava流式XML剖析器(SJSXP)-它位于javax.xml.stream包中。XMLStreamReader接口用于剖析一个XML文档,而XMLStreamWriter接口用于天生一个XML文档。XMLEventReader卖力利用一个对象事务迭代子剖析XML事务-这与XMLStreamReader所利用的光标机制构成对比。本教程将基于JDK6.0中的StAX完成来完成对一个XML文档的剖析。

  实在,StaX仅仅是JDK6.0所供应的XML新特性之一。新的JDK6.0还供应了对针关于XML-Web服务的Java架构(JAX-WS)2.0,针关于XML绑定的JavaAPI(JAXB)2.0,XML数字署名API的撑持,乃至还撑持SQL:2003XML数据范例。

  3、开端安装

  假如你正在利用JDK6.0,那末默许情形下,StAXAPI位于Classpath中。假如你在利用JWSDP1.6,请把JWSDP1.6StAXAPI增加到classpath中。这必要把<jwsdp-1.6>sjsxplibjsr173_api.jar和<jwsdp-1.6>sjsxplibsjsxp.jar增加到CLASSPATH变量中。在<jwsdp-1.6>目次下安装JWSDP1.6。Jsr173_api.jar响应于JSR-173APIJAR,Sjsxp.jar响应于SJXSP完成JAR。
<P>  4、利用XMLStreamWriter举行写操纵

  起首,你要创立将待剖析的XML文档。由StAX的XMLStreamWriter天生XML。但是,XMLStreamWriter的一个限定是,它纷歧定会天生良构的文档-并且天生的文档也纷歧定是无效的。你必要确保天生的XML文档是良构的。列表1是一个由XMLStreamWriter天生的原始XML文档的示例。

  在此,你试图利用XMLStreamWriterAPI天生列表1中的catalog.xml。在本节中的代码片段节选自XMLWriter.java使用程序,显现于列表2中。起首,你将导进StAX包类,请参考以下编码:

importjavax.xml.stream.*;
importjavax.xml.stream.events.*;
importjavax.xml.stream.XMLOutputFactory;
  你要从一个XMLOutputFactory中失掉你的XMLStreamWriter。因而,起首你必需创立一个新的XMLOutputFactory:

XMLOutputFactoryoutputFactory=XMLOutputFactory.newInstance();
  接上去,创立一个FileWriter以输入XML文档-它将被天生到一个XML文件中:

FileWriteroutput=newFileWriter(newFile("C:/STAX/catalog.xml"));
  接上去,创立一个XMLStreamWriter:

XMLStreamWriterXMLStreamWriterr=outputFactory.createXMLStreamWriter(output);
  如今,利用writeStartDocument()办法创立一个文档开首。增加要在XML声明中指定的编码和版本(记着,指定的编码并非天生的XML文档的编码)。假如你必要指定XML文档的编码,该怎样办呢?当从一个XMLOutputFactory对象创立一个XMLStreamWriter对象时,你会如许做:

XMLStreamWriter.writeStartDocument("UTF-8","1.0");
  利用writeComment()办法以输入一个正文:

XMLStreamWriter.writeComment("AOReillyJournalCatalog");
  利用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("DataBindingwithXMLBeans");
  任何包括文本或子元素的元素都要有一个停止标签。利用writeEndElement()元从来增加title元素的停止标签:

XMLStreamWriter.writeEndElement();
  增加author元素和journal元素的停止标签。在writeEndElement()办法中,不用要指定元素前缀和定名空间URI。以相似体例增加另外一个journal元素。然后,增加catalog元素的停止标签。最初,输入缓冲的数据:

XMLStreamWriter.flush();
  最初一步,封闭XMLStreamWriter。

XMLStreamWriter.close();
  这就是天生catalog.xml的历程。

  源码中的列表2展现了完全的Java使用程序-XMLWriter.java。这个使用程序能够作为一个命令行使用程序运转或在一种比方Eclipse如许的IDE中运转。
<P>  5、利用XMLStreamReader举行剖析

  经由过程利用XMLStreamReaderAPI剖析列表1中的文档,我们来具体剖析一下其事情道理。XMLStreamReader利用一种光标剖析XML文档。它的接口包括一个next()办法-由它剖析下一个剖析事务。getEventType()办法前往事务范例。前面的代码片段来自于XMLParser.java使用程序,详见列表3。

  在这个XMLParser.java使用程序中,起首,你要导进StAX类:

importjavax.xml.stream.*;
importjavax.xml.stream.events.*;
importjavax.xml.stream.XMLInputFactory;
  然后,创立一个XMLInputFactory,由此你会失掉一个XMLStreamReader:

XMLInputFactoryinputFactory=XMLInputFactory.newInstance();
  如今,你必要创立一个InputStream,作为一个输出流,它形貌了将被剖析的文件。别的,还要夙昔面创立的XMLInputFactory对象中创立一个XMLStreamReader。

InputStreaminput=newFileInputStream(newFile("C:/STAX/catalog.xml"));
XMLStreamReaderxmlStreamReader=inputFactory.createXMLStreamReader(input);
  假如更多剖析事务可用,hasNext()办法前往true。然后,利用next()办法取得下一个剖析事务:

intevent=xmlStreamReader.next();
  对照于SAX剖析,StAX剖析的长处是,一个剖析事务能够被跳过-经由过程挪用next()办法,详见上面的代码。比方,假如剖析事务范例为ENTITY_DECLARATION,那末开辟者能够决意是要从以后事务中取得事务信息,仍是检索下一个事务:

If(event.getEventType()==XMLStreamConstants.ENTITY_DECLARATION){
intevent=xmlStreamReader.next();
}
  经由过程不挪用next()办法,剖析也能够被推延。next()办法前往int,它代表了一个剖析事务-经由过程利用一个XMLStreamConstants常量指定。

  XMLStreamReader所前往的分歧的事务范例枚举于表格1中。

事务范例形貌START_DOCUMENT一个文档的入手下手START_ELEMENT一个元素的入手下手ATTRIBUTE一个元素属性NAMESPACE一个定名空间声明CHARACTERS字符能够是文本,或是一个空格COMMENT一个正文SPACE可疏忽的空格PROCESSING_INSTRUCTION处置指令DTD一个DTDENTITY_REFERENCE一个实体参考CDATACdata节END_ELEMENT停止元素END_DOCUMENT停止文档ENTITY_DECLARATION一个实体声明NOTATION_DECLARATION一个标记声明
表格1.XMLStreamReader事务

  这些分歧的剖析事务可以使你取得XML文档中的数据和元数据。假如剖析事务范例是START_DOCUMENT,那末你将利用getEncoding()办法取得XML文档中的指定编码,而你将利用getVersion()办法前往XML文档的XML版本。

  一样,假如你在利用一个START_ELEMENT事务范例事情,那末你将利用getPrefix()办法来前往元素前缀而且利用getNamespaceURI来前往元素前缀定名空间或默许定名空间。为了取得元素的当地定名,你将利用getLocalName()办法而且利用getAttributesCount()办法取得属性数量。你将利用getAttributePrefix(i)办法失掉一个指定的属性索引i的属性前缀,而利用getAttributeNamespace(i)办法获得属人命名空间。利用getAttributeLocalName(i)办法取得属性当地定名,利用getAttributeValue(i)办法取得属性值。假如事务范例是CHARACTERS或COMMENT,则利用getText()办法取得响应的文本。

  列表4显现了示例XML文档,catalog.xml,的剖析输入了局。

  列表3显现了用于剖析XML文档的Java使用程序。你能够从命令行上或在一种比方Eclipse如许的IDE中来运转该使用程序。记着:假如你没有起首运转XMLWriter.java使用程序而运转XMLParser.java(见源码中的列表2),那末你必要把catalog.xml(见源码中的列表1)复制到C:/StAX目次下。


<P>  6、利用XMLEventReader举行剖析

  本节将向你展现怎样利用XMLEventReader来剖析catalog.xml。XMLEventReader接口利用一个事务对象迭代算子剖析一个XML文档;经由过程这类体例,一个XML事务天生一个XMLEvent对象。XMLEventReader相似于XMLStreamReader-剖析事务是由StAX剖析器天生的。但是,XMLEventReader比XMLStreamReader有一个长处:经由过程利用XMLEventReader,一个使用程序可使用peek()办法来"偷看"下一个事务,而不用从流中读取事务。如许,一个使用程序客户端能够决意是不是有需要剖析下一个事务。本节中的代码片段节选自XMLEventParser.java使用程序,请拜见列表5。

  起首,导进StAX类:

importjavax.xml.stream.*;
importjavax.xml.stream.events.*;
importjavax.xml.stream.XMLInputFactory;
  接上去,创立一个XMLInputFactory,由它取得一个XMLEventReader对象:

XMLInputFactoryinputFactory=XMLInputFactory.newInstance();
InputStreaminput=newFileInputStream(newFile("C:/STAX/catalog.xml"));
XMLEventReaderxmlEventReader=inputFactory.createXMLEventReader(input);
  在StAX中,XML文档事务是经由过程XMLEvent对象形貌的。利用nextEvent()办法来遍历XMLEventReader对象以取得下一个事务:

XMLEventevent=xmlEventReader.nextEvent();
  利用getEventType()办法来取得事务范例(请参考表格1)。XMLEvent接口还供应布尔办法来取得事务范例。比方,isStartDocument()前往true,假如事务是入手下手文档范例。鄙人列代码中,事务是入手下手元素范例,因而一个StartElement对象能够从这个XMLEvent接口取得:

if(event.isStartElement()){
 StartElementstartElement=event.asStartElement();
}
  利用getAttributes()办法取得元素属性:

Iteratorattributes=startElement.getAttributes();
  这个Iterator形貌了一个javax.xml.stream.events.Attribute对象。利用next()办法遍历该Iterator。

Attributeattribute=(javax.xml.stream.events.Attribute)(attributes.next());
  最初,利用getName()办法取得属人命名,利用getValue()办法取得属性值。

  列表5显现出剖析该XML文档的Java使用程序。使用程序XMLEventReader能够作为一个命令行使用程序运转,或在一种比方Eclipse如许的IDE中运转。记着:假如你运转XMLWriter.java或XMLParser.java使用程序而不起首运转XMLEventParser.java使用程序,那末你将必要把catalog.xml复制到C:/StAX目次下。

  终极,基于拉的事务天生把事务划定规矩供应到剖析器使用程序而不是供应到剖析器。
前些天,在CSDN上看到了一个消息,说是ASP.NETAJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-21 23:47:13 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
冷月葬花魂 该用户已被删除
7#
发表于 2015-3-15 09:44:18 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
兰色精灵 该用户已被删除
6#
发表于 2015-3-7 16:53:12 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
admin 该用户已被删除
5#
发表于 2015-2-25 05:18:15 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
莫相离 该用户已被删除
地板
发表于 2015-2-10 21:51:04 | 只看该作者
是一种突破用户端机器环境和CPU
柔情似水 该用户已被删除
板凳
发表于 2015-2-2 16:36:31 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
不帅 该用户已被删除
沙发
发表于 2015-1-29 14:35:20 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
若相依 该用户已被删除
楼主
发表于 2015-1-20 18:33:54 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 17:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表