本文介绍如何使用 XPath 针对用户定义的默认命名空间进行查询,并提供用于重现行为的代码。
原始产品版本: Visual Basic
原始 KB 数: 288147
现象
在 XML 文档中重新定义默认命名空间时,请更改默认命名空间的内部 SelectionNamespaces
属性,然后尝试使用 XPath 以编程方式使用 selectNodes
或 selectSingleNodes
方法返回节点,不会返回任何节点。
解决方法
指定SelectionNamespaces
属性时,可以使用命名空间的前缀,或者使用可扩展样式表语言(XSL)的模式匹配操作,而不是XPath。
详细信息
此行为是特意这样设计的。
在执行selectNodes
或selectSingleNode
方法之前,XPath 查询在实现过程中要求在文档对象模型(DOM)中声明命名空间。
重现行为的步骤
在 Visual Basic 中,创建新的 Standard EXE 项目。 Form1 是默认创建的。
将以下代码粘贴到
Form_Unload()
Form1 事件中。' You can change the ProgID to reflect the installed version of the Microsoft XML Parser: ' For example, with MSXML 6, you would use: ' Dim xmlDom As MSXML2.DOMDocument60 Dim xmlDom As MSXML2.DOMDocument Dim nodeList As MSXML2.IXMLDOMNodeList Dim iNode As MSXML2.IXMLDOMNode ' For example, with MSXML 6, you would use: ' Set xmlDom = New MSXML2.DOMDocument60 Set xmlDom = New MSXML2.DOMDocument With xmlDom .async = False .loadXML "<?xml version='1.0'?>" & _ "<Root xmlns='uri:MyNameSpace'>" & _ " <Test>This is a Test</Test>" & _ "</Root>" .setProperty "SelectionLanguage", "XPath" .setProperty "SelectionNamespaces", "xmlns='uri:MyNameSpace'" Set nodeList = .selectNodes("//Test") End With For Each iNode In nodeList msgbox iNode.xml Next iNode
在“项目”菜单上,单击“引用” 。 从可用引用列表中选择Microsoft XML、v3.0 或更高版本。
运行该项目。 不返回任何 XML。
注释掉这两个
setProperty
方法。注意
或者,可以按如下所示修改两行代码。
.setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'" Set nodeList = .selectNodes("//myNS:Test")
运行该项目。 XML 节点已被返回。