• 热门标签

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

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

的事件:G a m m a等定义的O b s e r v e r样式的C O M实现(《Design Patterns》,ISBN 0-201-63361-2)。
该样式与我们前面讨论的出版商/订阅者模型极其类似,除了现在出版商是一个对象,订阅者是
一些V B代码。
定义之后,从对象组合框中选择m _ o S A X P a r s e r ,点击方法组合框,依次选择事件
s t a r t E l e m e n t,c h a r a c t e r s和e n d E l e m e n t,将子例程原型添加到代码模块中(参见图1 7 - 9)。
按照以下代码修改三个事件处理器的实现:
程序清单1 7 - 9
730使用XML 高级编程
下载
对于每个被处理的事件,我们将事件名称以及元素名称或字符数据写入列表框。
然后,按照以下代码添加窗体加载事件处理器:
程序清单1 7 - 1 0
以上代码创建S A X解析器实例,然后请求解析器解析文本“ < P r o X M L > E n j o y ! < / P r o X M L >”。
运行代码,虽然我增加了列表框字体的大小,但是你所看到的输出应该与图1 7 - 1 0非常相似。
图17-9
LoadUserInfo假设文件Users.XML位于当前工作目录中。
如果愿意,还可以通过p a r s e F i l e ( )方法要求解析器处理文件,
我们稍后将用到该代码:
既然我们已经了解了即将使用的解析器,讨论了执行转换
所需的S A X过滤器/转换技术,下面让我们分析一下真正所要求
的功能的类。
4. 转换引擎
第17章实例研究3—图书目录信息服务使用731 下载
图17-10
X S LT样式表是由模板和样式构成的。每个模板有效地描述了要放置在目标文件中的标记和
元素内容,其中的样式定义的X P a t h说明如何将源文档拖动到目标位置。我们可以根据模板和样
式建立转换引擎,模板是一个类中包含的一些代码,当特定的样式( X P a t h)与前面讨论的
X P a t h / S A X事件流匹配时,将调用模板代码。例如:
程序清单1 7 - 11
类模块的事件映射可以应用于所有S A X事件,例如:e n d E l e m e n t和c h a r a c t e r s:
程序清单1 7 - 1 2
显然,对于每个应用程序,我们不希望手工编写以上重复匹配和事件转发代码,因此将该
功能内置于B C I S转换引擎。
既然已经讨论了B C I S的功能,下面开始编写实现系统的代码。
17.1.2 创建BCIS
创建新的标准E X E项目,添加对Vivid ActiveSAX type library的引用。
1. SAX XPath过滤器接口—ITe m p l a t e
为了使转换引擎能够以通用的方式调用我们的模板处理器,需要定义描述所有事件的接口
(仅仅定义了方法而无实现的V B类模块)。转换引擎将使用该接口调用模板处理器的方法,而不
必知道真正实现该接口的确切的类。
添加新的类模块,将它的名称改为I Te m p l a t e,并添加以下代码:
程序清单1 7 - 1 3
732使用XML 高级编程
下载
在Java或C/C++中,在此你可以只定义一个抽象类。
然后,添加名为C X M L C a t a l o g Tr a n s f o r m的类模块,并在代码模块中添加以下行,告知V B它
实现了I Te m p l a t e接口:
既然已经声明了实现接口的类模块,对象组合框将包含I Te m p l a t e项。选择它,你将看到事
件组合框列出了它的所有方法(参见图1 7 - 11)。
图17-11
选择事件组合框中的每个方法, V B将向类模块中添加子例程原型:
第17章实例研究3—图书目录信息服务使用733 下载
程序清单1 7 - 1 4
修改c h a r a c t e r s ( )方法,使之包含显示事件名称和传递的X P a t h的消息框:
程序清单1 7 - 1 5
然后,为了演示在V B中如何实现多态性和接口,在F o r m 1的代码模块中添加以下子例程:
该例程向接口传递引用,然后调用c h a r a c t e r s事件,同时传递X P a t h“/ C a t a l o g / B o o k / Ti t l e”
和数据“P r o X M L”。在实际的B C I S中,这些是根据X M L源文档创建的,但是现在,我们将值硬
编码在程序中,以便演示引擎是如何工作的。调用c h a r a c t e r s方法的代码不知道哪个对象类实现
了接口,这意味着它能够以多态方式调用任何对象类的c h a r a c t e r s方法。这种方法非常有效,因
为你可以在不修改代码的情况下,在任何时刻添加新的X P a t h的类模块。为了说明这一点,在窗
体中增加一个按钮,双击它,将事件处理器改为如下形式:
程序清单1 7 - 1 6
代码创建C X M L C a t a l o g Tr a n s f o r m类的实例,然后通过调用子例程引用I Te m p l a t e接口的
734使用XML 高级编程
下载
c h a r a c t e r s方法。如果你运行项目,并点击按钮,将看到图1 7 - 1 2所示的消息框,它是由
C X M L C a t a l o g Tr a n s f o r m类的实例创建的。
图17-12
关键在于即使D u m m y C h a r a c t e r s E v e n t ( )方法接受了I Te m p l a t e类型的参数, V B仍然会向
C X M L C a t a l o g Tr a n s f o r m对象询问I Te m p l a t e接口,然后调用相应的函数。为了说明这一点,添加
一个名为C H T M L C a t a l o g Tr a n s f o r m的类模块,从C X M L C a t a l o g Tr a n s f o r m模块拷贝所有代码,但
是将I Te m p l a t e _ c h a r a c t e r s ( )中的消息框调用改为如下形式:
程序清单1 7 - 1 7
回到按钮的事件处理程序,修改代码,创建该类的实例,调用D u m m y C h a r a c t e r E v e n t s ( ),并
将新创建的对象作为参数传递:
程序清单1 7 - 1 8
运行项目,点击按钮,除了原来的消息框,你还将看到由C H T M L C a t a l o g Tr a n s f o r m类创建
的消息框(参见图1 7 - 1 3)。
图17-13
以上例子说明我们这个简单的函数能够调用两个不同对象类的相同函数,它同时解释了转
第17章实例研究3—图书目录信息服务使用735 下载
换引擎扩展模块应遵循的基本原则。当然,转换引擎不应该是硬编码的,它应该允许你注册
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程下(68)