Nombre de lignes du fichier XML

Signaler
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonjour tout le monde, je suis en train de développer un
petit projet perso, et je me heurte à quelques problèmes.


J'analyse un fichier xml (valide) de type :





<?xml version= "1.0"
encoding= "ISO-8859-1"?>
<ordinateur id =" 123 ">
      <moniteur>ASUS</moniteur>
      aze">
           
<carte_mere id = "ASUSTEK">
                 
<carte_reseau>Ethernet 10/100</carte_reseau>
                 
<lecteur_dvd>Oui</lecteur_dvd>
                 
<lecteur_disquette>Non</lecteur_disquette>
                 
<disque_dur>Maxtor 100 Go</disque_dur>
                 
<carte_video>ATI X700 128 Mbits</carte_video>
                 
AMD 1700 Mhz

           
</carte_mere>
     
      <clavier>APM type azerty</clavier>
      <souris>APM optique</souris>
</ordinateur>


 


J'aimerai récupérer le nombre de ligne qui ne possèdent pas
de fils, le total = 12 pour cet exemple (id en fait partie).






J'ai actuellement le code suivant, mais pour
des raisons que j'ignore, il ne fonctionne pas L







XmlDataDocument xmlDoc = new XmlDataDocument();
xmlDoc.DataSet.ReadXml("test.xml");





int nbTables xmlDoc.DataSet.Tables.Count; // fonctionne (ici 3)






int


rows
= 0;









for


(int x = 0; x < nbTables; x++)









{










rows + = xmlDoc.DataSet.Tables[0].Rows.Count;









}







Ici, la valeur de rows après la boucle est égale à 3 !!!








Si l’un de vous a une solution, merci de m'aider au plus
vite



Néo020585






La programmation, c'est l'art de découvrir

14 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
Salut,

Avec XPath :
//*[count(*)=0]

Tu peux utiliser cette requête pour récupérer la liste des noeuds n'ayant pas d'enfants, mais dans ton exemple il y en a 9, pas 12.

/*
coq
MVP Visual C#
*/
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
C'est rigolo, moi j'en compte 8

VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Ha non tiens, y'en a un que j'avais pas vu
J'vais encore aller dormir un 'tit coup j'crois!

VC# forever
=13319
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
lol

/*
coq
MVP Visual C#
*/
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
4
Cod : Pour info, les 3 champs que tu ne compte pas sont les champs ID.
Lorsque l'on charge le xml dans un datagrid afin de voir le nombre de ligne, elles en font partie !

N'existe-t-il pas un moyen en C# de récupérer le nombre de ligne du dataset ???

Néo020585

La programmation, c'est l'art de découvrir
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
4
en fa   it je me suis planté, c pas Cod mais COQ

Néo020585

La programmation, c'est l'art de découvrir
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Ben je vois pas d'autres solutions que de faire l'addition du nombre de ligne de chaque tables :
int rowCount = 0;

foreach(
DataTable dt
in ds.Tables) rowCount += dt.Rows.Count;

où ds représente le DataSet.

VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
D'ailleurs, je viens de constater que ton exemple plus haut est faux, et c'est pour que ça la valeur ne joue pas. Tu fais :
int rows 0;<?XML:NAMESPACE PREFIX U1 /?> <?XML:NAMESPACE PREFIX = O /?>

for (int x = 0; x < nbTables; x++)

{
   rows + = xmlDoc.DataSet.Tables[0].Rows.Count;
}

alors qu'il faut mettre :

int rows = 0;

for (int x = 0; x < nbTables; x++)

{
   rows += xmlDoc.DataSet.Tables[ x ].Rows.Count;
}

<hr size ="2" />VC# forever
/infomsg/auteurdetail.aspx?ID=13319
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
4
Bidou : Je viens d'essayer ta méthode du foreach, mais elle ne fonctionne pas meiux, elle me renvoi toujours 3.
De plus, je me suis trompé quand j'ai recopier mon bout de code, et c bien un x que j'ai mis pour le Rows.Count.
Mon résultat de change toujours pas, j'obtient 3 pour ce fichier.

Néo020585

La programmation, c'est l'art de découvrir
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Je ne comprend pas pourquoi tu parles de fichier, on parle bien d'un DataSet non?
Tu charges le DataSet (avec méthode LoadXml) ou bien quoi?

Si oui, soit certain que le contenu du DataSet est correct (tout n'est peut-être pas chargé comme tu le penses). Car les deux méthodes ci-dessus fonctionnent... Et si ça retourne 3, c'est que ya 3 rows dans ton DataSet (un par table?) !

VC# forever
=13319
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
4
Je charge effectivement un dataset avec le conteu d'un fichier xml avec la méthode xmlDoc.DataSet.ReadXml("test.xml");.
Pour vérifier le nombre de ligne qu'il y a par table, j'ai afficher le dataset dans un datagrid.
Le resultat est tel que je trouve 12 lignes au total.

Est-ce que tu pense que 3 serait le nombre de ligne correspondant au noeud ayant des enfants ?

Si oui, vois-tu une solution à mon problème ?

Néo020585

La programmation, c'est l'art de découvrir
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Non, mais dans le doute j'ai quand même fait un petit exemple :

// Une ligne
DataTable dt1 =
new
DataTable();
dt1.Columns.Add(
"1",
typeof(
string));
dt1.Rows.Add(
"1");

// deux lignes
DataTable dt2 =
new
DataTable();
dt2.Columns.Add(
"1",
typeof(
string));
dt2.Rows.Add(
"1");
dt2.Rows.Add(
"2");

// trois lignes
DataTable dt3 =
new
DataTable();
dt3.Columns.Add(
"1",
typeof(
string));
dt3.Rows.Add(
"1");
dt3.Rows.Add(
"2");
dt3.Rows.Add(
"3");

DataSet ds =
new
DataSet();
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
ds.Tables.Add(dt3);

int rows = 0;

foreach (
DataTable dt
in ds.Tables) rows += dt.Rows.Count;

// Rows vaut 6 (3+2+1)
Console.WriteLine(
"rows: " + rows);
Ca print bien 6, donc de ce côté là y'a aucun problème.
T'as une erreur qui vient de quelques part d'autre...
Je ne sais pas pourquoi, j'ai l'impression que le dataSet ne contient pas les données que tu penses !

Par exemple, comment tu fais pour afficher un DataSet dans un DataGridView??? On ne peut afficher qu'une table à la fois...

VC# forever
=13319
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
4
En fait, lorsque je charge le DataSet dans le DataGrid, il me présente tout d'abord les 3 tables, et lorsque l'on clique sur l'une d'entre elle, on peut naviguer dedans.

Néo020585

La programmation, c'est l'art de découvrir
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Mais tu utilises un DataGrid ou un DataGridView?
Ca serait pas mal si tu pouvais mettre un peu de code, du genre la méthode qui s'occupe de charger les données du fichier xml dans le DataGrid(View), le fichier xml (le plus de ligne possible) ou tout autre bout de code qui pourrait aider.
Parce que là, c'est dur de dire comme ça...

VC# forever
=13319