Comment lire et analyser un fichier XML en C# ?
Valable, mais Linq to XML est beaucoup plus agréable.
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.
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.
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.
// 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
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
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.