Lecture d'un fichier XML - ReadToDescendant(string) [Résolu]

Signaler
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
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

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
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
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
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
*/
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
23
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
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
23
Ok, autant pour moi, je comprends mieux maintenant. Merci à toi,

Très bonne journée,


Billou_13
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/