曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
< C a t e g o r y 1 > 用户感兴趣的第一个图书目录。它与使用X P a t h / C a t a l o g / B o o k /
R e c S u b j C a t e g o r i e s / C a t e g o r y的X M L目录文件匹配
< C a t e g o r y 2 > 用户感兴趣的第二个图书目录。它与< C a t e g o r y 1 >匹配
对于本章介绍的实例研究,你可以进行扩展,例如:使之支持任意多个目录元素。为了
简化代码,我仅仅实现了两个
第17章实例研究3—图书目录信息服务使用723 下载
(3) 投递格式
B C I S允许订阅者以H T M L格式或X M L格式接收图书信息。图1 7 - 2显示了H T M L投递格式,
其中目录过滤器是使用A S P和A S P +编写的。
图17-2
转换过程创建了一个非常简单的H T M L输出文件,实际上,它只显示了两个原始的X M L输
入字段(书名和摘要)。它根据简单的算法计算到A m a z o n的链接,该算法首先删除I S B N号中的
连字符,然后在前面增加前缀h t t p : / / w w w. a m a z o n . c o m / e x e c / o b i d o s / A S I N /。
X M L格式同样相当简洁,参见图1 7 - 3。
图17-3
724使用XML 高级编程
下载
以上两个转换过程都是由V B类模块执行的,我们稍后会介绍有关内容。
2. 订阅者/用户
如前所述,订阅者是B C I S实例研究中最重要的实体,因为他们负责定义应用于源X M L目录
文档的过滤规则,投递格式( H T M L或X M L),以及可选的电子邮件地址。订阅者是使用类
C U s e r模型化的,类C U s e r C o l l e c t i o n用于以组为单位管理订阅者(参见图1 7 - 4)。
图17-4
上图(及本章其他类似的图)采用U M L表示法。我们描述一下这种表示法:它使用一个
框表示类,框被分为三部分。顶部显示类名,中部显示属性(及类型),下部显示方法
(以及参数和类型)。框之间的箭头表示拥有或包含等关系,箭头上的数字表示关系的元
组数(一对一,一对多等)。在上图中,C U s e r C o l l e c t i o n包含零个或多个C U s e r对象。要了
解更多的信息,参见《Instant UML》(ISBN:1-861000-87-1)。
出版商和广告商并没有被模型化,因为系统并不介意谁创建了X M L目录文件,而且我们只
讨论到A m a z o n的链接。如果决定扩展系统,以每个用户/出版的每本书为单位向出版社收费,或
者支持多个广告商,我们就需要将它们模型化,因为在那种情况下它们与订阅者同等重要。
(1) VB 集合说明
当我们使用V B编写B C I S时,所有集合类都是使用类构造器附件创建的。
我虽然使用类构造器,但通常将变量名由m v a r重命名为m _,并且使用匈牙利表示法表示
变量的前缀。
在设计过程中,我不打算详细解释集合类,因为它们在现实世界中的角色非常简单:它们
包含零个或多个相同类的对象。然而,考虑到有些人以前可能从未使用过V B,我将简要介绍
C U s e r C o l l e c t i o n类的N e w E n u m ( )方法。
N e w E n u m ( )方法允许我们使用如下的F o r. . . E a c h语法书写代码:
程序清单1 7 - 3
第17章实例研究3—图书目录信息服务使用725 下载
这是V B的速记特征,其结果是产生具有较强可读性的编码方法。它的底层实现是基于C O M
接口I E n u m VA R I A N T的,它使我们能够摆脱传统的较为繁琐的通过索引访问集合项的方法:
程序清单1 7 - 4
(2) 加载订阅者信息
如前所述,订阅者信息是保存在文件U s e r s . X M L中的。为了将该文件转换为C U s e r类的实例,
我们需要使用类C L o a d U s e r I n f o(参见图1 7 - 5)。
图17-5
通过调用C L o a d U s e r I n f o的L o a d U s e r I n f o ( )方法,文件U s e r s . X M L将被转化为C U s e r对象,并
放在m _ o U s e r s的C U s e r C o l l e c t i o n中。显然,X S LT不能实现该转换过程,因此我们使用S A X解析
器以及基于S A X / X P a t h的简单而聪明的转换引擎,这使得转换过程非常易于实现。转换引擎是
由C S A X Tr a n s f o r m E n g i n e类实现的。
由于转换引擎是基于S A X的,因此我们不必将X M L文档加载至D O M。我们只需要响应S A X
事件流中的某些事件,并且构建自己的C U s e r对象。这样就不必要为X M L文档创建D O M,在
D O M中搜索节点,然后删除所有D O M节点。这种方式主要有以下两个优越性:
• 我们不必创建D O M节点,并在获取所需的数据后立即删除节点,因而也就不必为此浪费
处理时间和内存。
• 我们能够处理任意大小的文件。无论用户的文件多大,我们只会受到C U s e r对象占用的
内存的限制,而不会因D O M节点导致受限。如果曾经尝试着将2 0 M B文件加载至D O M中,
726使用XML 高级编程
下载
你可能会发现它所需的内存是文件大小的3 ~ 4倍,即:大约8 0 M B。对于S A X,解析过程
通常只需要几K B,确切的大小取决于文件中的元素嵌套和字符数据。这一特征使得
S A X非常适于类似B C I S的系统,因为B C I S等系统对于需要处理的X M L文档大小没有上
限。
S A X主要有以下两点不足:
• 无法随机访问X M L文档中的任意数据,除非该数据是由当前事件提供的,或者该数据已经
解析出来并且保存在变量中。
• 事件中不包含元素位置关系指示。举例来说,如果接收到s t a r t E l e m e n t事件,而且元素名称
为< Ti t l e >,我们无法确定该元素是否包含在另一个元素中(比如: < B o o k >),除非我们在
处理元素的过程中通过设置某些类型的标志表示嵌套。当然, < B o o k >与< Ti t l e >之间可以
是父/子关系或祖先/子孙关系。嵌套或关系越复杂,需要保留的标志越多。
要详细了解DOM与SAX的优缺点比较,参见本书前面的有关章节(第5章和第6章)。
对于S A X的第一个缺点,我们不太容易克服,唯一的方法是缓存信息。如果X M L文档不十
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程下(66)