曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
D i r e c t o r y用于在目录中扫描所有X M L文档,并要求处理每个文件。
(3) 记录元素嵌套,创建X P a t h
S A X转换引擎使用E l e m e n t S t a c k结构数组记录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的类模块中,在其中设置两个变量:
740使用XML 高级编程
下载
图17-19
数组大小1 0 0是我随意选择的值,你可以根据自己的需求使用R e D i m增加、删除或更改数
组的大小。对于大多数XML文档来说,100应该是足够的。
当引擎首次启动时,堆栈的当前深度( m _ l C u r r e n t S t a c k D e p t h)被设置为零,当产生
s t a r t E l e m e n t事件时,深度值增1:
程序清单1 7 - 2 3
在增加堆栈深度之前,将元素的名称放入堆栈。
产生e n d E l e m e n t事件时,堆栈深度减1:
在事件流的任何时刻,当前X P a t h是通过列举堆栈中的内容获得的。我们使用B u i l d X P a t h函
数执行这项操作,将X P a t h存入变量m _ s C u r X P a t h:
程序清单1 7 - 2 4
第17章实例研究3—图书目录信息服务使用741 下载
m _ s C u r X P a t h声明为全局变量,向模板处理器转发c h a r a c t e r s等事件时,将使用该变量。
为了在建立X P a t h的过程中,能够在在日志窗口中看到S A X事件流中的X P a t h,我们需要在
m _ o S A X P a r s e r _ s t a r t E l e m e n t ( )方法中调用B u i l d P a t h ( )函数,并使用L o g L i n e ( )函数将m _ s C u r X P a t h
写入日志窗口:
程序清单1 7 - 2 5
为了看到代码的效果,双击Split File按钮,在事件处理器中添加以下代码:
程序清单1 7 - 2 6
它创建转换类的实例,调用P r o c e s s F i l e ( )方法,方法的参数包括:第一个文本编辑框中指定
文件名,以及引擎记录X P a t h所用的L i s t Vi e w的引用。为了使转换引擎添加的日志消息可读,我
们需要修改F o r m _ L o a d ( )事件,将L i s t Vi e w视图设置为l v w R e p o r t,并添加栏目:
程序清单1 7 - 2 7
742使用XML 高级编程
下载
如果我们不执行这项操作,窗体将使用缺省的图标视图,使得文本难以理解。
(4) SAX+XPAT H
运行窗体,指定c a t a l o g . x m l文档的路径(你可以从站点h t t p : / / w w w. w r o x . c o m /获得本章的可
下载代码,其中包含c a t a l o g . x m l文档),然后点击Split File按钮。应该看到列出的所有X P a t h(参
见图1 7 - 2 0)。
图17-20
为了对事件流有更完整的认识,我们将修改m _ o S A X P a r s e r _ e n d E l e m e n t ( ),使之在遇到结束
标记时显示元素的X P a t h:
程序清单1 7 - 2 8
我们还要添加字符事件处理器,用以记录X P a t h和字符数据:
程序清单1 7 - 2 9
再次运行窗体,并解析相同的文件,我们将对经X P a t h扩展的S A X事件流有更完整的认识
第17章实例研究3—图书目录信息服务使用743 下载
(参见图1 7 - 2 1)。
图17-21
(5) 阶段总结
到目前为止,我们已经介绍了:
• 如何使用I Te m p l a t e接口在不知道具体的类的情况下调用模板处理器类模块函数。
• 如何使用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将X P a t h与模板处理器相关联。
• 如何用X P a t h扩展S A X事件流。
下面我们要将所有内容组合在一起。
(6) MatchPatterns MatchPatterns()方法通过搜索C S A X Tr a n s f o r m E n g i n e的m _ P a t t e r n s变量中
的C P a t t e r n C o l l e c t i o n对象将X P a t h与模板处理器匹配。如果找到匹配的样式,就将C P a t t e r n对象
放在成员变量m _ o C u r r e n t P a t t e r n中。每个S A X事件处理器都将检查该变量,除非它的值被设置
为N o t h i n g,事件处理器会将事件转发给相关的模板处理器。
样式匹配代码将当前的X P a t h与C P a t t e r n对象的P a t t e r n属性进行比较。如果它们精确匹配,
或者P a t t e r n属性为“*”,表示匹配所有X P a t h,则搜索成功。如果使用“ *”样式,你应该确保
它是列表中的最后一项,因为一旦遇到匹配项后,搜索立即停止。下面显示了该方法的完整代
码,你应该将它添加到C S A X Tr a n s f o r m E n g i n e类中:
程序清单1 7 - 3 0
744使用XML 高级编程
下载
代码调用我们前面看到的B u i l d X P a t h ( )函数,然后对于m _ P a t t e r n s中的每个C P a t t e r n对象,判
断它是否与当前的X P a t h匹配。如果匹配,记录样式,并退出例程。如果找不到匹配的样式,清
除当前的样式变量。既然有了该函数,我们就可以修改s t a r t E l e m e n t和e n d E l e m e n t事件处理器中
现有的对B u i l d X P a t h ( )的调用:
程序清单1 7 - 3 1
这两个数据处理器不再直接记录X P a t h,如果设置了m _ o C u r r e n t P a t t e r n对象引用,它们会将
事件转发给与当前样式相关的模板处理器。如果未设置当前样式,则不采取任何操作。字符事
件处理器中也要进行类似的修改,但是不需要调用M a t c h P a t t e r n s ( )方法,因为我们知道只有前两
个事件中的元素嵌套发生了变化,因此已经设置了当前路径:
程序清单1 7 - 3 2
第17章实例研究3—图书目录信息服务使用745 下载
在编译新代码之前,我们还需要在C S A X Tr a n s f o r m C l a s s类模块中添加m _ o C u r r e n t P a t t e r n变
量定义:
程序清单1 7 - 3 3
从理论角度讲,我们已经实现了基本的转换引擎。为了查看它的效果,修改S p l i t F i l e _ C l i c k ( ),
创建C X M L C a t a l o g Tr a n s f o r m类的实例,使用A d d P a t t e r n ( )方法在转换引擎中添加X P a t h样式
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程下(70)