• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:16来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

“/ C a t a l o g / B o o k / Ti t l e”,并将C X M L C t a t l o g Tr a n s f o r m对象的引用作为模板处理器传递:
程序清单1 7 - 3 4
然后,修改C X M L C a t a l o g Transform ITe m p l a t e _ c h a r a c t e r s ( )事件处理器,使之仅显示数据,
而不显示X P a t h,因为我们知道X P a t h总是“/ C a t a l o g / B o o k / Ti t l e”—它是在调用A d d P a t t e r n ( )时
指定的:
运行项目,将在消息框中看到X M L文档中每本书的书名。转换引擎提供了过滤X M L原文档
的功能,只有具有特定X P a t h 的事件才转发给我们定义的模板处理器。正如我们通过
C X M L C a t a l o g Tr a n s f o r m类中的字符处理器看到的,它能够简化代码,并且使你对这种技术的灵
活性有所认识。
(7) startDocument和e n d D o c u m e n t
为了完成C S A X Tr a n s f o r m E n g i n e,我们将实现s t a r t D o c u m e n t和endDocument SAX事件,并
采用类似于s t a r t E l e m e n t的方法将它们转发给模板处理器。
处理到X M L文档的开始处时, S A X解析器将调用s t a r t D o c u m e n t事件处理器。如果找到匹配
项,代码调用M a t c h P a t t e r n s ( )方法设置m _ o C u r r e n t P a t t e r n变量。我们知道匹配项总是“ /”(文档
的根),因为此时堆栈不包含任何项。如果找到样式,将调用相关的模板处理器的s t a r t D o c u m e n t
处理器:
746使用XML 高级编程
下载
程序清单1 7 - 3 5
e n d D o c u m e n t方法也大同小异,但是它调用模板处理器的e n d D o c u m e n t方法:
程序清单1 7 - 3 6
3. 从U s e r s . X M L加载订阅者信息
到目前为止,我们介绍了B C I S的基本设计,以及转换引擎的实现。既然已经编写了转换引
擎,只需要少量的编码,我们就能够使用它迅速地创建B C I S。
第一个需求是将订阅者信息加载至内存。该信息用于通知B C I S必须将图书目录信息发送给
谁,以及每个订阅者对哪类图书信息感兴趣。下面显示了X M L用户文件( u s e r s . x m l文档同样可
以从前面列出的站点中下载):
程序清单1 7 - 3 7
正如前面所讨论的, C L o a d U s e r I n f o会将该文件加载至C U s e r C o l l e c t i o n,使得每个用户都由
一个C u s e r对象表示(参见图1 7 - 2 2)。
与前面对于C P a t t e r n和C P a t t e r n C o l l e c t i o n的处理类似,使用类构造器添加C U s e r和
C U s e r C o l l e c t i o n类模块。如上图所示,对于用户类模块,你需要添加S t r i n g类型的属性E m a i l、
第17章实例研究3—图书目录信息服务使用747 下载
D e l i v e r y F o r m a t、O u t p u t F i l e、C a t e g o r y 1、C a t e g o r y 2和U s e r N a m e。对于C U s e r C o l l e c t i o n类模块,
修改C U s e r C o l l e c t i o n的A d d ( )方法,从函数原型中删除C a t e g o r y 1、C a t e g o r y 2、O u t p u t F i l e、
D e l i v e r y F o r m a t和E m a i l参数,以及函数中的任何引用,修改后的代码将如下所示:
图17-22
程序清单1 7 - 3 8
我们之所以删除所有参数,是因为最初创建C U s e r对象时,这些参数并非都是可用的,由于
它们是C U s e r的属性,因此通过类构造器添加它们。当X P a t h与I Te m p l a t e _ c h a r a c t e r s ( )方法中的输
入流匹配时,将设置相应的属性。例如,当匹配X P a t h“/ U s e r s / U s e r / E m a i l”时,我们将设置
E m a i l属性。当X P a t h为“/ U s e r s / U s e r / N a m e”时,我们将创建C U s e r对象,同时设置U s e r N a m e属
性。
添加类模块C L o a d U s e r I n f o,但是不要使用类构造器,因为我们已经创建了该类。
首先,在类模块的顶端添加以下行,声明它实现了I Te m p l a t e接口,它包含用户集合,以及
748使用XML 高级编程
下载
跟踪m _ o C u r r e n t U s e r中构造的当前用户(订阅者)配置文件:
程序清单1 7 - 3 9
然后,添加L o a d U s e r I n f o ( )方法:
程序清单1 7 - 4 0
在创建转换引擎之前,注册样式和模板处理器(模板处理器就是C L o a d U s e r I n f o类本身),
而后请求处理U s e r s . X M L。与前面的模板处理器不同,我们曾使用了通配符“ *”样式。这意味
着每个S A X事件都会添加X P a t h,并转发给模板处理器。由于要处理的X M L文档非常简单,因此
我们采用这种方法,否则要求多个类模块加载用户信息就矫枉过正了。
下面,按照前面介绍的方法为I Te m p l a t e添加空的事件处理器,然后参照以下代码修改
I Te m p l a t e _ c h a r a c t e r s ( )方法:
程序清单1 7 - 4 1
当匹配XPath “/ U s e r s / U s e r / N a m e”时,I Te m p l a t e _ c h a r a c t e r s ( )方法通过调用C U s e r C o l l e c t i o n
的A d d ( )方法创建新的C U s e r对象,将返回对象设置为m _ o C u r r e n t U s e r。如果匹配其他X P a t h,则
第17章实例研究3—图书目录信息服务使用749 下载
将字符数据拷贝至当前用户对象的m _ o C u r r e n t U s e r属性。
为了使其他对象能够访问加载的用户信息,我们添加名为U s e r s的属性:
为了测试CLo a d U s e r I n f o类,添加Scan Directory按钮的事件处理器,并增加以下代码:
程序清单1 7 - 4 2
运行项目并点击按钮,你将看到日志窗口中列出了所有用户名(参见图1 7 - 2 3)。
图17-23
如果你非但没有看到用户名列表,反而遇到了错误,你需要再次检查C L o a d U s e r I n f o解析的
文件U s e r s . x m l是否位于当前目录下,因为代码采用的是相对路径:
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程下(71)