Lire un fichier XML

Résolu
snakzbenjy Messages postés 32 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 23 avril 2009 - 8 avril 2008 à 14:47
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 8 avril 2008 à 17:17
Bonjour à tous,

Alors voilà j'ai un fichier XML de ce type la:
<?xml version= "1.0" ?>

[file:///D:/Benjamin/Exemples/XMLessai/XMLessai/bin/Debug/exemple.xml# - ]<root>

[file:///D:/Benjamin/Exemples/XMLessai/XMLessai/bin/Debug/exemple.xml# -]<Controls>

[file:///D:/Benjamin/Exemples/XMLessai/XMLessai/bin/Debug/exemple.xml# -]    <Control>

      <Type>ComboBox</Type>

     <Name>comboBox1</Name>

[file:///D:/Benjamin/Exemples/XMLessai/XMLessai/bin/Debug/exemple.xml# -]    <Values>

        <Value>Donnée combo 1</Value>

        <Value>Donnée combo 2</Value>

     <Value>Donnée combo 3</Value>

 </Values>

 </Control>

[file:///D:/Benjamin/Exemples/XMLessai/XMLessai/bin/Debug/exemple.xml# -]<Control>

 <Type>ListBox</Type>

 <Name>listBox1</Name>

[file:///D:/Benjamin/Exemples/XMLessai/XMLessai/bin/Debug/exemple.xml# -]<Values>

     <Value>Donnée liste 1</Value>

     <Value>Donnée liste 2</Value>

    <Value>Donnée liste 3</Value>

</Values>

</Control>
</Controls>

</root>

Je cherche à récupérer dans une listbox ses informations.
exemple:
                     ComboBox1
                        Donnée combo 1
                        Donnée combo 2
                        Donnée combo 3
                     ListBox1
                        Donnée liste 1
                        Donnée liste 2
                        Donnée liste 3

Voilà mon code:

private
int ReadXml(){

      XmlDocument doc =
new
XmlDocument();
       doc.Load(
"exemple.xml");

      XmlNodeList xNod = doc.SelectNodes(
"//Controls");
      
foreach (
object title
in xNod)      {

            XmlNodeList xNode = doc.SelectNodes(
"//Control");

            foreach (
XmlNode titlee
in xNode)            {

                  XmlNode xNodess = doc.SelectSingleNode(
"//Name");

                  string aa = xNodess.InnerText;

                  XmlNodeList xNodee = doc.SelectNodes(
"//Value");

                  foreach (
XmlNode titleee
in xNodee)                  {

                        XmlNode xNodeess = doc.SelectSingleNode(
"//Value");

                        string aaa = xNodeess.InnerText;                     }

               }

      }

return 1;
}

Donc enfaite je souhaite avoir dans ma variable "aa" le nom et dans ma variable "aaa" la valeur.
mais le problème c'est que en faite dans ma variable "aaa" il me nomme a la suite:

                        Donnée combo 1
                        
Donnée combo 2
                        Donnée combo 3

                        Donnée liste 1

                        Donnée liste 2

                        Donnée liste 3

C a d il ne tien pas compte des noeuds. Comment avoir que les valeurs du noeud du combobox

Merci à tous

benjy

9 réponses

billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 avril 2008 à 17:05
Bon, c'est la dernière cette fois-ci ^^
remplace les lignes suivantes:
XmlNodeList controlNodes = curControls.SelectNodes("//Control");
XmlNode curName = curControl.SelectSingleNode("/Name");
XmlNodeList valueNodes = curControl.SelectNodes("/Values/Value");

Par
XmlNodeList controlNodes = curControls.SelectNodes("./Control");
XmlNode curName = curControl.SelectSingleNode("./Name");
XmlNodeList valueNodes = curControl.SelectNodes("./Values/Value");

J'avais oublié le point. Ca faisait un bout de temps que j'avais pas touché au XML. Mais cette fois ci, j'ai testé !

Bonne soirée,

Billou_13
3
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 avril 2008 à 15:12
Salut,

Il ne faut pas faire:
doc.SelectNodes("//Value");
Car ceci va te donner tous les noeuds "Value" de ton document XML.

Le principe consiste à jour avec ta ligne :
XmlNodeList xNod = doc.SelectNodes("//Controls");
La liste te retourne tous les controls que tu souhaites.
Ensuite, tu peux prendre les valeurs souhaitées en faisant:
XmlNodeList xNodee = xNod.SelectNodes("/Values/Value");//Tu travailles avec ton noeud control uniquement

Voila le principe. Il ne faut pas jouer qu'avec le XmlDocument "doc". Il faut parcourir en profondeur :
1) Sélection de tous les controles
2) Sélection des valeurs de chaque noeud control

Bonne journée,

Billou_13
0
snakzbenjy Messages postés 32 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 23 avril 2009
8 avril 2008 à 15:39
Merci,

Je comprend le principe.
Le compilateur me dit que "XmlNodeList" le contient pas de définition pour "SelectNodes":

Imposible de faire:  XmlNodeList xNodee = xNod.SelectNodes("/Values/Value");

Tu sais pourquoi?

Merci.

Benjy
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 avril 2008 à 16:04
Oui pardon c'est exact ! Autant pour moi (faute d'inattention) !
Tu ne peux sélectionner un XPath pour une liste de noeud car il ne sera pas sur quel noeud recherché ^^.

Il faut faire:

XmlNodeList xNod = doc.SelectNodes("//Controls");
foreach (XmlNode curNode in xNod)
{
//... Ton code

XmlNodeList xNodee = curNode.SelectNodes("/Values/Value");//Sur le noeud parcouru
}

Et en plus, c'est plus pratique (et spécifique) que :
foreach (object title in xNod)

Bon courage,

Billou_13
0

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

Posez votre question
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 avril 2008 à 16:15
Décidement, je suis abonné aux petites fautes. Je te propose donc refaire le parcours complet du code ^^. Tu m'en voudras pas j'espère :

privateint ReadXml()
{
XmlDocument doc = newXmlDocument();
doc.Load("exemple.xml");

//Récupération de tous les noeuds 'Controls'
XmlNodeList controlsNodes = doc.SelectNodes("//Controls");
foreach (XmlNode curControls in controlsNodes)
{
//Récupération de tous les noeuds 'Control'
XmlNodeList controlNodes = curControls.SelectNodes("//Control");
foreach (XmlNode curControl in controlNodes)
{
//Récupération du noeud 'Name'
XmlNode curName = curControl.SelectSingleNode("/Name");
string name = curName.InnerText;

//Récupération de tous les noeuds 'Value'
XmlNodeList valueNodes = curControl.SelectNodes("/Values/Value");
foreach (XmlNode curValue in valueNodes)
{
string value = curValue.InnerText;
}
}
}
return 1;
}
0
snakzbenjy Messages postés 32 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 23 avril 2009
8 avril 2008 à 16:47
Non je ne t'en veux pas ^^

Je ne sais pas si tu l'as testé mais il ne récupére pas le noeud "Name".

                //Récupération du noeud 'Name'
                  XmlNode curName = curControl.SelectSingleNode("/Name");
                  string name = curName.InnerText;

Quand je débug il n'y a rien dans curName.

Dans le chemin il y a qu'un seul slach? ("//Name"); ou ("Name"); ??

merci

Benjy
0
snakzbenjy Messages postés 32 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 23 avril 2009
8 avril 2008 à 16:49
Je répond à ma question tout seul!

ce n'est pas ("//Name");

Sinon il reprend le chemin complet.

Pourquoi ca ne marche pas sinon?

Il compile aucune erreur mais il n'y a rien dans curName
0
snakzbenjy Messages postés 32 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 23 avril 2009
8 avril 2008 à 17:12
wouuuuuu c'est magique.

merci billou..

Désoler de t'avoir fait replongé dedans ^^

Benjy
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 avril 2008 à 17:17
Pour être plus clair et synthétique sur les différentes valeur XPath (dans XmlNode.SelectNodes(xpath); :
1) //node indique que tu cherches les noeuds "node" quelque que soit la hiérarchie de profondeur.
2) ./node indique que tu cherches les noeuds fils "node" uniquement (n-1 en gros)

./ est donc plus adapté que // dans ton cas.

Et tu peux faire bien plus et beaucoup plus puissant. Je te conseilles pour cela fortement de regarder le tutorial très bien fait de Bidou:
http://www.csharpfr.com/tutorial.aspx?id=536

Bonne soirée,

Billou_13
0
Rejoignez-nous