使用 XPath 针对用户定义的默认命名空间进行查询

本文介绍如何使用 XPath 针对用户定义的默认命名空间进行查询,并提供用于重现行为的代码。

原始产品版本: Visual Basic
原始 KB 数: 288147

现象

在 XML 文档中重新定义默认命名空间时,请更改默认命名空间的内部 SelectionNamespaces 属性,然后尝试使用 XPath 以编程方式使用 selectNodesselectSingleNodes 方法返回节点,不会返回任何节点。

解决方法

指定SelectionNamespaces属性时,可以使用命名空间的前缀,或者使用可扩展样式表语言(XSL)的模式匹配操作,而不是XPath。

详细信息

此行为是特意这样设计的。

在执行selectNodesselectSingleNode方法之前,XPath 查询在实现过程中要求在文档对象模型(DOM)中声明命名空间。

重现行为的步骤

  1. 在 Visual Basic 中,创建新的 Standard EXE 项目。 Form1 是默认创建的。

  2. 将以下代码粘贴到 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
    
  3. 在“项目”菜单上,单击“引用” 。 从可用引用列表中选择Microsoft XML、v3.0 或更高版本。

  4. 运行该项目。 不返回任何 XML。

  5. 注释掉这两个setProperty方法。

    注意

    或者,可以按如下所示修改两行代码。

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. 运行该项目。 XML 节点已被返回。

参考

如何使用 XPath 查询 DOM 时指定命名空间