Usar o XPath para consultar um namespace padrão definido pelo usuário

Este artigo descreve como usar o XPath para consultar um namespace padrão definido pelo usuário e fornece código para reproduzir o comportamento.

Versão original do produto: Visual Basic
Número de KB original: 288147

Sintomas

Ao redefinir o namespace padrão no documento XML, altere a propriedade interna SelectionNamespaces para o namespace padrão e tente usar programaticamente o XPath para retornar nós usando o selectNodes método ou selectSingleNodes , nenhum nós é retornado.

Resolução

Use prefixos com os namespaces quando especificar a SelectionNamespaces propriedade ou use operações de correspondência de padrão XSL (Extensible Stylesheet Language) em vez de XPath.

Mais informações

Este é o comportamento padrão.

A implementação de consultas XPath em relação ao DOMDocument requer que os namespaces sejam declarados no DOM (Modelo de Objeto de Documento) antes que os selectNodes métodos ou selectSingleNode sejam executados.

Etapas para reproduzir o comportamento

  1. No Visual Basic, crie um novo projeto EXE Padrão. O Form1 é criado por padrão.

  2. Cole o código a seguir no Form_Unload() evento do 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. No menu Projeto , clique em Referências. Na lista de referências disponíveis, selecione Microsoft XML, v3.0 ou posterior.

  4. Execute o projeto. Nenhum XML foi retornado.

  5. Comente os dois setProperty métodos.

    Observação

    Como alternativa, você pode modificar as duas linhas de código da seguinte maneira.

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. Execute o projeto. Os nós XML são retornados.

Referências

Como especificar namespace ao consultar o DOM com o XPath