- 1、本文档共20页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用StAX解析XML
使用 StAX 解析 XML 3
使用 StAX 解析 XML,第 3 部分: 使用定制事件和编写 XML
定义定制事件并使用 StAX 的序列化器 API
文档选项
打印本页
将此页作为电子邮件发送
讨论
级别: 中级
Peter Nehrer (pnehrer@ecliptical.ca), 自由撰稿人, 独立咨询顾问
2007 年 7 月 05 日
除了提供一个低层的基于指针的 API 之外,StAX 还提供了一个功能强大的基于迭代器的方法,它通过使用事件对象传送关于解析流的信息,以处理 XML。本系列的第 2 部分 详细研究了这种 API 并提供了一些使用它的例子。在本篇文章中,将介绍定制化技术,该技术使用由应用程序定义的事件,您还将看到如何创建定制事件类并使用它们结合基于事件迭代器的 API 来处理 XML。最后(同样也是重要的一点),将回顾由 StAX 提供的可将 XML 编写为标记流和事件对象的序列化器 API。
创建定制事件
当开发复杂应用程序时,使用分层方法(应用程序的下层为其上层提供必需的抽象)构建应用程序通常会很有用。例如,您可能会将处理 XML 的所有代码集合到一个应用程序提供的高层对象模型。这种技术不仅考虑到通用概念和解决方案的重用,并且还可以加速开发时间和产生更易维护的代码。
因为 StAX 所使用的基于拉的方法将应用程序置于解析过程的控制之下,所以您可以将解析过的事件转换为特定于应用程序的模型对象(例如私有消息或者其他结构的构建块)。然而,您可能发现继续使用事件会更为方便,这样,您只需在 XML 内容中简单地创建定制事件就可以表示更复杂的结构。通过在底层 XML 数据结构之上叠加定制类型,就可以简化应用程序代码的开发同时允许低层仍然将这些类型作为事件对象处理(例如,将它们作为事件写入一个输出流)。
StAX 事件层次结构是可扩充的。可以扩展已有的事件和定义全新的事件类型。因为事件对象被定义为 Java? 接口而不是类,因此您可以自由决定如何实现它们。例如,您可以将已有的对象模型分类并且将每一个类型表示为一个事件。您同样可以通过组装、委托等达到相同的目的。清单 1 显示了一个扩展 Characters 事件来表示特定的数据类型(本例中是一个 Java Date)的值的例子。所有的子类将文本数据转换为数据值。注意,由于标准事件接口的公共实现不提供 StAX,您可以使用 Decorator 模式包装一个已有的 Characters 实例并向其委托所有的方法调用。
清单 1. 定制 Characters 事件的扩展来表示 Date 值
final DatatypeFactory tf = DatatypeFactory.newInstance();
class DateTime implements Characters {
private final Characters d;
private final Date value;
DateTime(Characters d) {
this.d = d;
XMLGregorianCalendar cal = tf.newXMLGregorianCalendar(d.getData());
value = cal.toGregorianCalendar().getTime();
}
Date getValue() { return value; }
public Characters asCharacters() { return d.asCharacters(); }
public EndElement asEndElement() { return d.asEndElement(); }
public StartElement asStartElement() { return d.asStartElement(); }
public String getData() { return d.getData(); }
public int getEventType() { return d.getEventType(); }
public Location getLocation() { return d.getLocation(); }
public QName getSchemaType() { return d.getSchemaType(); }
public boolean isAttribute() { return d.isAttribute(); }
public bool
文档评论(0)