Cómo utilizar XPath para la consulta en un espacio de nombres predeterminado definido por el usuario


Síntomas


Al redefinir el espacio de nombres predeterminado en el documento XML, cambie la propiedad SelectionNamespaces interna para el espacio de nombres predeterminado y, a continuación, intente utilizar mediante programación XPath para devolver los nodos utilizando el método selectNodes o selectSingleNodes , no hay nodos se devuelven.

Solución


O bien utilizar prefijos con los espacios de nombres al especificar la propiedad SelectionNamespaces , o utilizar operaciones de coincidencia de modelos de lenguaje ampliable (XSL) en lugar de XPath.

Más información


Este comportamiento es por diseño.

Implementación de consultas XPath contra DOMDocument requiere que los espacios de nombres se declara en el Document Object Model (DOM) antes de ejecutan los métodos selectNodes o selectSingleNode .

Pasos para reproducir el comportamiento

  1. En Visual Basic, cree un nuevo proyecto EXE estándar. Se creará Form1 de forma predeterminada.
  2. Pegue el código siguiente en el evento Form_Unload() de 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 hay XML se devuelve.
  5. Comente los dos métodos setProperty . Nota: como alternativa, puede modificar las dos líneas de código como sigue.
            .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"        Set nodeList = .selectNodes("//myNS:Test")

  6. Ejecute el proyecto. Se devuelven los nodos XML.

REFERENCIAS

Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:

294797 cómo especificar el espacio de nombres cuando se consulta el DOM con XPath