发现VB6中SAX的乐趣[转]
发现VB6中SAX的乐趣 |
微软公司的XML核服务(Core Services),也就是广为人知的MSXML2,为VB和COM开发者提供了一种很有用的XML工具箱。在前面的几篇文章中,我已经介绍了MSXML2的DOM解析器,并演示了如何在一个图书目录管理应用程序中使用它的例子。现在,我将带你看看XML解析器coin的SAX部分。 SAX是什么? 受篇幅所限,我只能在本文简单的讨论一下SAX是如何工作的,如果你对SAX感兴趣,我建议你看看我们以前的一篇文章《XML基础教程:掌握SAX 》一文。简单的说,SAX(XML的简单API,即Simple API for XML)是一种连续的push解析器,SAX解析器把XML文档中的元素按照先后顺序依次推到它的主应用程序中。SAX最初是用来作为Java的解析器的,随后用于各种各样的其它语言,包括微软公司的COM实现。最为一种解析器,SAX相对于DOM的一个优势就是处理大文档以及查询文档中某段特定信息。当然,SAX要比DOM复杂,它要求你跟踪SAX正在处理的内容信息以便知道解析器处于文档中的哪个部分。 微软的SAX实现 SAXXMLReader:解析器本身 内容处理器 startDocument 当解析器开始解析文档时调用。 重要的文档处理方法 你至少需要完成界面函数中的startElement和characters方法,并把实现类的一个实例通过它的contentHandler属性传递给SAXXMLReader。 实现内容函数的一个好笑的方面就是SAX是无态的(stateless),也就是说你的实现类必须跟踪当前正在解析的元素(保存你从startElement方法得到的元素名),这样你才可以知道如怎样characters方法来处理接收到的元素内容。还有,目前SAX的VB实现是非验证性的,这就产生了一个有趣的效果:文档中的白空格(white space)实际上是被characters方法处理,而不是像你可能猜测的那样传递给方法ignorableWhitespace。 对错误的处理 重看“书籍目录”应用程序 现在,让我们把这些部件组装到一个例子中。我已经用SAX取代DOM重写了我们的老朋友——“书籍目录”应用程序。该应用程序得到了相当的简化(我以及删除了添加新书籍以及编辑书籍的功能),这样你就可以集中注意力看看SAX如何工作的。你可以在这儿下载本项目的源代码,它包括了catalog.xml的一份拷贝,该应用程序解析并显示出一个树型视图控件。图A是该它运行时的情形。 图A 运行中的SAX例子程序 先让我们谈谈内容处理器界面。你可以看到我是如何实现 startDocument、startElement、characters、和 endElement方法的。StartDocument方法的任务很简单,就是在SAX开始解析一个新的文档时分配集合(collection)类。实际工作是在 startElement和characters方法中完成的。前者保存当前元素的名字,即strLocalName,到一个模块层次上的变量,这样稍后当characters处理元素中的数据时,它可以把数据赋值给适当的book类属性中。当startElement处理一个名字为“book”的元素时,它可以通过oAttributes(一个IVBSAXAttributes实例)参数访问到的id属性来查询该书的id号。最后,当调用endElement时,它抛弃当前元素的名字,并设置一个布尔型的标志变量来表示是否可以结束解析该书。这就避免了characters没有必要的处理两个元素之前的白空格。 正如我在前面所提到的那样,由于严重的(fatal)错误可以作为可捕获的(trapable)错误返回到客户应用程序,因此实现错误处理对象显得有些多余。在实现错误处理器时你可以做的一件事就是判断错误发生在文档中的位置。你可以通过检测IVBSAXLocator实例的lineNumber和columnNumber属性来实现上述功能,IVBSAXLocator实例是错误处理器中fatalError方法的一个参数。 当建立内容处理器和错误处理器后,你接下来只需要通过调用SAXXMLReader的parse或者parseURL方法来设置解析器到工作文档上。 Listing A – cSaxReader.cls Option Explicit 'implement the content handler and error handler interfaces here Private m_book As cBook 'New book Public Sub LoadBooks(strFile As String) 'parse a file from a URL err_LoadBooks: End Sub Public Function GetBookList() As cBooksCollection Private Sub Class_Initialize() End Sub Private Sub Class_Terminate() End Sub Private Sub IVBSAXContentHandler_characters(strChars As String) End Sub Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS As MSXML2.IVBSAXLocator) End Property Private Sub IVBSAXContentHandler_endDocument() End Sub Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As String, strQName As String) End Sub Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String) End Sub Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String) End Sub Private Sub IVBSAXContentHandler_processingInstruction(strTarget As String, strData As String) End Sub Private Sub IVBSAXContentHandler_skippedEntity(strName As String) End Sub Private Sub IVBSAXContentHandler_startDocument() End Sub Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes) 'if this element is a book element then create a new book object End Sub Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, strURI As String) End Sub Private Sub IVBSAXErrorHandler_error(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) End Sub Private Sub IVBSAXErrorHandler_fatalError(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode As Long) End Sub |
有关资料:下载本项目的源代码
转载于:https://www.cnblogs.com/vboy/articles/160756.html
发现VB6中SAX的乐趣[转]相关推荐
- Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
内存管理之道:探寻编程世界中的思维乐趣 引言(Introduction) 内存分配区域(Memory Allocation Regions) 内存分配与转移(Memory Allocation and ...
- 如何发现数据中的异常值?对异常值是怎么处理的?
如何发现数据中的异常值?对异常值是怎么处理的? 如何发现数据中的异常值?对异常值是怎么处理的? 一种是基于统计的异常点检测算法例如极差,四分位数间距,均差,标准差等,这种方法适合于挖掘单变量的数值型数 ...
- Python代码发现链表中的环并输出环中的第一个元素
Python代码发现链表中的环并输出环中的第一个元素 # Python代码发现链表中的环并输出环中的第一个元素 # Find first node of loop in a linked list # ...
- 以人为本的机器学习:谷歌人工智能产品设计概述 By 机器之心2017年7月17日 12:13 取代了手动编程,机器学习(ML)是一种帮助计算机发现数据中的模式和关系的科学。对于创建个人的和动态的经历
以人为本的机器学习:谷歌人工智能产品设计概述 By 机器之心2017年7月17日 12:13 取代了手动编程,机器学习(ML)是一种帮助计算机发现数据中的模式和关系的科学.对于创建个人的和动态的经历来 ...
- 如何发现 Kubernetes 中服务和工作负载的异常
大家好,我是来自阿里云的李煌东,今天由我为大家分享 Kubernetes 监控公开课的第二节内容:如何发现 Kubernetes 中服务和工作负载的异常. 本次分享由三个部分组成: 一.Kuberne ...
- vb6中使text控件的光标随着增加的内容向下移动
vb6中使text控件的光标随着增加的内容向下移动 Dim i As Integer Private Sub Command1_Click() Text1.Text = Text1.Text + &q ...
- VB6中如何使用C#开发的WebService进行开发
VB6中如何使用C#开发的WebService进行开发<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office ...
- session中存放一个对象,只修改对象的属性,不将修改后的对象存放session,发现session中存放的对象也发生改变!
标题简单描述:先将一个对象放入session,只对对象属性值进行修改,但不将修改后的对象存放session中,发现session中存放的对象属性值也相对应的改变. Person person=new ...
- 程序编号以后计算机能够查出,华威大学研究人员开发出计算机程序,可发现量子计算机中的“泄漏”...
原标题:华威大学研究人员开发出计算机程序,可发现量子计算机中的"泄漏" 当量子计算机中的信息进入不理想的状态时,如果有一种计算机程序能够及时发现这种"泄漏",便 ...
最新文章
- error 图片,加载错误-》实用笔记
- 云服务器怎么拷贝和删除文件,怎样给云服务器拷贝文件
- 收藏一下mybatis全局参数配置
- RHEL6 让 root可以登录桌面
- 三目运算符对比三个_Javascript之if条件语句和三目运算符
- P4309-[TJOI2013]最长上升子序列【Splay】
- 使用 OpenCL.Net 进行 C# GPU 并行编程
- c 文件操作_你电脑用久了,会有多少重复文件?快用它来整理一下吧
- mysql查看线程详解(转载)
- java 线程 寄存器 地址_Java高级进阶多线程学习之路(四)CPU与内存
- 迅捷PDF编辑器如何编辑PDF文字图文教程
- python 正数变成负数_Python基础之位运算符(含原码反码补码的通俗解释)
- 150. Evaluate Reverse Polish Notation逆波兰表达式
- 塔夫斯大学计算机教授,塔夫茨大学开发出一系列3D打印半球形超材料 具有独特微波或光学特性...
- 商业智能BI能做什么
- Kaggle Top1% 是如何炼成的!
- CMMI V2.0培训纪实
- 用计算机怎么打出X,x的平方怎么在电脑上打出来(常见数学符号打法
- Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信)
- 缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)