• 热门标签

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

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

另外,你也可以通过如下方式指定路径:
现在,你已经完成了用户信息的加载,下一步是根据每个用户选择的分类和喜欢的输出格
750使用XML 高级编程
下载
式—X M L或H T M L—转换X M L源文档。为此,我们需要回到前面实现的C X M L C a t a l o g -
Tr a n s f o r m和C H T M L C a t a l o g Tr a n s f o r m类,编写真正执行转换过程的代码。
4. XML 到X M L转换
图1 7 - 2 4显示了X M L到X M L转换类C X M L C a t a l o g Tr a n s f o r m。
图17-24
属性C a t e g o r y 1和C a t e g o r y 2用于告知转换类应该匹配源X M L文档中的哪两个图书分类。任何
与这些分类不符的图书都将被忽略。与这些分类匹配的图书将写入输出流。
修改我们刚才创建的C X M L C a t a l o g Tr a n s f o r m模块的代码,如下所示声明成员变量和属性访
问方法(我们还可以使用类构造工具完成该任务):
程序清单1 7 - 4 3
第17章实例研究3—图书目录信息服务使用751 下载
下一页显示了ITemplate方法新的实现方式。
调用I Te m p l a t e _ c h a r a c t e r s事件处理器时,私有变量m _ s Ti t l e、m _ s A b s t r a c t和m _ s I S B N用于保
存来自X M L源文档的详细信息:
程序清单1 7 - 4 4
例程检查的第一个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”。如果找到相应的
内容,例程将使用当前的过滤器检查图书的推荐分类。如果找到匹配项,则变量m _ l C a t e g o r i e s
增一。每本书可能有多个推荐的分类,因此变量m _ l C a t e g o r i e s用于确定针对当前的图书找到多
少个匹配项。当I Te m p l a t e _ e n d E l e m e n t ( )方法检测到图书的结束时,如果变量m _ l C a t e g o r i e s不等
于零,将图书信息写入输出流:
程序清单1 7 - 4 5
752使用XML 高级编程
下载
对于以上代码,特别需要说明的是我们使用简单的Wr i t e S t r i n g ( )语句构建输出的X M L。这是
由于我们使用S A X解析器处理源文档,这一点非常有意义。如果我们选择通过D O M对象创建输
出文档,对于大型的输出文件,我们可能会遇到内存问题,而且由于创建D O M对象会产生相关
的额外开销,因此要花费更多的处理器时间。总之,这种方法非常适于B C I S,而且它比使用
D O M对象快大约3倍。
该代码不检查“&”等X M L的保留字符;对于需要实际应用的代码,你应该进行这项检
查。
对于图书分类匹配,我们本来可以使用B o o l e a n值,而不是l o n g,但是我之所以使用l o n g是
因为可以允许用户为匹配操作定义分类的最小值。输出A m a z o n的U R L时调用的R e d u c e ( )函数用
于保证I S B N不包含连字符—输入流的I S B N中包括连字符,但是这与Amazon We b站点的U R L
不一致。以下代码用于删除输入串中的连字符:
程序清单1 7 - 4 6
为A m a z o n添加的链接可以移至子例程中。如果我们决定支持多广告商,就应该这样做,但
是对于单一的项,内嵌的代码也是可行的。
处理新的图书时,我们需要重置m _ l C a t e g o r i e s变量,因此当我们在I Te m p l a t e _ s t a r t E l e m e n t方
法中检测到XPath “/ 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”时,我们将重新设置m _ l C a t e g o r i e s变量。
如果我们忘记重置计数器,第一次匹配成功之后的所有图书都将出现在输出流中—这可不是
我们的订阅者所期望的!由于所有的图书分类都定义为< R e c S u b j C a t e g o r i e s >元素的子元素,因
此在I Te m p l a t e _ s t a r t E l e m e n t方法中重新设置值是一种很好的方式,虽然我们也可以在e n d E l e m e n t
事件处理器中将值重新设置为零。下面显示了将值归零的方法:
程序清单1 7 - 4 7
第17章实例研究3—图书目录信息服务使用753 下载
如果采用基于S A X的方式过滤X M L数据,只能从输入流中缓存各种数据元素,然后将它们
按照原有的顺序写入输出流。它不可能在输入流中向回搜索(访问以前发生的事件),如果我们
希望在检查与过滤器匹配的图书分类之前将元素写入输出流,就不得不删除一些已经写入的内
容—这不是一种可取的方法。你也可以为每本书创建一个输出,但是首先将它写入临时变量
(或者很小的D O M),一旦与当前的过滤器匹配,再将它写入真正的文件,但是我们采用的方法
对于本章的实例研究来说非常恰当。
前面显示的m _ O u t s t r e a m变量是指向接口I O u t p u t的引用,I O u t p u t只有一个方法Wr i t e S t r i n g ( )。
通过引入类似于I Te m p l a t e中使用的重构特性,我们的转换类能够将输出写入任何介质:文件、
内存、套接字等。
添加名为I O u t p u t的类模块,按照以下代码修改类模块:
稍后我们将实现该接口。
任何X M L文档都只能有一个根元素。到目前为止,我们只讨论了写入< B o o k s >元素的代码,
现在我们需要创建根元素。为此,我们将实现s t a r t D o c u m e n t和e n d D o c u m e n t事件处理器。
下面显示了C X M L C a t a l o g Tr a n s f o r m的s t a r t D o c u m e n t事件处理器:
程序清单1 7 - 4 8
首先,写入X M L声明和根起始标记,以及详细描述用于创建文件的过滤器的< N o t e s >元素。
最后一行写入< B o o k s >元素的起始标记,它包含匹配的所有图书。
到达源X M L文档结束时,激活e n d D o c u m e n t事件处理器,因此代码将写入< B o o k s >元素的结
束标记以及根元素< C a t a l o g >的结束标记:
程序清单1 7 - 4 9
754使用XML 高级编程
下载
完成X M L转换类之后,我们将在主窗体中添加方法P e r f o r m X M LTo X M LTr a n s f o r m(),它将
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程下(72)