Uso de XPath para realizar consultas en un espacio de nombres predeterminado definido por el usuario

En este artículo se describe cómo usar XPath para realizar consultas en un espacio de nombres predeterminado definido por el usuario y se proporciona código para reproducir el comportamiento.

Versión original del producto: Visual Basic
Número de KB original: 288147

Síntomas

Al volver a definir el espacio de nombres predeterminado en el documento XML, cambie la propiedad interna SelectionNamespaces del espacio de nombres predeterminado y, a continuación, intente usar XPath mediante programación para devolver nodos mediante el selectNodes método o selectSingleNodes , no se devuelve ningún nodo.

Resolución

Use prefijos con los espacios de nombres al especificar la SelectionNamespaces propiedad o use operaciones de coincidencia de patrones de lenguaje de hoja de estilos extensible (XSL) en lugar de XPath.

Más información

Este comportamiento es una característica del diseño de la aplicación.

La implementación de consultas XPath en DOMDocument requiere que los espacios de nombres se declaren en el modelo de objetos de documento (DOM) antes de que se ejecuten los selectNodes métodos o selectSingleNode .

Pasos para reproducir este comportamiento

  1. En Visual Basic, cree un nuevo proyecto EXE estándar. Form1 se crea de forma predeterminada.

  2. Pegue el código siguiente en el Form_Unload() evento 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. En el menú Proyecto , haga clic en Referencias. En la lista de referencias disponibles, seleccione Microsoft XML, v3.0 o posterior.

  4. Ejecute el proyecto. No se devuelve ningún XML.

  5. Comentar los dos setProperty métodos.

    Nota:

    Como alternativa, puede modificar las dos líneas de código como se indica a continuación.

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. Ejecute el proyecto. Se devuelven los nodos XML.

Referencias

Cómo especificar el espacio de nombres al consultar el DOM con XPath