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 :
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>
Je cherche le noeud "category" dont l'attribut "name" a une certaine valeur (C1).

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

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

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