Lecture d'un fichier XML - ReadToDescendant(string)

Résolu
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 2 mai 2008 à 16:43
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 9 mai 2008 à 09:57
Bonjour,

J'aurais une petite question technique concernant la lecture d'un fichier XML et notamment de la méthode ReadToDescendant(string).
Je prendrais un exemple, cela sera plus simple.

Voici un fichier xml:


















Mon besoin: récupérer l'age de chaque personne masculine (si noeud existant).
Le fichier étant conséquent (500Mo), j'utilise la classe XmlTextReader.

while (reader.Read())//reader de type XmlTextReader
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
switch (reader.Name)
{
/*...*/
case "Person":
while (reader.MoveToNextAttribute()
&& reader.Name.Equals("Gender")
&& reader.Value.Equals("Male"))
{
//C'EST ICI que je veux aller à l'élément enfant Age si exsitant !!!
reader.MoveToContent();//Si je ne fais pas cette ligne, la prochaine instruction renvoie false
reader.ReadToDescendant("Age");
}
/*...*/
}
}
}
}

Ma question est:
Pourquoi l'on doit faire un MoveToContent() avant ?
Je me dis que c'est parce que le reader est sur des attributs et qu'il faut le placer sur un noeud mais j'avoue que c'est pas très clair dans ma tête.

J'avais essayé avec ReadToFollowing(string). Ca marche que si le noeud Age existe à chaque fois. Sinon, c'est la catastrophe ^^

Je fais donc appel à vous pour un cours, une explication ou une idée ^^

Merci beaucoup,


Billou_13

5 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
3 mai 2008 à 00:37
Salut,

C'est indiqué par la doc : ça va au noeud de contenu suivant, ça permet dans ton cas de passer les espaces.

Car tu n'as pas une structure (ce qui correspondrais au fichier sur une ligne)
XmlDeclaration
Element
Element
Element
EndElement
Element
EndElement
Element
Element
EndElement
EndElement

mais bel et bien
XmlDeclaration (xml)
Whitespace
Element (Persons)
Whitespace
Element (Person)
Whitespace
Element (Age)
Whitespace
EndElement (Person)
Whitespace
Element (Person)
EndElement (Person)
Whitespace
Element (Person)
Whitespace
Element (Age)
Whitespace
EndElement (Person)
Whitespace
EndElement (Persons)

/*
coq
MVP Visual C#
CoqBlog
*/
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 mai 2008 à 19:36
Je parlais de MoveToContent.
Et ton problème n'est pas de trouver le noeud suivant à partir de celui qui porte les attributs (le reader ne se place pas sur les attribut mais sur l'élément).
Et comme dit plus haut ton problème est que le noeud suivant est un noeud de type WhiteSpace et non pas Element.

/*
coq
MVP Visual C#
CoqBlog
*/
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
5 mai 2008 à 09:46
Salut,

Merci pour la réponse.

Je comprends bien que la méthode ReadToDescendant(...) va au noeud suivant. Mais cela, c'est en théorie (du moins pour moi).
Car le truc que je comprend pas, c'est pourquoi il faut exécuter la méthode MoveToContent() avant.
Pourquoi doit on revenir au noeud contenant avant de passer au suivant ?
Ne peut-il pas trouver le noeud suivant même lorsque l'on est dans un attribut de noeud ?

Bonne journée,


Billou_13
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
9 mai 2008 à 09:29
Ok, autant pour moi, je comprends mieux maintenant. Merci à toi,

Très bonne journée,


Billou_13

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
9 mai 2008 à 09:57
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/
Rejoignez-nous