billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 2014
-
2 mai 2008 à 16:43
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDerniè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 ^^
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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)
cs_coq
Messages postés6351Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 201429 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 ?