420 votes

Comment lire et analyser un fichier XML en C# ?

Comment lire et analyser un fichier XML en C# ?

541voto

Wolf5 Points 2906

XmlDocument pour lire un XML à partir d'une chaîne ou d'un fichier.

using System.Xml;

XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");

ou

doc.LoadXml("<xml>something</xml>");

puis trouver un noeud en dessous de lui, c'est-à-dire comme ceci

XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");

ou

foreach(XmlNode node in doc.DocumentElement.ChildNodes){
   string text = node.InnerText; //or loop through its children as well
}

puis lire le texte à l'intérieur de ce nœud comme ceci

string text = node.InnerText;

ou lire un attribut

string attr = node.Attributes["theattributename"]?.InnerText

Vérifiez toujours la présence de null sur Attributes["something"] car il sera nul si l'attribut n'existe pas.

1 votes

Valable, mais Linq to XML est beaucoup plus agréable.

3 votes

Bien que vous disiez que c'est "plus joli", y a-t-il d'autres inconvénients à utiliser cette méthode plutôt que LINQ ? Personnellement, je trouve que cette méthode est la plus simple, du moins pour mes besoins.

6 votes

J'ai écrit ceci avant d'avoir commencé à utiliser LINQ. LINQ est agréable et peut être plus facile à lire. J'utilise moi-même principalement LINQ ces jours-ci. Mais certains composants ont besoin de l'ancien style d'objets XML, qui est donc encore utilisé de temps en temps. Je vous recommande d'essayer à la fois l'"ancien style" et LINQ et de voir ce qui vous convient.

241voto

Konstantin Tarkus Points 16862

LINQ to XML Ejemplo:

// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");

// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
            where (int)c.Attribute("id") < 4
            select c.Element("firstName").Value + " " +
                   c.Element("lastName").Value;

foreach (string name in query)
{
    Console.WriteLine("Contact's Full Name: {0}", name);
}

Référence : LINQ to XML à MSDN

17 votes

XDocument.Parse("<xml>quelque chose</xml>") ; pour une chaîne de caractères.

5 votes

Les gens qui n'incluent pas les inclusions sont méchants, mais merci pour la réponse :)

0 votes

@GabrielGarcia vrai, parfois le débutant serait bloqué à l'erreur de l'include manquant

21voto

ajzeffer Points 314

Voici une application que j'ai écrite pour lire des sitemaps xml :

using System;
using System.Collections.Generic;
using System.Windows.Forms; 
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;

namespace SiteMapReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please Enter the Location of the file");

            // get the location we want to get the sitemaps from 
            string dirLoc = Console.ReadLine();

            // get all the sitemaps 
            string[] sitemaps = Directory.GetFiles(dirLoc);
            StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);

            // loop through each file 
            foreach (string sitemap in sitemaps)
            {
                try
                {
                    // new xdoc instance 
                    XmlDocument xDoc = new XmlDocument();

                    //load up the xml from the location 
                    xDoc.Load(sitemap);

                    // cycle through each child noed 
                    foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                    {
                        // first node is the url ... have to go to nexted loc node 
                        foreach (XmlNode locNode in node)
                        {
                            // thereare a couple child nodes here so only take data from node named loc 
                            if (locNode.Name == "loc")
                            {
                                // get the content of the loc node 
                                string loc = locNode.InnerText;

                                // write it to the console so you can see its working 
                                Console.WriteLine(loc + Environment.NewLine);

                                // write it to the file 
                                sw.Write(loc + Environment.NewLine);
                            }
                        }
                    }
                }
                catch { }
            }
            Console.WriteLine("All Done :-)"); 
            Console.ReadLine(); 
        }

        static void readSitemap()
        {
        }
    }
}

Code sur Paste Bin http://pastebin.com/yK7cSNeY

17voto

eglasius Points 26221

Il y a beaucoup de moyens, certains :

  • XmlSerializer. Utilisez une classe avec le schéma cible que vous voulez lire - utilisez XmlSerializer pour obtenir les données dans un Xml chargé dans une instance de la classe.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (accès en lecture seule)

2 votes

En fait, XmlReader.Create au lieu d'utiliser directement XmlTextReader, depuis .NET 2.0.

6voto

Will Points 76760

Linq to XML.

De plus, VB.NET offre une bien meilleure prise en charge de l'analyse xml par le compilateur que C#. Si vous en avez la possibilité et l'envie, Vérifiez.

0 votes

"Tout faux" ? Ce n'est pas exact, je pense, à moins que cette déclaration ne soit une plaisanterie. L'OP n'a fourni aucune information sur la version de .NET sur laquelle il travaille.

2 votes

Heh, ouais. C'était pour rire, mais je ne suis pas drôle, alors je l'ai enlevé.

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