Partager via


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 fournir du code pour reproduire le comportement.

Version du produit d’origine : Visual Basic
Numéro de 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 XPath de manière programmatique pour renvoyer des nœuds à l’aide de la méthode selectNodes ou selectSingleNodes, aucun nœud n’est renvoyé.

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 intentionnel.

L'implémentation de requêtes XPath sur le 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 méthodes selectNodes ou selectSingleNode.

Étapes à suivre pour reproduire le comportement

  1. Dans 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() 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.

Références

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