Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Outils > XMLRAD
XMLRAD Environnement de développement Web XML/XSL. Avant de poster -> F.A.Q XMLRAD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2003, 17h43   #1
Membre éprouvé
 
Inscription : mars 2002
Messages : 516
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 516
Points : 483
Points : 483
Envoyer un message via MSN à Sylvain James
Par défaut Déroute sur IXMLCursor

re,

J'initialise de deux manières différentes une même grappe XML, soit en la chargeant à partir d'un fichier, soit en la modélisant par code.
Ensuite, j'applique un Select(XPath) sur cette grappe XML.
Selon le mode de création de la grappe, je n'obtiens pas le même résultat.

Cas pratique :

La grappe XML :

Code :
1
2
3
4
5
6
7
<GENXML>
<TYPEGEN>1</TYPEGEN>
<LSTID>
<ID>1</ID>
<ID>16</ID>
</LSTID>
</GENXML>
La première méthode :

Code :
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
var
  lstid, currentNode, res: IXMLCursor;
begin
  lstid := TXMLCursor.Create;
  lstid.Load('genXML.xml');
  res := lstid.Select('/GENXML/LSTID[ID="1"]');
end;
Ici : Res.Count me renvoie 1 ce qui est correct.

Maintenant si je peuple le même XML à mano :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
var
  lstid, currentNode, res: IXMLCursor;
begin
  lstid := TXMLCursor.Create;
  currentNode := lstid.AppendChild('GENXML', '');
  currentNode.AppendChild('TYPEGEN', '1');
  currentNode := currentNode.AppendChild('LSTID', '');
  currentNode.AppendChild('ID', '16');
  currentNode.AppendChild('ID', '1');
  res := lstid.Select('/GENXML/LSTID[ID="1"]');
end;
res.Count me renvoie 0. Très gênant et je ne vois pas où se trouve la coquille ?

Merci pour vos pistes bienvenues

Sylvain
__________________
.NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

Mon Blog : http://blog.developpez.com/index.php?blog=89
Mes Articles : http://sjames.developpez.com/
Rubrique XMLRAD: http://xmlrad.developpez.com
Sylvain James est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2003, 18h57   #2
Membre régulier
 
Inscription : janvier 2003
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 85
Points : 92
Points : 92
Par défaut Re: Déroute sur IXMLCursor

As tu vérifié le contenu de ta grappe XML construite à la mano ? Pour cela, un simple test pour vérifier le contenu :

Sinon, je te conseille d'utiliser des noms de variables bien distincts correspondant aux éléments de ta grappe XML. Voilà le code que j'aurai tapé moi pour construire la grappe XML à la mano :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
  GENXML: IXMLCursor;
  TYPEGEN: IXMLCursor;
  LSTID: IXMLCursor;
  ID: IXMLCursor;
  res: IXMLCursor;
begin
  GENXML := TXMLCursor.Create;
  GENXML.AppendChild('GENXML', '');
  TYPEGEN := GENXML.AppendChild('TYPEGEN', '1');
  LSTID := GENXML.AppendChild('LSTID', '1');
  ID := LSTID.AppendChild('ID', 16');
  ID := LSTID.AppendChild('ID', 1');
  res := GENXML.Select('LSTID[ID=''1'']');
  // ou GENXML.Select('/GENXML/LSTID[ID=''1'']');
end;
Je pense que ce qui ne fonctionne pas dans ton code c'est la ligne :

Code :
currentNode := currentNode.AppendChild('LSTID', '');
Anyway, le code que je t'ai fournis devrait correctement fonctionné. De plus, pas besoin de libérer les objects, car il y a un compteur de référence qui se charge de cela. XMLCursor c'est top cool !

A+
__________________
Julien C.
Julien C. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2003, 19h38   #3
Membre éprouvé
 
Inscription : mars 2002
Messages : 516
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 516
Points : 483
Points : 483
Envoyer un message via MSN à Sylvain James
Par défaut Re: Déroute sur IXMLCursor

Citation:
As tu vérifié le contenu de ta grappe XML construite à la mano ? Pour cela, un simple test pour vérifier le contenu :
Oui j'ai comparé les deux "sorties" XML. Identiques, à moins que je ne sois devenu borgne.
Je vais quand même par principe essayer ton code....
-------------------.......
Résultat négatif.

Merci,

Sylvain
__________________
.NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

Mon Blog : http://blog.developpez.com/index.php?blog=89
Mes Articles : http://sjames.developpez.com/
Rubrique XMLRAD: http://xmlrad.developpez.com
Sylvain James est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 01h06   #4
Membre éprouvé
 
Inscription : mars 2002
Messages : 516
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 516
Points : 483
Points : 483
Envoyer un message via MSN à Sylvain James
J'ai une piste inquiétante il me semble :

Selon l'ordre des ID dans le paquet XML, mon expression XPath me renvoie ou non le bon résultat :

Code :
1
2
3
4
5
6
7
<GENXML> 
<TYPEGEN>1</TYPEGEN> 
<LSTID> 
<ID>1</ID> 
<ID>16</ID> 
</LSTID> 
</GENXML>
en partant de ci dessus,

res := lstid.Select('/GENXML/LSTID[ID="1"]');
res.Count me renvoie 1, là ok.

Maintenant si on inverse l'ordre des ID dans la grappe XML :

Code :
1
2
3
4
5
6
7
<GENXML> 
<TYPEGEN>1</TYPEGEN> 
<LSTID> 
<ID>16</ID> 
<ID>1</ID> 
</LSTID> 
</GENXML>
res := lstid.Select('/GENXML/LSTID[ID="1"]');
res.Count me renvoie 0, pas marrant.

Finalement je viens de trouver une alternative en modifiant la requête XPath :

res := lstid.Select('/GENXML/LSTID/ID[.="1"]');
Et là ça fonctionne quelque soit la position de l'élément <ID>.

J'aime pas trop ces culbutes de processeur XSLT...style à faire perdre une demi journée

Sylvain
__________________
.NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

Mon Blog : http://blog.developpez.com/index.php?blog=89
Mes Articles : http://sjames.developpez.com/
Rubrique XMLRAD: http://xmlrad.developpez.com
Sylvain James est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 09h34   #5
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
il y a une grande différence entre
Code :
res := lstid.Select('/GENXML/LSTID[ID="1"]');
et
Code :
res := lstid.Select('/GENXML/LSTID/ID[.="1"]');
le première écriture permet de sélectionner un élement LSTID qui contient un élément ID avec une valeur de 1.
on utilise cette construction lorsque n a plusieurs LSTID, par exmple:
Code :
1
2
3
4
5
6
7
8
9
<LSTID>
  <ID>2</ID>
</LSTID>
<LSTID>
  <ID>1</ID>
</LSTID>
<LSTID>
  <ID>3</ID>
</LSTID>
dans mon exemple ta requête XPAth se porsitionnera sur le 2eme LSTID et non pas sur l'élément ID !

La deuxième écriture permet de se positionner sur l'ID ayant pour valeur 1 alors que précédemment on était seulement positionner sur LSTID.
[/quote]
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 10h30   #6
Membre éprouvé
 
Inscription : mars 2002
Messages : 516
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 516
Points : 483
Points : 483
Envoyer un message via MSN à Sylvain James
J'avais saisi la nuance entre les deux requêtes XPath, mais dans les deux cas, mon IXMLCursor.Count aurait du me renvoyer 1 en résultat, qu'il me renvoie un <LSTID> résultat, ou bien un <ID> résultat. Le fait est que dans mes exemples, il existe forcément soit un <ID> soit un <LSTID> résultat de ma requête XPath (selon les hypothèses sus indiquées), mais que IXMLCursor.Count reste égal à 0.
Alors que :
J'ai testé avec Xcelerator qui m'a confirmé les résultats que j'attendais, c'est à dire que les requêtes XPath avec Xcelerator me renvoient un résultat différent d'avec IXMLCursor (en fait avec le DOM encapsulé).

Merci pour tes précisions,

Sylvain
__________________
.NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

Mon Blog : http://blog.developpez.com/index.php?blog=89
Mes Articles : http://sjames.developpez.com/
Rubrique XMLRAD: http://xmlrad.developpez.com
Sylvain James est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 10h43   #7
Membre régulier
 
Inscription : janvier 2003
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 85
Points : 92
Points : 92
Sylvain,

Euh, je viens de tester ton code, et tout fonctionne correctement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  lstid, currentNode, res: IXMLCursor;
  test: string;
  count: integer;
begin
  lstid := TXMLCursor.Create; 
  currentNode := lstid.AppendChild('GENXML', ''); 
  currentNode.AppendChild('TYPEGEN', '1'); 
  currentNode := currentNode.AppendChild('LSTID', ''); 
  currentNode.AppendChild('ID', '16'); 
  currentNode.AppendChild('ID', '1'); 
  res := lstid.Select('/GENXML/LSTID[ID="1"]');
  test := lstid.XML;
  test := test;
  count := res.Count;
  count := count;
end;
J'ai bien "count=1"... Et ce, peu importe si je met l'ID qui a pour valeur 1 en premier ou en second... Quelle version du framework as-tu ? et quelle version de MSXML as tu ?
__________________
Julien C.
Julien C. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 13h54   #8
Membre éprouvé
 
Inscription : mars 2002
Messages : 516
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 516
Points : 483
Points : 483
Envoyer un message via MSN à Sylvain James
ah pas cool, chez moi ça fonctionne pas, ni sur ma station, ni sur mon portable.
Les deux machines fonctionnent avec la même version de XP Pro. Le portable est à jour avec les windows update, pas la station.

La version d'XMLRAD : 7.0.8.708

Les MSXML :

msxml.dll 8.0.6730.0 (station et portable)
msxml2.dll 8.1.7502.0 et 8.30.87.09 (portable)
msxml3.dll 8.20.8730.1 et 8.30.99.26 (portable)

Sylvain
__________________
.NET / ASP.NET MVC / Delphi / XMLRAD / XSL / Technos Web

Mon Blog : http://blog.developpez.com/index.php?blog=89
Mes Articles : http://sjames.developpez.com/
Rubrique XMLRAD: http://xmlrad.developpez.com
Sylvain James est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 14h01   #9
Membre régulier
 
Inscription : janvier 2003
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 85
Points : 92
Points : 92
Normalement, avec la version que t'as de XMLRAD, ce n'est plus MSXML version 3 qui est utilisée, mais la 4... Tentes une réinstallation d'XMLRAD pour voir, afin de bien réenregistrer les TLB etc..

RDM pourra surement t'apporter plus d'infos là dessus... Il est bcp plus compétent que moi pour tout ce qui concerne le framework et ses librairies
__________________
Julien C.
Julien C. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2003, 15h27   #10
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
MSXML4 c'est avec la RC2, les autres sont en MSXML3
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h51.


 
 
 
 
Partenaires

Hébergement Web