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
En Visual Basic, créez un projet EXE Standard. Form1 est créé par défaut.
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
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.
Exécutez le projet. Aucun code XML n’est retourné.
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")
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