XML 简单接口 (SAX2)用Visual Basic 实现的示例[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 coolstar 的 blog


martin naughton
2000年6月

下载示例代码 下载本文的示例代码 (351 kb)

摘要:本文概述用 microsoft visual basic 编制 sax2 接口的方法。

简介

may 2000 msxml technology preview 的关键功能之一是实现了 sax2 (simple api for xml, version 2)。msdn xml 开发人员中心提供的题为 xml 开发人员的 sax2 快速入门一文和可下载的 microsoft® visual c++® 应用程序,可作为 sax2 的简介。在本文中,我将概述用 visual basic® 编制 sax2 接口的方式。请注意,不对本示例提供技术支持,本示例的目的仅是帮助您建立 sax/visual basic 解决方案的原型。此外,应该清楚的是本例中的接口不会对 microsoft visual basic 将来对 sax 的支持产生影响。

世界,你好!

在有了 visual basic (vb) 后,使用组件对象模型 (com) 组件(例如 msxml3.dll)的典型方式是创建新的标准 exe 工程,然后进入工程/引用菜单,添加对 msxml3.dll 类型库(microsoft xml,版本 3.0)的引用。此时可以用 visual basic 对象浏览器来查看所选接口的属性、方法和事件。

我是用 msxml3.dll 完成这些任务的,然后徒劳地查找 sax2 接口,但是在该类型库中没有找到任何远程 sax-y。然后我查看了注册表以确定是否安装了正确的 msxml3.dll 版本。当然是这样的,在 hkey_classes_root 目录下还有两个很有可能的 progids(特别是 msxml2.saxxmlreader 和 msxml2.saxxmlreader.3.0),所以我连续在新闻组中询问了类似于“我丢失了什么东西吗?”的问题。很快就有答复指出我实际上丢失了一些东西。

使用来源,luke

sax2 接口是在称为 xmlsax.idl 的文件中定义的。如果将 msxml3.dll 安装到默认文件夹中,则可以在称为 c:\program files\microsoft xml parser sdk\inc 的文件夹中找到 xmlsax.idl。在找到该文件后,我将 xmlsax.idl 编译到称为(非常合适的)xmlsax.tlb 的类型库中。midl idl 是我用来进行编译的工具。

回到 visual basic 集成开发环境 (ide) 中,我返回到工程/引用菜单,这次我从引用对话框中选择了浏览以便找到新的 xmlsax.tlb 文件。用这种方法选择类型库的结果,vb ide 首先注册了类型库文件。这就振奋多了。现在 sax2 接口可以显示在“对象浏览器”中了。

字符构造材料

对某些方法参数的检查证实了新闻组的答复对我的建议:接口对 visual basic 有一点不友好。请记住,microsoft xml sdk 3.0 中的文档将 sax2 接口描述为“microsoft 的 sax2 的 com/c++ 实现”。总而言之,在 visual basic 开发人员期望看到一个字符串参数的地方实际上是两个参数。这些参数的第一个有“pwch”匈牙利前缀(“到通配符数组的指针”?),第二个有“cch”前缀(“字符计数”?)。

下面是 startelement 方法的 isaxcontenthandler idl 的样子:

hresult startelement(
        [in] const wchar_t * pwchnamespaceuri, 
        [in] int cchnamespaceuri, 
        [in] const wchar_t * pwchlocalname, 
        [in] int cchlocalname, 
        [in] const wchar_t * pwchqname, 
        [in] int cchqname, 
        [in] isaxattributes * pattributes);

好在新闻组的答复提供了一段处理这些参数的 visual basic 代码。该函数的简化版本如下。

public function unicodearraytostring(pwcharray as integer, byval lcharcount as long) as string

dim stext as string

' 调整字符串大小为正确的字符数
stext = string$(lcharcount, 0)

' 复制这些值。请注意大小是字符数的两倍,
’因为字符串是 unicode(双字节)
call copymemory(byval strptr(stext), iunicodechararrayfirstelt, 
  lcharcount * 2)

unicodearraytostring = stext

end function

xmlsax 接口返回 visual basic 整型数组,加上数组中的项目数。unicodearraytostring 函数使用未公开的 visual basic strptr 函数,加上对 copymemory windows api 的调用,以便将这些值转换为 visual basic 字符串。copymemory 是 windows api rtlmovememory 的别名。

用于 visual basic 的 sax2“快速入门”

我们现在可以开始在 visual basic 中编写“sax2 快速入门”的版本了。为了获得类似于 c++“快速入门”应用程序的结果,请使用下面的指令。注意不需要对 msxml 的引用。

  1. 创建 visual basic 标准 exe 工程。

  2. 添加对 xmlsax.tlb 文件的引用(包括在下载中)。

  3. 将下面的代码复制和粘贴到 visual basic form 代码窗口中(在粘贴代码后,在运行之前需要从代码中删除回车符)。

  4. 在窗体中添加 commandbutton (command1)

  5. 保存该工程。

  6. 如果它还没有存在,请将名为 test.xml 的正确 xml 文件放在保存工程的文件夹中。

  7. 在“调试”模式下运行工程。

  8. 单击 command1 按钮。

本文关键:SAX2 Visual Basic XML
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top