Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Création de fichier xml

14 réponses
Avatar
Valentin
Bonjour,

Je souhaite créer une base de données xml (c'est mieux que 2 fichier txt)
contenant un tabeau de score: 10 noms + 10 scores.

Comment faire ?

Valentin

10 réponses

1 2
Avatar
Gilles TOURREAU
Le Fri, 30 Nov 2007 21:45:50 +0100, Valentin a écrit:


Bonjour,

Je souhaite créer une base de données xml (c'est mieux que 2 fichier
txt) contenant un tabeau de score: 10 noms + 10 scores.

Comment faire ?

Valentin



Bonjour,

Il existe plusieurs façon de faire çà... La plus simple pour un débutant,
c'est de créer un DataSet typé avec une table "score" et 2 colonnes "noms"
et "score".
Tu crée une instance du DataTable typé généré par VisualStudio, tu remplis
ce DataTable et tu l'enregistres via la méthode DataTable.WriteXml()

Pour charger le contenu d'un fichier XML dans un DataTable, utilise la
méthode dual : ReadXml()

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Valentin
Bonjour,

Gilles TOURREAU a écrit:

Il existe plusieurs façon de faire çà... La plus simple pour un débutant,
c'est de créer un DataSet typé avec une table "score" et 2 colonnes "noms"
et "score".
Tu crée une instance du DataTable typé généré par VisualStudio, tu remplis
ce DataTable et tu l'enregistres via la méthode DataTable.WriteXml()



Je pense avoir réussi à écrire le fichier:
DataTable dt = new DataTable("Top10");

dt.Columns.Add("Nom");
dt.Columns.Add("Score");
dt.Columns.Add("Niveau");

for (int i = 0; i < 10; i++)
{
dt.Rows.Add(_top[i].Nom, _top[i].Score, _top[i].Niveau);
}

dt.WriteXml("CollecteurData.xml");


Pour charger le contenu d'un fichier XML dans un DataTable, utilise la
méthode dual : ReadXml()



Là par contre je ne comprend pas. Faut-il faire comme cela ?
DataTable dt = new DataTable("Top10");

dt.Columns.Add("Nom");
dt.Columns.Add("Score");
dt.Columns.Add("Niveau");

dt.ReadXml("CollecteurData.xml");

Mais après comment je fait pour remplir ma class ?
Avatar
Gilles TOURREAU
Le Sat, 01 Dec 2007 18:30:01 +0100, Valentin a écrit:

Bonjour,

Gilles TOURREAU a écrit:

Il existe plusieurs façon de faire çà... La plus simple pour un
débutant, c'est de créer un DataSet typé avec une table "score" et 2
colonnes "noms" et "score".
Tu crée une instance du DataTable typé généré par VisualStudio, tu
remplis ce DataTable et tu l'enregistres via la méthode
DataTable.WriteXml()



Je pense avoir réussi à écrire le fichier:
DataTable dt = new DataTable("Top10");

dt.Columns.Add("Nom");
dt.Columns.Add("Score");
dt.Columns.Add("Niveau");

for (int i = 0; i < 10; i++)
{
dt.Rows.Add(_top[i].Nom, _top[i].Score, _top[i].Niveau);
}

dt.WriteXml("CollecteurData.xml");


Pour charger le contenu d'un fichier XML dans un DataTable, utilise la
méthode dual : ReadXml()



Là par contre je ne comprend pas. Faut-il faire comme cela ?
DataTable dt = new DataTable("Top10");

dt.Columns.Add("Nom");
dt.Columns.Add("Score");
dt.Columns.Add("Niveau");

dt.ReadXml("CollecteurData.xml");

Mais après comment je fait pour remplir ma class ?



Avant d'allez plus loin (il y a mieux !) utilises les DataSet typés, pour
se faire :

Clic droit sur ton projet -> Ajouter -> Nouvel élément -> DataSet

Tu le nomme par exemple MonDataSet.xsd

Tu te retrouve dans un Designer de DataSet, il te suffit maintenant de
créer ta table score :
Tu fais clic droit dans la zone vide de l'éditeur -> AJouter -> DataTable
tu la nomme "Score"
Et après t'ajoutes des colonnes (en faisant un clic droit sur le DataTable
crée)

Une fois les colonnes ajoutées, selectionnes en une et affiche la fenêtre
des propriétés, tu peux alors modifier les propriétés de la colonne
(surtout son type, et sa longueur maxi si c'est une chaine).

En manipulant graphiquement cet éditeur, VS te génère du code derrière
permettant de créer des DataSet typé.
Les DataSet typé permettent lors de leur instanciation de créer les
colonnes nécessaires automatiquement, et de vérifier (à la compilation)
que dans chaque colonne tu passes bien des bon type de données.

Ton code devient alors :

MonDataSet.ScoreDataTable dt = new MonDataSet.ScoreDataTable();
for (int i = 0; i < 10; i++)
{
dt.Rows.AddScoreRow(_top[i].Nom, _top[i].Score, _top[i].Niveau);
}
dt.WriteXml("CollecteurData.xml");

L'avantage c'est que si tu fais :
dt.Rows.AddScoreRow(_top[i].Nom, _top[i].Nom, _top[i].Nom);
Le compilateur va t'insulter et te dire que les paramètres n°2 et n°3 ne
sont pas de bon type !
Alors que dans ta méthode les erreurs seront visible à l'exécution...

Pour la méthode dual :

MonDataSet.ScoreDataTable dt = new MonDataSet.ScoreDataTable();
dt.ReadXml("CollecteurData.xml");

Et c'est tout !

@+

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Valentin
Bonjour,

Gilles TOURREAU a écrit:

MonDataSet.ScoreDataTable dt = new MonDataSet.ScoreDataTable();
for (int i = 0; i < 10; i++)
{
dt.Rows.AddScoreRow(_top[i].Nom, _top[i].Score, _top[i].Niveau);
}
dt.WriteXml("CollecteurData.xml");



MonDataSet.ScoreDataTable dt = new MonDataSet.ScoreDataTable();
dt.ReadXml("CollecteurData.xml");



Cela c'est bon ça marche le fichier est bien écrit.

Et c'est tout !


En fait non car je doit remplir ma class (Top10), puis grâce à elle remplir
mon listView1.
Avatar
Gilles TOURREAU
Le Sun, 02 Dec 2007 12:03:15 +0100, Valentin a écrit:

Bonjour,

Gilles TOURREAU a écrit:

MonDataSet.ScoreDataTable dt = new MonDataSet.ScoreDataTable();
for (int i = 0; i < 10; i++)
{
dt.Rows.AddScoreRow(_top[i].Nom, _top[i].Score, _top[i].Niveau);
}
dt.WriteXml("CollecteurData.xml");



MonDataSet.ScoreDataTable dt = new MonDataSet.ScoreDataTable();
dt.ReadXml("CollecteurData.xml");



Cela c'est bon ça marche le fichier est bien écrit.

Et c'est tout !


En fait non car je doit remplir ma class (Top10), puis grâce à elle
remplir mon listView1.




Alors là tu as 2 choix :
Soit t'utilise uniquement des DataSet typé (dans ce cas ton ListView sera
attaché à une instance d'un DataSet typé), tu peux donc supprimer ta
classe Top10...

Maintenant si tu veux vraiement garder ta classe Top10, tu peux te passer
de l'utilisation d'un DataSet et utiliser les classes de l'espace de nom :
System.Xml.Serialization

Cela permet d'écrire le contenu de ta classe directement dans une fichier
Xml...
Il faut pour cela utiliser la classe XmlSerializer.

Si tu souhaites personnaliser la structure de ton fichier Xml par rapport
à ta classe utilise les attributs : XmlElementAttribute,
XmlAttributeAttribute...

Consultes les exemples des toutes les classes Xmlxxxxxxxxxxxxx présentes
dans le namespace System.Xml.Serialization sur le MSDN de Microsoft.

Si tu as des questions n'hésites pas !

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Jean-Luc M.
Dans son message précédent, Valentin a écrit :
Bonjour,

Je souhaite créer une base de données xml (c'est mieux que 2 fichier txt)
contenant un tabeau de score: 10 noms + 10 scores.

Comment faire ?

Valentin



http://www.example-code.com/csharp/xml.asp

--
Jean-Luc M.
Avatar
Valentin
Bonjour,

Gilles TOURREAU a écrit:

Maintenant si tu veux vraiement garder ta classe Top10, tu peux te passer
de l'utilisation d'un DataSet et utiliser les classes de l'espace de nom :
System.Xml.Serialization

Cela permet d'écrire le contenu de ta classe directement dans une fichier
Xml...
Il faut pour cela utiliser la classe XmlSerializer.



Oui je vais garder ma classe.

Si tu as des questions n'hésites pas !



En voila une: j'ai réussi à écrire mon fichier xml.

Code:
XmlTextWriter tw = new XmlTextWriter("CollecteurData.xml",
null);
tw.WriteStartDocument(true);
tw.WriteStartElement("Top10");

for (int i = 0; i < 10; i++)
{
tw.WriteStartElement("Place"+(i+1).ToString());
tw.WriteAttributeString("Nom", _top[i].Nom);
tw.WriteAttributeString("Score", _top[i].Score.ToString());
tw.WriteAttributeString("Niveau",
_top[i].Niveau.ToString());
tw.WriteEndElement();
}

tw.WriteEndElement();
tw.WriteEndDocument();

tw.Flush();
tw.Close();

Résultat:
<?xml version="1.0" standalone="yes" ?>
- <Top10>
<Place1 Nom="Valentin" Score="1450528" Niveau="30" />
<Place2 Nom="Mathilde" Score="788641" Niveau="24" />
<Place3 Nom="Valentin" Score="118375" Niveau="11" />
<Place4 Nom="Valentin" Score="39020" Niveau="14" />
<Place5 Nom="Valentin" Score="0" Niveau="0" />
<Place6 Nom="Personne" Score="0" Niveau="0" />
<Place7 Nom="Personne" Score="0" Niveau="0" />
<Place8 Nom="Personne" Score="0" Niveau="0" />
<Place9 Nom="Personne" Score="0" Niveau="0" />
<Place10 Nom="Personne" Score="0" Niveau="0" />
</Top10>

Mais je n'arrive pas à le lire.J'ai essayer un truc du même genre mais bon
...

Code:
XmlTextReader tr = new XmlTextReader("CollecteurData.xml");
string line = tr.Read().ToString();

string test = "";

while (line != "False")
{
test += line;
test += "n";
line = tr.Read().ToString();
}

MessageBox.Show(test);

Résultat (MessageBox):
True
True
True
True
True
True
True
True
True
True
True
True
True

Comment puis-je faire pour récuperer les données et les remmetre dans ma
classe ?
Avatar
Valentin
Bonjour,

Jean-Luc M a écrit :
http://www.example-code.com/csharp/xml.asp



Merci mais maintenant je cherche à le lire.
Avatar
Gilles TOURREAU
Le Sun, 02 Dec 2007 15:50:52 +0100, Valentin a écrit:

Bonjour,

Gilles TOURREAU a écrit:

Maintenant si tu veux vraiement garder ta classe Top10, tu peux te
passer de l'utilisation d'un DataSet et utiliser les classes de
l'espace de nom : System.Xml.Serialization

Cela permet d'écrire le contenu de ta classe directement dans une
fichier Xml...
Il faut pour cela utiliser la classe XmlSerializer.



Oui je vais garder ma classe.

Si tu as des questions n'hésites pas !



En voila une: j'ai réussi à écrire mon fichier xml.

Code:
XmlTextWriter tw = new XmlTextWriter("CollecteurData.xml",
null);
tw.WriteStartDocument(true);
tw.WriteStartElement("Top10");

for (int i = 0; i < 10; i++)
{
tw.WriteStartElement("Place"+(i+1).ToString());
tw.WriteAttributeString("Nom", _top[i].Nom);
tw.WriteAttributeString("Score",
_top[i].Score.ToString());
tw.WriteAttributeString("Niveau",
_top[i].Niveau.ToString());
tw.WriteEndElement();
}

tw.WriteEndElement();
tw.WriteEndDocument();

tw.Flush();
tw.Close();

Résultat:
<?xml version="1.0" standalone="yes" ?>
- <Top10>
<Place1 Nom="Valentin" Score="1450528" Niveau="30" />
<Place2 Nom="Mathilde" Score="788641" Niveau="24" />
<Place3 Nom="Valentin" Score="118375" Niveau="11" />
<Place4 Nom="Valentin" Score="39020" Niveau="14" />
<Place5 Nom="Valentin" Score="0" Niveau="0" />
<Place6 Nom="Personne" Score="0" Niveau="0" />
<Place7 Nom="Personne" Score="0" Niveau="0" />
<Place8 Nom="Personne" Score="0" Niveau="0" />
<Place9 Nom="Personne" Score="0" Niveau="0" />
<Place10 Nom="Personne" Score="0" Niveau="0" />
</Top10>

Mais je n'arrive pas à le lire.J'ai essayer un truc du même genre mais
bon ...

Code:
XmlTextReader tr = new XmlTextReader("CollecteurData.xml");
string line = tr.Read().ToString();

string test = "";

while (line != "False")
{
test += line;
test += "n";
line = tr.Read().ToString();
}

MessageBox.Show(test);

Résultat (MessageBox):
True
True
True
True
True
True
True
True
True
True
True
True
True

Comment puis-je faire pour récuperer les données et les remmetre dans ma
classe ?



C'est usine à gaz à utiliser le XmlTextReader... En fait le Read() de
XmlTextReader lit "atome par atome XML".
Dans ton cas le premier Read() lit "<?xml version="1.0" standalone="yes"
?>" ensuite il lit "<Top10>" ensuite "<Place1"...etc

De plus ton fichier XML n'est pas "trop correct" du fait que t'utilise :
Place1, Place2,...etc
Préfère dans ce cas "<Place numero="1" Nom=....>

Essayes plustot ce code ci (dans un premier temps) :

XmlSerializer serializer = new XmlSerializer(typeof(Top10));
using (StreamWriter sw = new StreamWriter("CollecteurData.xml"))
{
serializer.Serialize(sw, monObjetTop10);
}

Le contraire étant :

XmlSerializer serializer = new XmlSerializer(typeof(Top10));
using (StreamReader sr = new StreamReader("CollecteurData.xml"))
{
monObjetTop10 = (Top10)serializer.Deserialize(sr);
}

Regardes le "look" du XML généré et dis nous, si cela te plait bien ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Gilles TOURREAU
Le Sun, 02 Dec 2007 16:34:07 +0100, Gilles TOURREAU
a écrit:

Le Sun, 02 Dec 2007 15:50:52 +0100, Valentin a
écrit:

Bonjour,

Gilles TOURREAU a écrit:

Maintenant si tu veux vraiement garder ta classe Top10, tu peux te
passer de l'utilisation d'un DataSet et utiliser les classes de
l'espace de nom : System.Xml.Serialization

Cela permet d'écrire le contenu de ta classe directement dans une
fichier Xml...
Il faut pour cela utiliser la classe XmlSerializer.



Oui je vais garder ma classe.

Si tu as des questions n'hésites pas !



En voila une: j'ai réussi à écrire mon fichier xml.

Code:
XmlTextWriter tw = new XmlTextWriter("CollecteurData.xml",
null);
tw.WriteStartDocument(true);
tw.WriteStartElement("Top10");

for (int i = 0; i < 10; i++)
{
tw.WriteStartElement("Place"+(i+1).ToString());
tw.WriteAttributeString("Nom", _top[i].Nom);
tw.WriteAttributeString("Score",
_top[i].Score.ToString());
tw.WriteAttributeString("Niveau",
_top[i].Niveau.ToString());
tw.WriteEndElement();
}

tw.WriteEndElement();
tw.WriteEndDocument();

tw.Flush();
tw.Close();

Résultat:
<?xml version="1.0" standalone="yes" ?>
- <Top10>
<Place1 Nom="Valentin" Score="1450528" Niveau="30" />
<Place2 Nom="Mathilde" Score="788641" Niveau="24" />
<Place3 Nom="Valentin" Score="118375" Niveau="11" />
<Place4 Nom="Valentin" Score="39020" Niveau="14" />
<Place5 Nom="Valentin" Score="0" Niveau="0" />
<Place6 Nom="Personne" Score="0" Niveau="0" />
<Place7 Nom="Personne" Score="0" Niveau="0" />
<Place8 Nom="Personne" Score="0" Niveau="0" />
<Place9 Nom="Personne" Score="0" Niveau="0" />
<Place10 Nom="Personne" Score="0" Niveau="0" />
</Top10>

Mais je n'arrive pas à le lire.J'ai essayer un truc du même genre mais
bon ...

Code:
XmlTextReader tr = new XmlTextReader("CollecteurData.xml");
string line = tr.Read().ToString();

string test = "";

while (line != "False")
{
test += line;
test += "n";
line = tr.Read().ToString();
}

MessageBox.Show(test);

Résultat (MessageBox):
True
True
True
True
True
True
True
True
True
True
True
True
True

Comment puis-je faire pour récuperer les données et les remmetre dans
ma classe ?



C'est usine à gaz à utiliser le XmlTextReader... En fait le Read() de
XmlTextReader lit "atome par atome XML".
Dans ton cas le premier Read() lit "<?xml version="1.0" standalone="yes"
?>" ensuite il lit "<Top10>" ensuite "<Place1"...etc

De plus ton fichier XML n'est pas "trop correct" du fait que t'utilise :
Place1, Place2,...etc
Préfère dans ce cas "<Place numero="1" Nom=....>

Essayes plustot ce code ci (dans un premier temps) :

XmlSerializer serializer = new XmlSerializer(typeof(Top10));
using (StreamWriter sw = new StreamWriter("CollecteurData.xml"))
{
serializer.Serialize(sw, monObjetTop10);
}

Le contraire étant :

XmlSerializer serializer = new XmlSerializer(typeof(Top10));
using (StreamReader sr = new StreamReader("CollecteurData.xml"))
{
monObjetTop10 = (Top10)serializer.Deserialize(sr);
}

Regardes le "look" du XML généré et dis nous, si cela te plait bien ?

Cordialement




Excuse le code précédent ne devrait pas fonctionner...
Utilises çà :

using (Stream sw = new FileStream("CollecteurData.xml",FileMode.Create))
{
serializer.Serialize(sw, monObjetTop10);
}

using (Stream sr = new FileStream("CollecteurData.xml",FileMode.Open))
{
monObjetTop10 = (Top10)serializer.Deserialize(sr);
}

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
1 2