wake-up-neo.net

Wie lese und parse ich eine XML-Datei in C #?

Wie lese und parse ich eine XML-Datei in C #?

294
Gajendra

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.

405
Wolf5

LINQ to XML Beispiel:

// 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

182

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

14
ajzeffer

Es gibt viele Wege, einige:

  • XmlSerializer. Verwenden Sie eine Klasse mit dem Zielschema Sie möchten lesen - verwenden Sie XmlSerializer, um die Daten in einer Xml inan eine Instanz der Klasse zu laden.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (Nur-Lese-Zugriff)
10
eglasius

Du kannst entweder:

Beispiele sind auf den bereitgestellten Msdn-Seiten

6
Grzenio

Linq zu XML.

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.

6
Will

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. 

5

Check out XmlTextReader class zum Beispiel.

2

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. 

0
Nikola
  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. 

0
Vishal Kotak