Lire un fichier XML [Résolu]

snakzbenjy 32 Messages postés lundi 27 novembre 2006Date d'inscription 23 avril 2009 Dernière intervention - 8 avril 2008 à 14:47 - Dernière réponse : billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 8 avril 2008 à 17:05
3
Merci
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

Merci billou_13 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de billou_13
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 8 avril 2008 à 15:12
0
Merci
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
Commenter la réponse de billou_13
snakzbenjy 32 Messages postés lundi 27 novembre 2006Date d'inscription 23 avril 2009 Dernière intervention - 8 avril 2008 à 15:39
0
Merci
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
Commenter la réponse de snakzbenjy
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 8 avril 2008 à 16:04
0
Merci
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
Commenter la réponse de billou_13
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 8 avril 2008 à 16:15
0
Merci
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;
}
Commenter la réponse de billou_13
snakzbenjy 32 Messages postés lundi 27 novembre 2006Date d'inscription 23 avril 2009 Dernière intervention - 8 avril 2008 à 16:47
0
Merci
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
Commenter la réponse de snakzbenjy
snakzbenjy 32 Messages postés lundi 27 novembre 2006Date d'inscription 23 avril 2009 Dernière intervention - 8 avril 2008 à 16:49
0
Merci
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
Commenter la réponse de snakzbenjy
snakzbenjy 32 Messages postés lundi 27 novembre 2006Date d'inscription 23 avril 2009 Dernière intervention - 8 avril 2008 à 17:12
0
Merci
wouuuuuu c'est magique.

merci billou..

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

Benjy
Commenter la réponse de snakzbenjy
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 8 avril 2008 à 17:17
0
Merci
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
Commenter la réponse de billou_13

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.