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

Langage Delphi Discussion :

lire attribut fichier xml


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Par défaut lire attribut fichier xml
    Bonjour,
    J'ai des petits soucis pour la lecture d'un fichier xml avec attributs.

    Voici le fichier xml :
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <club>
      <team id="Equipe1"/>
      <team id="Equipe2"/>
      <athlete>
        <nom>Paul</nom>
        <in-team ref="Equipe1"/>
      </athlete>
      <athlete>
        <nom>Nestor</nom>
        <in-team ref="Equipe2"/>
      </athlete>
      <athlete>
        <nom>Pierre</nom>
        <in-team ref="Equipe1"/>
        <in-team ref="Equipe2"/>
      </athlete>
    </club>
    Maintenant je dois lister les équipes et les athlètes qui appartiennent à leurs équipes (plusieurs possible).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      Node := XMLClub.DocumentElement;
      Node := Node.ChildNodes['team'];
      for i := 0 to Node.AttributeNodes.Count-1 do
        if (Node.HasAttribute('id')) then
          note:=Node.Attributes['id'];
    Ce bout de code me liste seulement Equipe1. Comment puis-je lister toutes les équipes puis les athlètes (en les ajoutant dans la bonne team) ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Par défaut
    Svp un petit coup de main
    Merci

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    Ton XML est très étrange !
    Si tu en as la possibilité, il faudrait vraiment le normaliser !

    n'oublie pas que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Node := Node.ChildNodes['team'];
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Node := Node.ChildNodes.Nodes['team'];
    ChildNodes.Nodes ne te renvoie que le Premier Team trouvé, c'est tout à fait normal !


    Je ne pense pas que "<in-team ref="..."/>" soit quelque chose d'automatique dans ton XML, c'est à toi de le gérer

    Imaginons que tu souhaites créer un arbre
    Tu dois d'abord parcourir <club>, en énumérant tous les noeuds de type Team et athlete
    Pour "Team", cela te donnera "Equipe1" et "Equipe2", tu crés un objet pour chacun (un XML n'étant pas ordonné, prévoir aussi la création lors d'un "<in-team ref="..."/>"
    Pour "athlete", tu crés un objet pour chaque noeud aussi, que tu as ajoutes à une collection de la forme Equipes[string ID] (TStringList et Objects), un code orienté patten tel qu'une "Instance Registry" te permettrait de faire cela facilement !

    Une optimisation du fichier qui permettrait de plus rapide distinguer les noeuds "team" des noeuds "athlete"

    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
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <club>
      <teams>
        <team id="Equipe1"/>
        <team id="Equipe2"/>
      <teams>
      <athletes>
        <athlete>
          <nom>Paul</nom>
          <in-team ref="Equipe1"/>
        </athlete>
        <athlete>
          <nom>Nestor</nom>
          <in-team ref="Equipe2"/>
        </athlete>
        <athlete>
          <nom>Pierre</nom>
          <in-team ref="Equipe1"/>
          <in-team ref="Equipe2"/>
        </athlete>
      </athletes>
    </club>
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    vive les .INI

    Code ini : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [CLUBS]
    ; liste des clubs
    1=club1
    [club1.teams]
    ; liste des équipes du 1er club
    1=Equipe1
    2=Equipe2
    [club1.athletes]
    ; liste des athlètes du premier club et de leurs équipes
    Paul=1
    Nestor=1,2
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Par défaut
    J'ai bien aimé le fichier ini mais j'ai un soucis pour affilier les athlètes dans le bon team (histoire de boucle). Difficile d'affilier l’athlète Nestor dans les 2 équipes.
    Voici mon bout de code :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    FileIni:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'/test_clubs.ini'); // Ouvre ou crée le fichier
     
     
      clubs := TStringList.Create;
      VAL := TStringList.Create;
      VAL_teams := TStringList.Create;
      VAL_athletes := TStringList.Create;
     
      FileIni.readsections('CLUBS',clubs);
      for i := 0 to clubs.Count-1 do
      begin
        nod := nil;
        FileIni.ReadSectionValues(clubs[i], VAL);
        for j := 0 to VAL.Count-1 do
        begin
          s:=Pos('=',VAL[j]);
          TreeView1.Items.AddChild(nod,(copy(VAL[j],s+1,Length(VAL[j])-1)));
     
          FileIni.ReadSectionValues(copy(VAL[j],s+1,Length(VAL[j])-1)+'.teams', VAL_teams);
          Node := TreeView1.Items[j];
          for z := 0 to VAL_teams.Count-1 do
          begin
            TreeView1.Items.AddChild(Node, VAL_teams[z]);
     
     
            Node := TreeView1.Items[j];
            for y := 0 to Node.Count-1 do
            begin
              Node1 := Node.Item[j];
              FileIni.ReadSectionValues(copy(VAL[j],s+1,Length(VAL[j])-1)+'.athletes', VAL_athletes);
     
              for x := 0 to VAL_athletes.Count-1 do
              begin
                s:=Pos('=',VAL_athletes[x]);
                name := copy(VAL_athletes[x],1,s-1);
                test := copy(VAL_athletes[x],s+1,Length(VAL_athletes[x])-1);
                for w := 0 to length(test)-1 do
                begin
                  if copy(Node.Item[y].Text,1,1) = copy(test,1,1) then
                  begin
                    TreeView1.Items.AddChild(Node.Item[y], name);
                    if Length(test) > 1 then
                      Delete(test,1,2);
                  end;
                end;
              end;
            end;
          end;
     
     
        end;
      end;
      Clubs.Free;
      VAL.Free;
      VAL_teams.Free;
      VAL_athletes.Free;
     
      FileIni.Free;
      TreeView1.FullExpand;
    Merci de votre aide

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Tu peux remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     s:=Pos('=',VAL[j]);
          TreeView1.Items.AddChild(nod,(copy(VAL[j],s+1,Length(VAL[j])-1)));
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      TreeView1.Items.AddChild(nod, Val.ValueFromIndex[j]);
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    alors le seul truc pas pratique avec les .INI c'est le "1=truc"

    souvent j'ajoute un "Count=x"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    [clubs]
    count=1
    1=Club1
    [club1.teams]
    Count=2
    1=Equipe1
    2=Equipe2
    [club1.athletes]
    Paul=1
    Jean=1,2
    sans le count, tu peux aussi boucler sur un entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      Index := 1;
      Club := Ini.ReadString('clubs', IntToStr(Index), '');
      while Club <> '' do
      begin
        ...
        Inc(Index); 
      end;,
    tu peux lire la liste des équipes d'un club de la même façon sur la liste des joueurs avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ReadSection(Club+.'athletes', Athletes);
    et les équipes de chaque joueur par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ReadString(Club + '.athletes', Atheltes[i], '');
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Lire un fichier XML et récupérer les valeurs d'attribut
    Par dinaing dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 18/06/2010, 15h53
  2. Créer et lire un fichier xml
    Par Bruno1905 dans le forum C++Builder
    Réponses: 14
    Dernier message: 13/06/2007, 11h11
  3. [DOM XML] Lire un fichier xml
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 07/12/2005, 22h36
  4. lire un fichier xml
    Par stephanie5 dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/11/2005, 16h34
  5. Comment lire un fichier XML ?
    Par jeromelef dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2005, 15h52

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