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

Delphi Discussion :

[xml-Xpath] Navigation dans une NodeList


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 31
    Points : 18
    Points
    18
    Par défaut [xml-Xpath] Navigation dans une NodeList
    Bonjour,

    J'essais de naviguer dans une NodeList avec XPath. Je bute sur un problème qui m'arrache les cheveux :

    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
     
     
    Nodes := SourceXML.SelectNodes(//pictos/picto); //Requete Xpath - OK
     
    EditInfo.Text := IntToStr(Nodes.length); //J'ai 11 nodes - OK
     
    //j'affiche le tout pour verifier - OK
     
    For i:=0 To nodes.length-1  Do
    Begin
        MemoXML.Lines.Add(Nodes.item[i].xml);
    End;
     
    //Maintenant j'essais de récupérer la valeur d'une
    //Node spécifique (ex: la node '5') dans ma node list
    //Là ca coince ??
     
    NodeAttrib := Nodes.item[5].selectSingleNode('//lon'); //Pas bon ??
    MemoXML.Lines.Add(NodeAttrib.text);
    Cette commande me renvoi toujours la valeur de la node '0'
    alors que je pense être positionné dans '5' ?? Ca me semble si logique ?
    Cela réagit comme si je faisait une requete sur tout le document ?

    Pourquoi ca ne fonctionne pas ? Dans le tuto de BIG, il fait une chose similaire (dans une boucle... c'est ma prochaine étape) et ca fonctionne ?

    http://big.developpez.com/delphi/xml/msxml/#LIV

    Pouvez vous m'aider ?

    voici un exemple de mon XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <pictos>
    <picto>
      <id>P1</id> 
      <lon>5.69172</lon> 
      <lat>44.33424</lat> 
       </picto>
    <picto>
      <id>P2</id> 
      <lon>-1.37379</lon> 
      <lat>43.08170</lat> 
      </picto>
    </pictos>

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 587
    Points : 25 263
    Points
    25 263
    Par défaut
    Je suis assez novice en XML, j'ai toujours utilisé le XMLDocuments comme un TreeNode, donc le XPath, je n'ai pas encore pratiqué

    je pense qu'il ne sait pas le node qu'il faut prendre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <pictos>
      <picto name=one>
        <id>P1</id> 
        <lon>5.69172</lon> 
        <lat>44.33424</lat> 
      </picto> 
      <picto name=one>
        <id>P2</id> 
        <lon>-1.37379</lon> 
        <lat>43.08170</lat> 
      </picto>
    </pictos>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NodeAttrib := Nodes.item[5].selectSingleNode('../lon/'); ???

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    ton code m'a l'air correct
    Tu pourrais nous montrer les types de tes variables ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    bien tenté ShaiLeTroll, mais ca ne fonctionne pas. Malheuresement cette requette ne renvoi rien..

    TicTacTao, voici le type de mes variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NodeAttrib: IXMLDOMNode;
    Nodes : IXMLDOMNodeList;
     
    SourceXML: IXMLDOMDocument;
    SorceXML := CoDOMDocument.Create
    Merci de votre aide.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    je continue les tests et je deviens fou !!

    si je fais différement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    NodeAttrib := Nodes.item[5]; // OK
     
     
    //Ensuite j'affiche pour voir, je vois l'unique node selectionnée !
     
    MemoXML.Lines.Add(NodeAttrib.xml);
     
    //Petite requete dans la node
     
    MemoXML.Lines.Add(NodeAttrib.selectSingleNode('//id').text); // PAS BON
    Magique alors que NodeAttrib.xml ne contient qu'une seule node
    La requete ci-dessus me retourne toujours l'id de la node '0' de mon document XML ? Je comprend pas d'où il peut ramener ca !

    Je peux m'en sortir avec le contournement si dessous, mais cela m'oblige a vérifier le nom de chaque node avant de la récupérer pour être sur que l'ordre des items dans la node n'a pas changé... Ca fait du code lourd à la place d'une simple requette...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    For j:=0 To NodeAttrib.childNodes.length-1 Do
    Begin
      MemoXML.Lines.Add(NodeAttrib.childNodes.item[j].text);
    End;

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    oui surtout que ces requetes sont justement là pour éviter ce type de conditions...

    le seul moyen que je vois pour que l'on puisse t'aider, c'est que tu fasses un mini projet, avec uniquement le code nécessaire pour lancer ta requete et la coller dans le mémo, avec le fichier xml joint bien sur...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Voilà ... en pièce jointe.

    Merci encore pour votre aide.

  8. #8
    Membre émérite Avatar de Cpt Anderson
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 625
    Points : 2 479
    Points
    2 479
    Par défaut
    Essaie:

    MemoXML.Lines.Add(NodeAttrib.selectSingleNode('id').text)

  9. #9
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    je crois comprendre maintenant

    Essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nodes.item[i].selectSingleNode('./id');
    pour récupérer tes sous-noeuds de chaque noeud <picto>

    le '.' te permet de partir du noeud courant puis de redescendre...
    le '//' à une autre signification et recherche partout

    Donc avec un Single, il fait une recherche 'partout' et renvoie systématiquement le 1er, normal

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    MERCI !!!

    Ca fonctionne

    RESOLU DONC !

    Merci à tous...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XPath] Probleme dans une requete XPath
    Par kalmless21 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 03/07/2006, 22h22
  2. [XML-XPATH] Problème dans un for each
    Par stailer dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/12/2005, 12h11
  3. Probleme ascensseur / barre de navigation dans une page
    Par bixi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 12/12/2005, 14h56
  4. Réponses: 8
    Dernier message: 09/07/2005, 23h10
  5. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 18h55

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