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
No Visual Basic, crie um novo projeto EXE Padrão. O Form1 é criado por padrão.
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
No menu Projeto , clique em Referências. Na lista de referências disponíveis, selecione Microsoft XML, v3.0 ou posterior.
Execute o projeto. Nenhum XML foi retornado.
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")
Execute o projeto. Os nós XML são retornados.