2 votes

Comment lire les fichiers XML en C# ?

Je possède un code qui lit un fichier xml. Il y a quelques parties que je ne comprends pas. De ce que je comprends, le code va créer un fichier xml avec 2 éléments, "Produit" et "AutresDétails". Comment se fait-il que nous devions utiliser writer.WriteEndElement(); une seule fois alors que nous avons utilisé writer.WriteStartElement deux fois ? Ne devrions-nous pas fermer chaque instruction writer.WriteStartElement avec une instruction writer.WriteEndElement ?

using System.Xml;

public class Program
{
    public static void Main()
    {
        XmlWriterSettings paramètres = new XmlWriterSettings();
        paramètres.Indent = true;

        XmlWriter writer = XmlWriter.Create("Produits.xml", paramètres);
        writer.WriteStartDocument();
        writer.WriteComment("Ce fichier est généré par le programme.");
        writer.WriteStartElement("Produit");          // première s
        writer.WriteAttributeString("ID", "001");
        writer.WriteAttributeString("Nom", "Savon");
        writer.WriteElementString("Prix", "10.00");

        // Deuxième élément
        writer.WriteStartElement("AutresDétails");
        writer.WriteElementString("NomMarque", "Savon X");
        writer.WriteElementString("Fabricant", "Compagnie X");
        writer.WriteEndElement();
        writer.WriteEndDocument();

        writer.Flush();
        writer.Close();
    }
}

using System;
using System.Xml;

public class Program
{
    public static void Main()
    {
        XmlReader reader = XmlReader.Create("Produits.xml");

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
            && reader.Name == "Produit")
            {
                Console.WriteLine("ID = " + reader.GetAttribute(0));
                Console.WriteLine("Nom = " + reader.GetAttribute(1));

                while (reader.NodeType != XmlNodeType.EndElement)
                {
                    reader.Read();
                    if (reader.Name == "Prix")
                    {
                        while (reader.NodeType != XmlNodeType.EndElement)
                        {
                            reader.Read();
                            if (reader.NodeType == XmlNodeType.Text)
                            {
                                Console.WriteLine("Prix = {0:C}", Double.Parse(reader.Value));
                            }
                        }

                        reader.Read();

                    } //fin if

                    if (reader.Name == "AutresDétails")
                    {
                        while (reader.NodeType != XmlNodeType.EndElement)
                        {
                            reader.Read();
                            if (reader.Name == "NomMarque")
                            {
                                while (reader.NodeType != XmlNodeType.EndElement)
                                {
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Text)
                                    {
                                        Console.WriteLine("Nom de la marque = " + reader.Value);
                                    }
                                }
                                reader.Read();
                            } //fin if

                            if (reader.Name == "Fabricant")
                            {
                                while (reader.NodeType != XmlNodeType.EndElement)
                                {
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Text)
                                    {
                                        Console.WriteLine("Fabricant = " + reader.Value);
                                    }
                                }

                            } //fin if
                        }
                    } //fin if
                } //fin tant que
            } //fin if

        } //fin tant que
    }
}

Je ne comprends pas cette partie :

if (reader.Name == "AutresDétails")
{
    while (reader.NodeType != XmlNodeType.EndElement)
    {
        reader.Read();
        if (reader.Name == "NomMarque")
        {
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.Read();
                if (reader.NodeType == XmlNodeType.Text)
                {
                    Console.WriteLine("Nom de la marque = " + reader.Value);
                }
            }

remarquez comment la condition while (reader.NodeType != XmlNodeType.EndElement) a été utilisée deux fois ?

pourquoi n'avons-nous pas à spécifier

if (reader.NodeType == XmlNodeType.Element pour AutresDétails) comme nous l'avons fait pour Produit,

comme ceci

if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "AutresDétails")
{}

3voto

Matthew Watson Points 30804

Pour répondre à votre première question:

Comme le documentation MSDN pour XmlWriter.WriteEndDocument() dit:

Ferme tout élément ou attribut ouvert et remet l'écrivain à l'état de départ.

Il fermera automatiquement tout élément ouvert pour vous. En fait, vous pouvez supprimer l'appel à WriteEndElement() entièrement et cela fonctionnera toujours correctement.

Et comme les gens le disent dans les commentaires ci-dessus, vous devriez peut-être envisager d'utiliser Linq-to-XML.

Cela peut faciliter beaucoup les choses. Par exemple, pour créer la structure XML à partir de votre programme en utilisant Linq-to-XML, vous pouvez faire ceci:

var doc = new XDocument(
    new XElement("Product",
            new XAttribute("ID", "001"), new XAttribute("Name", "Soap"),
        new XElement("Price", 10.01),
        new XElement("OtherDetails", 
            new XElement("BrandName", "X Soap"),
            new XElement("Manufacturer", "X Company"))));

File.WriteAllText("Products.xml", doc.ToString());

Si vous lisiez des données à partir du XML, vous pouvez utiliser var doc = XDocument.Load("Filename.xml") pour charger le XML à partir d'un fichier, et ensuite obtenir les données est aussi simple que:

double price     = double.Parse(doc.Descendants("Price").Single().Value);
string brandName = doc.Descendants("BrandName").Single().Value;

Ou alternativement (casting):

double price     = (double) doc.Descendants("Price").Single();
string brandName = (string) doc.Descendants("BrandName").Single();

(Au cas où vous vous demanderiez comment diable nous pouvons caster un objet de type XElement comme ça: C'est parce que une série d'opérateurs de conversion explicite sont définis pour XElement.)

0voto

TekuConcept Points 300

Si vous avez besoin de quelque chose de direct (pas de lecture ou de recherche), voici ce que j'ai fait :

Récemment, j'ai écrit une méthode d'analyse XML personnalisée pour mon MenuStrip pour WinForms (il y avait des centaines d'éléments et XML était mon meilleur choix).

// charger le document
// J'ai chargé le mien à partir de mon fichier de ressources C# appelé TempResources
XDocument doc = XDocument.Load(new MemoryStream(Encoding.UTF8.GetBytes(TempResources.Menu)));

// obtenir l'élément racine
// (var est un jeton automatique, il devient ce que vous lui attribuez)
var elements = doc.Root.Elements();

// itérer à travers les éléments enfants
foreach (XElement node in elements)
{
     // si vous connaissez le nom de l'attribut, vous pouvez l'appeler
     // le mien était 'name'
     // (si vous ne savez pas, vous pouvez appeler node.Attributes() - cela contient le nom et la valeur)
     Console.WriteLine("Chargement de la liste : {0}", node.Attribute("name").Value);

     // dans mon cas, chaque enfant avait des enfants supplémentaires, et eux-mêmes les mêmes
     // *.Cast() me donnerait le tableau dans un type de données avec lequel je peux travailler
     // menu_recurse(...) est juste une méthode auxiliaire récursive que j'ai créée
     menu_recurse(node.Elements().Cast().ToArray()));
}

(Ma réponse se trouve également ici : Lecture d'un fichier XML avec Linq - même si malheureusement ce n'est pas du Linq)

0voto

Deepak Kothari Points 101

Supposons que vous vouliez lire un fichier xml, nous devons utiliser un dataset, car le fichier xml est converti en datatables en interne en utilisant un dataset. Utilisez la ligne de code suivante pour accéder au fichier et lier le dataset avec les données xml.

    DataSet ds=new DataSet();
    ds.ReadXml(HttpContext.Current.Server.MapPath("~/Labels.xml"));

Le DataSet comprend de nombreuses datatables, le nombre de ces datatables dépend du nombre de balises parent-enfant dans un fichier xml

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X