XmlPathNavigator

Résolu
cs_titi66 Messages postés 120 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 3 mars 2009 - 25 mai 2005 à 15:14
micbristol Messages postés 36 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 24 février 2013 - 28 sept. 2009 à 17:19
bonjour

Je souhaite utiliser XmlPathNavigator pour me placer sur un noeud donné de mon fichier et en extraire les données.
Comment faire ?

12 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 mai 2005 à 15:17
Remplace
XPathNodeIterator Iterator = myXPathNavigator.Select(@"./book");
Par

XPathNodeIterator Iterator = myXPathNavigator.Select(@"bookstore/book");

Comme ça ça fonctionne...
Maintenant le tableau result ne va peut-être pas contenir ce que tu aimerais, car il y a plusieurs sous-élément à l'élément book. A toi de faire qu'il retourne ce que tu as envie...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 mai 2005 à 15:42
Hello,
Voici la procédure à suivre :

// Création d'un XPathDocument
XPathDocument doc = new XPathDocument(myXmlTextReader);
// Création d'un path navigator
XPathNavigator nav = doc.CreateNavigator();
// Descendre dans l'arborescence
XPathNodeIterator iter = nav.Select("page/header/title");
// Passer au noeud suivante
iter.MoveNext();
// Récupérer sa valeur
string item = iter.Current.Value;

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_titi66 Messages postés 120 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 3 mars 2009
25 mai 2005 à 16:22
Merci, mais en fait mon problème est de récupérer les valeurs en fonctions d'attribut

si dans l'exemple suivant je veux juste récupérer les Nemployes de l'entreprise Renault
je n'arrive pas filter uniquement sur renault

<Entreprise nom="Renault">
<Nemployes>140000</Nemployes>
<Entreprise nom="PSA">
<Nemployes>190000</Nemployes>

<Entreprise nom="Ford">
<Nemployes>390000</Nemployes>

Help
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 mai 2005 à 08:07
Bon dans ce cas tu peux faire une méthode Read() qui ressemble à peu près à ça (à toi de faire les ajustement nécessaire si besoin, j'ai fait ça rapidement) :

// Parsing de l'xml
private
void Read()
{
int i = 0;
XPathDocument xPathDoc = new XPathDocument("Test.xml");
// Doc à ouvrir
XPathNavigator xpn = xPathDoc.CreateNavigator(); // Navigator
XPathNodeIterator xpnIter = xpn.Select(@"......../Entreprise");
// Node qui nous intéresse

string[] result = new string[xpnIter.Count]; // Contient ce qui nous intéresse
while(xpnIter.MoveNext())
{
XPathNavigator curXpn = xpnIter.Current; // Node courrant
if(curXpn.GetAttribute("Nom", string.Empty).Equals("Ferrari") // Attribut qui nous intéresse
{
result[i] = curXpn.Value; // Met sa valeur dans le tableau
i++;
}
}

// Juste pour voir le contenu du tableau
foreach(string s in result) if(s != null) Console.WriteLine(s);
Console.ReadLine();
}

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0

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

Posez votre question
cs_titi66 Messages postés 120 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 3 mars 2009
26 mai 2005 à 12:12
Ok merci

Mais j'ai toujours un problème que je ne comprends pas : quelque soit le fichier Xml que j'utilise, je recupere toutes les valeurs de nodes (j'affiche xpnIter.current.value) , mais le xpnIter est toujours à 0
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 mai 2005 à 12:25
Car xpnIter.current.value retourne un string qui contient la valeur de tout les nodes enfants.


Regarde le code que je t'ai posté plus haut, j'utilise un itérator et j'appelle sa méthode MoveNext() pour le faire avancer au Node suivante...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_titi66 Messages postés 120 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 3 mars 2009
26 mai 2005 à 12:45
oui
j'ai utilisé ton code mais le xpnIter.Count est toujours à 0
il ne passe pas dans la boucle while ...il saute directement à foreach comme s'il n'y avait pas de node...
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 mai 2005 à 12:49
Copie colle ton fichier xml ainsi que le code que tu utilises s'il te plaît.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_titi66 Messages postés 120 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 3 mars 2009
26 mai 2005 à 13:55
Voici le code : j'ai gardé quasiment ton code.

XPathDocument myXPathDocument =
new XPathDocument(document);
MessageBox.Show("XPathDocument charg avec succs avec les donnes XML ...");


XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();
myXPathNavigator.MoveToRoot();



try


{




XPathNodeIterator Iterator = myXPathNavigator.Select(@"./book");

MessageBox.Show(Iterator.Current.Value+">"+Iterator.Count);

int i = 0;

string[] result =
new
string[Iterator.Count];
// Contient ce qui nous intéresse
while(Iterator.MoveNext())
{
XPathNavigator curXpn = Iterator.Current;
// Node courrant
if(curXpn.GetAttribute("genre",
string.Empty).Equals("novel"))
// Attribut qui nous intéresse
{
result[i] = curXpn.Value;
// Met sa valeur dans le tableau
i++;
}


}



foreach(
string s
in result)
if(s !=
null) MessageBox.Show(s);


}



catch (Exception ex)


{


MessageBox.Show("Exception: {0}"+ ex.ToString());


}


Et le fichier le + simple que j'utilise :c'est un fichier provenant des exemples microsoft
Quand je cherche book , le movenext ne marche pas




<?xml version ="1.0" ?>


[file:///C:/temp/Usines%20XMl/books2.xml# -] <bookstore>






[file:///C:/temp/Usines%20XMl/books2.xml# -] <book genre= " autobiography " publicationdate ="1981" ISBN= " 1-861003-11-0 ">






<title>The Autobiography of Benjamin Franklin</title>





[file:///C:/temp/Usines%20XMl/books2.xml# -] <author>






<first-name>Benjamin</first-name>





<last-name>Franklin</last-name>



</author>





<price>8.99</price>



</book>





[file:///C:/temp/Usines%20XMl/books2.xml# -] <book genre ="novel" publicationdate= " 1967 " ISBN ="0-201-63361-2">






<title>The Confidence Man</title>





[file:///C:/temp/Usines%20XMl/books2.xml# -] <author>






<first-name>Herman</first-name>





<last-name>Melville</last-name>



</author>





<price>11.99</price>



</book>





[file:///C:/temp/Usines%20XMl/books2.xml# -] <book genre= " philosophy " publicationdate ="1991" ISBN="1-861001-57-6">






<title>The Gorgias</title>





[file:///C:/temp/Usines%20XMl/books2.xml# -] <author>






<name>Plato</name>



</author>





<price>9.99</price>



</book>



</bookstore>
0
cs_titi66 Messages postés 120 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 3 mars 2009
26 mai 2005 à 17:24
merci
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 mai 2005 à 07:36
De rien

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
micbristol Messages postés 36 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 24 février 2013
28 sept. 2009 à 17:19
Salut j'espere que vous suivez toujours ce message car je bute sur un probleme similaire
mon xml et du genre

<conjugation-fr>
<template name="pr:endre">



endre








ends




ends




end




enons




enez




ennent








enais



etc..

je voudrais recuperer une a une les valeurs mais tout ce que j'arrive a avoir c'est la string contenant la veleur de tous les nodes enfants comme expliqué plus haut

meme avec la reponse accepter de Bidou, je n'y parviens pas :( , des idées ?

merci
0
Rejoignez-nous