IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XMLRAD Discussion :

Déroute sur IXMLCursor


Sujet :

XMLRAD

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 448
    Points
    1 448
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 85
    Points : 99
    Points
    99
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 448
    Points
    1 448
    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 :
    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

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 448
    Points
    1 448
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    il y a une grande différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res := lstid.Select('/GENXML/LSTID[ID="1"]');
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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]

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 448
    Points
    1 448
    Par défaut
    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

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 85
    Points : 99
    Points
    99
    Par défaut
    Sylvain,

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

    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
    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 ?

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 520
    Points : 1 448
    Points
    1 448
    Par défaut
    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

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 85
    Points : 99
    Points
    99
    Par défaut
    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

  10. #10
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    MSXML4 c'est avec la RC2, les autres sont en MSXML3

Discussions similaires

  1. Débat sur l'I.A (Intelligence Artificielle)
    Par Anonymous dans le forum Intelligence artificielle
    Réponses: 457
    Dernier message: 05/07/2016, 02h11
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 16h28
  3. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 14h59
  4. Réponses: 4
    Dernier message: 27/03/2002, 12h03
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo