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 :

Probleme dans mon code recherche dans un fichier Xml


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut Probleme dans mon code recherche dans un fichier Xml
    Bonsoir,
    Je viens de faire un code pour cibler un noeux ce code est exécuté lors d'un onChange sur un combobox(CB_Id_Expert).

    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
     
    procedure TFenetre_termite.XMLExpert();
      var noeux: IXMLNode;
    begin
      noeux := XMLDocument1.DocumentElement;
      noeux := noeux.ChildNodes['expert'] ;
      if assigned(noeux) then
        begin
          if noeux.Attributes['Id'] = CB_Id_Expert.Text then
            begin                          
     
    MiseJourExpert(noeux.ChildNodes['nom'].Text,noeux.ChildNodes['prenom'].Text,noeux.ChildNodes['raison'].Text,noeux.ChildNodes['adresse'].Text,noeux.ChildNodes['codepostal'].Text,noeux.ChildNodes['commune'].Text,noeux.ChildNodes['assurance'].Text,noeux.ChildNodes['NBpolice'].Text);
     
            end
          else
            begin
              noeux := noeux.NextSibling;
            end;
        end;
    end;
    Dans un premier temps la fonction devrait trouver directement car elle tombe directement sur le bon noeud mais rien ne se passe.
    Puis je voulais faire une boucle mais je tombe sur un problème peut ton savoir le nombre de noeux qui existe du nom de expert.

    Je vous mets le fichier xml


    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <root>
    	<Expert id='de'>
    		<nom>deder</nom>
    		<prenom>fred</prenom>
    		<raison>LandRConsultants</raison>
    		<adresse>DS 309 -1,rue de l'arpajonnais</adresse>
    		<codepostal>91160</codepostal>
    		<commune>Saulx les chartreux</commune>
    		<assurance>SIACI</assurance>
    		<NBpolice>0066099</NBpolice>
    	</Expert>
     
    </root>

  2. #2
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    Tu gères ton document XML avec quoi ? OmniXML ou MSXML ?

    Néanmoins, je peux répondre à la seconde question. Tu peux récupérer une liste de nodes via Xpath et la fonction SelectNodes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var 
      nodes : IXMLNodeList;
      i := Integer;
    begin
      //Utilisation de la requête Xpath pour sélectionner le nom de chaque Expert
      nodes := xmlDoc.SelectNodes('//Expert/nom'); //xmlDoc : IXMLDocument
      for i:=0 to nodes.Length-1 do cbb1.Items.Add(nodes.Item[i].Text); //cbb1 : TComboBox;
    end;
    J'utilise une vieille version de omniXML, il faudra donc adapter un peu en fonction du parser utilisé.

    Une pist pour ton premier problème, c'est l'utilisation de la fonction similaire à SelectNodes, mais pour choisir un seul noeud : SelectSingleNode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var node : IXMLNode;
    begin
      node := xmlDoc.SelectSingleNode('//Expert/@id="'+cbb1.Text+'"');
     ...
    end;
    Petite explication : la requête Xpath est du genre 'Expert/@id="de"', qui va donc sélectionner le premier noeud (théoriquement le seul) 'Expert' possédant l'attribut id qui vaut "de" (@ désigne un attribut dans Xpath).

    J'espère avoir répondu à tes questions, mais si il y a toujours un problème, n'hésite pas

    edit : J'ai été trop vite...
    J'ai remarqué après coup que tu voulais lister les ID des experts, et pas leur nom...
    La requête Xpath à utiliser dans le SelectNodes n'est pas "//Expert/nom" mais "//Expert/@id", qui va donc lister tous les attributs 'id' des experts

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    merci beaucoup j'essaie dessuite. A oui j'utilise MSXML car je ne sais pas du tout ou trouver omni xml sinon je serais partant pour l'utiliser

  4. #4
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    Dans la partie Composants du site, je suppose que omniXML doit s'y trouver.

    Sinon, tu pourras t'aider du tuto que j'ai écrit sur MSXML et Delphi ici.

    Je trouve personnellement que OmniXML est plus simple d'emploi.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    merci beaucoup je regarde , j'essaie et si tout est bon je marque de resolu merci encore

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Encore une petite question est t'il possible que mon probleme ne fonctionne pas car j'utilise le composant XMLDocument ?
    Car Le SelectNodes est compris comme un identifiant non déclaré ....
    dsl d'etre un peu lourd

  7. #7
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    Juste !
    Tu emploies l'objet TXMLDocument, c'est ça ?
    Je n'utilise jamais ce composant, je le trouve assez limité. Je passe par les interfaces (IXMLDocument, IXMLDOMDocument).
    Si ton fichier XML ne sert que de base de données, à mon avis tu aurais mille fois plus simple d'utiliser les interfaces.

    Les fonctions SelectSingleNode et SelectNodes se trouvent sur le IXMLNode (ou IXMLDOMNode)

    C'est pour cela que omniXML est simple d'emploi. La création d'un document XML se fait via la fonction CreateDocument, et les fonctions SelectSingleNode et SelectNodes sont aussi disponibles.

    J'espère avoir répondu à ta question. Si ça ne va toujours pas, n'hésite pas

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    encore moi Big alors voila , après avoir repris ce que tu m'as dis et un peu le tutorial que tu as fait.
    J'arrive avec un code de ce genre .
    Je l'exécute lors que la Form est active.

    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
     
    procedure TFenetre_termite.XMLExpert();
    var
      xml : IXMLDOMDocument;
      nodes : IXMLDOMNodeList;
      i: integer;
    begin
      showmessage('fonctionne : 1');
      xml := CoDOMDocument.Create;
      xml.async :=false;
      xml.load('../gestionxml/Expert_info.xml');
      nodes := xml.selectNodes('//Expert/nom');
      showmessage('fonctionne : 2');
      for i:=0 to nodes.length-1  do begin
        showmessage('fonctionne : 3');
        CB_Id_Expert.Items.Add(nodes.Item[i].Text);
        showmessage(nodes.Item[i].Text);
      end;
    end;

    la hierarchie de mon application donne cela :

    dossier principale
    Code hierarchique : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                                 [application]
     
     
    [Exe]                        [GestionXML]               [Forms]              termite.dpr
     
    termite.exe       |      Expert_info.xml     |  Interface_Termite.dfm |
    ____________      |                          |   Interface_Aakey.pas  |

    Le probleme vient du fait que la boucle ne se lance pas , je me demande si le probleme ne vient pas au final, du faite que l'application ne trouverait pas mon fichier ?

  9. #9
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    je n'ai hélas pas Delphi sur le poste, je te dirai quoi demain certainement. Mais d'apès ce que j'ai vu, ton problème doit être simplement un problème de casse.
    En effet, XPath est sensible à la casse. Donc si tu lui donnes un chemin tel que ../gestionxml/Expert_info.xml, ton répertoire doit s'appeller gestionxml, et non gestionXML

    Essaies en faisant la modification. Si ça ne va pas, je regarderai demain ton code plus en détails

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Encore merci a tes réponses c'est bon j'avais oublier d'enlever un ";"

    Une dernière question que contient :
    Node := xml.SelectSingleNode('//Expert[@id="'+CB_Id_Expert.Text+'"]');
    si xml.SelectSingleNode('//Expert[@id="'+CB_Id_Expert.Text+'"]'); n'existe pas ?
    Je veux faire une condition dans le cas ou la nouvelle entrée n’existe pas sa enregistre sur le fichier xml à la suite si possible des anciens des noeux plus vieux.

  11. #11
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    Le noeud n'existe pas, tout simplement. Tu peux tester l'existence du noeud par Assigned()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if not Assigned(node) then ...
    Puis tu utilises DOM pour créer un noeud et ajouter les données dedans. Je te renvoie à mon tutoriel pour plus de détails.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Encore merci pour toutes ces explications

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

Discussions similaires

  1. [Débutant] Renommer fichier [Probleme dans mon code]
    Par mindhavok dans le forum VB.NET
    Réponses: 0
    Dernier message: 26/10/2011, 10h30
  2. erreur dans mon code ecriture dans un fichier
    Par baderahmed dans le forum ASP.NET
    Réponses: 4
    Dernier message: 11/10/2010, 17h55
  3. [DOM] java.lang.ClassCastException dans un code qui modifie un fichier XML
    Par RouRa22 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 21/12/2007, 16h21
  4. [VBA-E]Probleme dans mon code ??? merci de votre aide
    Par gregantibes dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/04/2006, 18h24
  5. Réponses: 5
    Dernier message: 25/04/2004, 00h57

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