Parcourir fichier XML [Résolu]

marvenjabloun 7 Messages postés mardi 3 avril 2007Date d'inscription 3 juin 2007 Dernière intervention - 16 mai 2007 à 17:01 - Dernière réponse : cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention
- 17 mai 2007 à 09:07
salut tou le monde

voila j ai cette fichier xml  qui s appelle classe.xml la voila :

<?xml version= "1.0" encoding="iso-8859-1" ?>






[file:///C:/Documents%20and%20Settings/Administrateur/Bureau/Eprofilea/Fichiers%20systeme/Parametres/Classes.xml#

-

]

<


ClassesEprofilea


>









[file:///C:/Documents%20and%20Settings/Administrateur/Bureau/Eprofilea/Fichiers%20systeme/Parametres/Classes.xml#

-

]

<


Classe
instituteur


="

Marie

"


annee


="

2004/2005

"


niveau


= "

CM1

"
>











 




 



<


Eleve


prenom


="

Maud

"


nomAbrege


= "


"


nom


="

Roger

"
/>











 



<


Eleve


prenom


="

Maxime

"


nomAbrege


= "

B

"


nom


="

Bernard

"
/>









 



</


Classe


>











[file:///C:/Documents%20and%20Settings/Administrateur/Bureau/Eprofilea/Fichiers%20systeme/Parametres/Classes.xml#

-

]

<


Classe
instituteur


= "

Marie

"


annee


="

2003/2004

"


niveau


= "

CE2

"
>











 



<


Eleve


prenom


="

Allan

"


nomAbrege


= "


"


nom


="


"
/>











 



<


Eleve


prenom


="

Alexandre

"


nomAbrege


="


"


nom


="


"
/>























 



</


Classe


>













 




 



</


ClassesEprofilea


>

 


 














En effet je veux remplir un check list box par les noms et les prenoms des eleves contenu dans le fichiers xml classes.xml









et je pense ke j ai un probleme d acceder a ces valeur voila la procedure que j essaye d utiliser j espere que vous puissiez localiser la faute  ( l erreur qui se genere est : ACCESS VIOLATION AT ADRESS 004C7AA9 IN MODULE REGARD.EXE  c est  l erreur que je rencontre le plus souvent et qui me demoralise beaucoup)
ou proposer une autre solution aussi









procedure TFaccess.remplissage(Sender: TObject);









var
 eleve:ixmlnode;
   i ,k : integer;
prenomeleve,prenomnomeleve,nomeleve: string;
begin









{\\charger le fichier classe.xml}









 XMLClasses.LoadFromFile(ExtractFilePath(Application.ExeName)
    + FichierClasse) ;











 








{\\lire les valeurs des attributs nom et prenom de noeud eleve}









for i := 0 to XMLClasses.DocumentElement.ChildNodes.Count -1 do



begin








eleve:= FFonctionsUtiles.GetChildNodeByName( XMLClasses.DocumentElement.ChildNodes.Nodes[i],'eleve');






k:=0;
while eleve<>nil  do











\\recuperer
les valeurs d attribut



    nomeleve := eleve.ChildNodes.Nodes[k].AttributeNodes.
      FindNode(nom).Text;
     prenomeleve:= eleve.ChildNodes.Nodes[k].AttributeNodes.
      FindNode(prenom).Text;










k:=k+1;
end;









  







\\l
affichage (j ai pas de probleme la dedan)



    nomprenomeleve := prenomeleve+'  '+ nomeleve  ;













 







    j := 0;
    while j < CheckListBoxapprenant.Items.Count do
      if CheckListBoxapprenant.Items[j] = nomprenomeleve
      then j := CheckListBoxapprenant.Items.Count + 1
      else inc(j);
    if j <> CheckListBoxapprenant.Items.Count + 1
    then CheckListBoxapprenant.Items.Add(nomprenomeleve);
  end;
  
end;









 
Afficher la suite 

3 réponses

Répondre au sujet
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 17 mai 2007 à 09:07
+3
Utile
salut,

t'as plusieurs trucs que tu peux simplifier pas mal. Ensuite, tu verra plus clair...

je te pose un "algo" en pascal. (cad que je ne l'ai pas compiler, ni tester)

var

 NodeClass, NodeEleve : IXMLNode;
 i,k : integer;

begin
...
checklistbox.items.Clear;
for i := 0 to XMLClasses.DocumentElement.ChildNodes.Count -1 do begin
  NodeClass := XMLClasses.DocumentElement.ChildNodes.getNode(i);

  ClasssNiveau := NodeClass.Atributs['Niveau'];

  for k := o to nodeClass.ChildNodes.Count-1 do beign
    NodeEleve := nodeClass.ChildNodes.GetNode(k);

    nomEleve := NodeEleve.Attributs['nom'];
    prenomEleve := NodeEleve.Attributs['prenom'];

    AfficherEleve(nomEleve, prenomEleve, ClassNiveau);

  end;//for eleve

end; //for class

end;//procedure Xxxx

procedure AfficherEleve (nomEleve, prenomEleve, ClassNiveau : string);
begin
  checklistbox.items.add(Prenomeleve + ' ' + nomEleve + ' ( membre de ' + ClassNiveau + ')');
end;

deux trois conseils:
- UN post par question/problème stp. sinon on ne s'en sort plus ici...
- le GetChildNodeByName n'est pas utile pour toi.
- pour les commentaires : //Xxxx  ou {Xxx} pas besoins de combiner les symbole
- evite d'utiliser plus d'un nom/description pour designer la même choses ! (eleve == apprenant)
- lit bien l'aide de Delphi sur un compo quand tu ne le connait pas. Regarde (au moin brièvement) la description de chaque property/methode.
- lit des exemple de code pour voir/comprend les technique possible.
- et un oeil ici: http://www.delphifr.com/codes/LIRE-ECRIRE-XML-DEPUIS-UNITE_39531.aspx il y a quelques methode utilitaire pour lire un fichier xml (TryGetAttribut, ...) Cela t'aidera peut-être a comprendre deux-trois trucs.
- lit l'aide de Delphi pour activer le debugage. ce qui te permet de savoir ou dans ton code est ton erreur. (option de projet : compiler : info de debug, local symbole, sans optimisation) et option : debuger option : arreter sur exception, utiliser le debugger integré, ...)

on voit que tu te donne de la peine, mais fait plus de recherche avant de coder. Tu te simplifiera la vie...

bon code,

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Loda
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 16 mai 2007 à 17:23
0
Utile
Bonjour,
Et en débogage, cela plante où ?

Sinon, dans l'ide , quand tu as ce message d'erreur :'Chercher' puis 'Erreur d'exécution' et tu rentres l'adresse de l'erreur .

Dom
Commenter la réponse de dominique.stock
marvenjabloun 7 Messages postés mardi 3 avril 2007Date d'inscription 3 juin 2007 Dernière intervention - 16 mai 2007 à 18:34
0
Utile
En effet,j ai plus d erreur de violation d acces des que j ai mis le test  eleve<>nil de boucle while  mais  le probleme c qu 'il prend eleve toujours pour nil c a dire je peu pas recuperer le noeud eleve et apparament c ça le probleme moi j ai utiliser dans le code ci dessus la fonction GetChildNodeByName dont voila le code:
{ **************************************************************************** }
{ Function GetChildNodeByName                             }
{                                                                              }
{ Paramètre :   Node, racine de l'arbre XML                                    }
{               ChildNodeName, nom du noeud cherché                            }
{                                                                              }
{ Retourne un noeud de l'arbre XML dont on donne le nom. Retourne NULL si le   }
{ noeud n'est pas dans l'arbre.                                                }
{                                                                              }
{ **************************************************************************** }
function TFFonctionsUtiles.GetChildNodeByName(Node : IXMLNode; ChildNodeName
  : string) : IXMLNode;
var j: Integer;
    res: IXMLNode;
begin
  j := 0;
  res := nil;
  with Node.ChildNodes do
  begin
    res := FindNode(ChildNodeName);
    while (res = nil) and (j < Count) do
    begin
      res := GetChildNodeByName(Nodes[j], ChildNodeName);
      j := j + 1;
    end;
    GetChildNodeByName := res;
  end;
end;

cette fonction est validé et j ai deja testé (c pas moi qui a ecrit)
mais generalment si on a un fichierXMl comme la mienne la au dessu si je veux reccuperer les valeur des attributs de balise eleve comment on fait ???
Commenter la réponse de marvenjabloun

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.