Bonjour
J'ai quelques soucis de requête XPath via la dll MSXML6 ; le tout sous Delphi XE. Je ne parviens pas à comprendre.
Voici mon xml :
Je cherche le noeud "category" dont l'attribut "name" a une certaine valeur (C1).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?xml version="1.0" encoding="ISO-8859-1"?> <project xmlns="http://developpez.net"> <categories> <category name="C1" label="Category n°1" /> </categories> </project>
Et voici le type de code Delphi qui me sert à tester. Il fonctionne "comme prévu" jusqu'à la ligne 23 comprise : le noeud "categories" est bien trouvé. Les lignes suivantes renvoient toutes une valeur "nil".
J'ai suspecté d'éventuels problèmes de simple ou double quotes ; de namespace (j'ai bien défini ma propriété 'selectionNamespaces'), de langage...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 procedure Test(); const C_XML= '<?xml version="1.0" encoding="ISO-8859-1"?> '+ '<project xmlns="http://developpez.net"> '+ ' <categories>'+ ' <category name="C1" label="Category n°1" />'+ ' </categories>'+ '</project>'; C_Namespace='xmlns:fm="http://developpez.net"'; var Doc: IXMLDOMDocument2; rNode_Categories,rNode_Category: IXMLDOMNode; i: Integer; begin Doc := CoDOMDocument60.Create; try Doc.async := false; Doc.loadxml(C_XML); Doc.setProperty('SelectionNamespaces',C_Namespace); rNode_Categories := Doc.documentElement.SelectSingleNode('fm:categories'); rNode_Category := rNode_Categories.selectSingleNode('/*[@name=''C1'']'); rNode_Category := rNode_Categories.selectSingleNode('/*[@fm:name=''C1'']'); rNode_Category := rNode_Categories.selectSingleNode('/fm:*[@name=''C1'']'); rNode_Category := rNode_Categories.selectSingleNode('/fm:*[@fm:name=''C1'']'); rNode_Category := rNode_Categories.selectSingleNode('/*[@name="C1"]'); rNode_Category := rNode_Categories.selectSingleNode('/*[@fm:name="C1"]'); rNode_Category := rNode_Categories.selectSingleNode('/fm:*[@name="C1"]'); rNode_Category := rNode_Categories.selectSingleNode('/fm:*[@fm:name="C1"]'); finally Doc := nil; end; end;
A ce propos, le débuggeur de Delphi pète un cable : la ligne 23 executée me renvoie bien un pointeur non "nil". En revanche, si j'évalue la ligne (CtrL+F7), la valeur retournée est ... nil.
Si quelqu'un a une idée, merci d'avance
Partager