摘要:本文概述用 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 的样子: 好在新闻组的答复提供了一段处理这些参数的 visual basic 代码。该函数的简化版本如下。 xmlsax 接口返回 visual basic 整型数组,加上数组中的项目数。unicodearraytostring 函数使用未公开的 visual basic strptr 函数,加上对 copymemory windows api 的调用,以便将这些值转换为 visual basic 字符串。copymemory 是 windows api rtlmovememory 的别名。 用于 visual basic 的 sax2“快速入门”
我们现在可以开始在 visual basic 中编写“sax2 快速入门”的版本了。为了获得类似于 c++“快速入门”应用程序的结果,请使用下面的指令。注意不需要对 msxml 的引用。
martin naughton
2000年6月
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);
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