XmlPathNavigator

[Résolu]
Signaler
Messages postés
120
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
3 mars 2009
-
Messages postés
36
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
24 février 2013
-
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

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
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
Messages postés
120
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
3 mars 2009

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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
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
Messages postés
120
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
3 mars 2009

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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
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
Messages postés
120
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
3 mars 2009

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...
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
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
Messages postés
120
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
3 mars 2009

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>
Messages postés
120
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
3 mars 2009

merci
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
De rien

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
36
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
24 février 2013

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