欢迎来到天天文库
浏览记录
ID:14184167
大小:53.50 KB
页数:20页
时间:2018-07-26
《使用 stax 解析 xml 3》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、使用StAX解析XML3使用StAX解析XML,第3部分:使用定制事件和编写XML定义定制事件并使用StAX的序列化器API文档选项打印本页将此页作为电子邮件发送讨论级别:中级PeterNehrer(pnehrer@ecliptical.ca),自由撰稿人,独立咨询顾问2007年7月05日除了提供一个低层的基于指针的API之外,StAX还提供了一个功能强大的基于迭代器的方法,它通过使用事件对象传送关于解析流的信息,以处理XML。本系列的第2部分详细研究了这种API并提供了一些使用它的例子。在本篇文章中,将介绍定制化技术,该技术使用由应用程序定义的事件,您还将看到如何创建定制事件类并使用
2、它们结合基于事件迭代器的API来处理XML。最后(同样也是重要的一点),将回顾由StAX提供的可将XML编写为标记流和事件对象的序列化器API。创建定制事件当开发复杂应用程序时,使用分层方法(应用程序的下层为其上层提供必需的抽象)构建应用程序通常会很有用。例如,您可能会将处理XML的所有代码集合到一个应用程序提供的高层对象模型。这种技术不仅考虑到通用概念和解决方案的重用,并且还可以加速开发时间和产生更易维护的代码。因为StAX所使用的基于拉的方法将应用程序置于解析过程的控制之下,所以您可以将解析过的事件转换为特定于应用程序的模型对象(例如私有消息或者其他结构的构建块)。然而,您可能发现
3、继续使用事件会更为方便,这样,您只需在XML内容中简单地创建定制事件就可以表示更复杂的结构。通过在底层XML数据结构之上叠加定制类型,就可以简化应用程序代码的开发同时允许低层仍然将这些类型作为事件对象处理(例如,将它们作为事件写入一个输出流)。StAX事件层次结构是可扩充的。可以扩展已有的事件和定义全新的事件类型。因为事件对象被定义为Java?接口而不是类,因此您可以自由决定如何实现它们。例如,您可以将已有的对象模型分类并且将每一个类型表示为一个事件。您同样可以通过组装、委托等达到相同的目的。清单1显示了一个扩展Characters事件来表示特定的数据类型(本例中是一个JavaDate
4、)的值的例子。所有的子类将文本数据转换为数据值。注意,由于标准事件接口的公共实现不提供StAX,您可以使用Decorator模式包装一个已有的Characters实例并向其委托所有的方法调用。清单1.定制Characters事件的扩展来表示Date值finalDatatypeFactorytf=DatatypeFactory.newInstance();classDateTimeimplementsCharacters{privatefinalCharactersd;privatefinalDatevalue;DateTime(Charactersd){this.d=d;XMLGreg
5、orianCalendarcal=tf.newXMLGregorianCalendar(d.getData());value=cal.toGregorianCalendar().getTime();}DategetValue(){returnvalue;}publicCharactersasCharacters(){returnd.asCharacters();}publicEndElementasEndElement(){returnd.asEndElement();}publicStartElementasStartElement(){returnd.asStartElement(
6、);}publicStringgetData(){returnd.getData();}publicintgetEventType(){returnd.getEventType();}publicLocationgetLocation(){returnd.getLocation();}publicQNamegetSchemaType(){returnd.getSchemaType();}publicbooleanisAttribute(){returnd.isAttribute();}publicbooleanisCData(){returnd.isCData();}publicboo
7、leanisCharacters(){returnd.isCharacters();}publicbooleanisEndDocument(){returnd.isEndDocument();}publicbooleanisEndElement(){returnd.isEndElement();}publicbooleanisEntityReference(){returnd.isEntityReference();}publicboolean
此文档下载收益归作者所有