Wie lese und parse ich eine XML-Datei in C #?
XmlDocument, um ein XML aus einer Zeichenfolge oder aus einer Datei zu lesen.
XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");
oder
doc.LoadXml("<xml>something</xml>");
dann einen Knoten darunter finden, also so
XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");
oder
foreach(XmlNode node in doc.DocumentElement.ChildNodes){
string text = node.InnerText; //or loop through its children as well
}
lesen Sie dann den Text in diesem Knoten so
string text = node.InnerText;
oder ein Attribut lesen
string attr = node.Attributes["theattributename"]?.InnerText
Überprüfen Sie immer auf null für Attribute ["etwas"], da es null ist, wenn das Attribut nicht vorhanden ist.
// 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);
}
Reference: LINQ to XML bei MSDN
Hier ist eine Anwendung, die ich zum Lesen von XML-Sitemaps geschrieben habe:
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 auf dem Einfügeordner http://Pastebin.com/yK7cSNeY
Es gibt viele Wege, einige:
Du kannst entweder:
Beispiele sind auf den bereitgestellten Msdn-Seiten
Außerdem bietet VB.NET eine wesentlich bessere Unterstützung für die XML-Analyse über den Compiler als C #. Wenn Sie die Option und den Wunsch haben, check it out.
Sie können ein DataSet verwenden, um XML-Zeichenfolgen zu lesen.
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
Dies zur Information veröffentlichen.
Check out XmlTextReader class zum Beispiel.
Es gibt verschiedene Möglichkeiten, je nachdem, wo Sie hin möchten. XmlDocument ist leichter als XDocument. Wenn Sie jedoch minimalistisch überprüfen möchten, dass eine Zeichenfolge XML enthält, ist der reguläre Ausdruck möglicherweise die schnellste und leichteste Wahl, die Sie treffen können. Ich habe zum Beispiel Smoke-Tests mit SpecFlow für meine API implementiert und möchte testen, ob eines der Ergebnisse in einem beliebigen gültigen XML-Format vorliegt. Dann würde ich einen regulären Ausdruck verwenden. Wenn ich jedoch Werte aus diesem XML extrahieren muss, würde ich es mit XDocument analysieren, um es schneller und mit weniger Code zu machen. Oder ich würde XmlDocument verwenden, wenn ich mit einer großen XML-Datei arbeiten muss (und manchmal arbeite ich mit XML-Dateien, die ungefähr 1M-Zeilen lang sind, sogar noch mehr). dann konnte ich es sogar zeilenweise lesen. Warum? Versuchen Sie, mehr als 800 MB in privaten Bytes in Visual Studio zu öffnen. Selbst bei der Produktion sollten Sie keine Objekte mit einer Größe von mehr als 2 GB haben. Sie können mit einem Twerk, aber Sie sollten nicht. Wenn Sie ein Dokument parsen müssen, das VIEL Zeilen enthält, dann handelt es sich bei diesem Dokument wahrscheinlich um CSV.
Ich habe diesen Kommentar geschrieben, weil ich viele Beispiele mit XDocument sehe. XDocument eignet sich nicht für große Dokumente oder wenn Sie nur überprüfen möchten, ob der Inhalt XML-gültig ist. Wenn Sie prüfen möchten, ob das XML selbst sinnvoll ist, benötigen Sie Schema.
Ich habe auch die vorgeschlagene Antwort abgelehnt, weil ich glaube, dass sie die oben genannten Informationen in sich selbst benötigt. Stellen Sie sich vor, ich muss überprüfen, ob 200 MB XML (10-mal pro Stunde) gültiges XML sind. XDocument verschwendet eine Menge Ressourcen.
prasanna venkatesh gibt auch an, dass Sie versuchen könnten, die Zeichenfolge in ein Dataset einzufügen. In diesem Fall wird auch gültiges XML angegeben.
public void ReadXmlFile()
{
string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
break;
case XmlNodeType.Text:
columnNames.Add(reader.Value);
break;
case XmlNodeType.EndElement:
break;
}
}
}
Sie können die erste Anweisung vermeiden und nur den Pfadnamen im Konstruktor von XmlTextReader angeben.