Utiliser XPath pour interroger un espace de noms par défaut défini par l’utilisateur

Cet article explique comment utiliser XPath pour interroger un espace de noms par défaut défini par l’utilisateur et fournit du code pour reproduire le comportement.

Version d’origine du produit : Visual Basic
Numéro de la base de connaissances d’origine : 288147

Symptômes

Lorsque vous redéfinissez l’espace de noms par défaut dans le document XML, modifiez la propriété interne SelectionNamespaces de l’espace de noms par défaut, puis essayez d’utiliser par programme XPath pour retourner des nœuds à l’aide de la selectNodes méthode ou selectSingleNodes . Aucun nœud n’est retourné.

Résolution

Utilisez des préfixes avec les espaces de noms lorsque vous spécifiez la SelectionNamespaces propriété, ou utilisez des opérations de correspondance de modèle XSL (Extensible Stylesheet Language) au lieu de XPath.

Plus d’informations

Ce comportement est inhérent au produit.

L’implémentation de requêtes XPath sur domDocument nécessite que les espaces de noms soient déclarés dans le modèle DOM (Document Object Model) avant l’exécution des selectNodes méthodes ou selectSingleNode .

Procédures pour reproduire le problème

  1. En Visual Basic, créez un projet EXE Standard. Form1 est créé par défaut.

  2. Collez le code suivant dans l’événement 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. Dans le menu Projet , cliquez sur Références. Dans la liste des références disponibles, sélectionnez Microsoft XML, v3.0 ou version ultérieure.

  4. Exécutez le projet. Aucun code XML n’est retourné.

  5. Commentez les deux setProperty méthodes.

    Remarque

    Vous pouvez également modifier les deux lignes de code comme suit.

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. Exécutez le projet. Les nœuds XML sont retournés.

References

Comment spécifier un espace de noms lors de l’interrogation du DOM avec XPath