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

362

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

Gajendra
quelle
2
Die einfachste Lösung ist die Verwendung von LINQ to XML. Siehe mein Beispiel.
Konstantin Tarkus

Antworten:

480

XmlDocument zum Lesen eines XML aus einer Zeichenfolge oder einer Datei.

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

oder

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

dann finden Sie einen Knoten darunter, dh wie folgt

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 wie folgt

string text = node.InnerText;

oder lesen Sie ein Attribut

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

Überprüfen Sie Attribute ["etwas"] immer auf null, da sie null sind, wenn das Attribut nicht vorhanden ist.

Wolf5
quelle
1
Gültig, aber Linq to XML ist viel schöner.
Finglas
3
Obwohl Sie sagen, dass es "schöner" ist, gibt es einen anderen Nachteil, wenn Sie dies gegenüber LINQ tun? Persönlich fand ich diese Methode am einfachsten, zumindest für meine Bedürfnisse.
Kolors
6
Ich habe dies geschrieben, bevor ich angefangen hatte, LINQ zu verwenden. LINQ ist nett und kann leichter lesbar sein. Ich benutze LINQ heutzutage meistens selbst. Einige Komponenten benötigen jedoch XML-Objekte im alten Stil, sodass sie ab und zu verwendet werden. Ich würde empfehlen, sowohl den "alten Stil" hier als auch LINQ auszuprobieren und zu sehen, was zu Ihnen passt.
Wolf5
1
Sollte die XmlNode node = XmlDocument.Docu...Linie nicht wirklich sein XmlNode = doc.Docu...? Warum wurde die Antwort geändert und die doc.entfernt?
Wasatchwizard
Wahr. Ich habe keine Ahnung, warum ich das geändert habe ... Wird behoben.
Wolf5
218

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);
}

Referenz : LINQ to XML bei MSDN

Konstantin Tarkus
quelle
16
XDocument.Parse ("<xml> etwas </ xml>"); für eine Zeichenfolge.
Wolf5
2
Leute, die die Includes nicht enthalten, sind gemein, danke für die Antwort tho :)
Gabriel Garcia
@GabrielGarcia wahr, manchmal steckte Anfänger bei fehlendem Include-Fehler fest
Anonym
1
Was sind die relevanten Includes?
Sayth
18

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ügebehälter http://pastebin.com/yK7cSNeY

Ajzeffer
quelle
12

Es gibt viele Möglichkeiten, einige:

  • XmlSerializer. Verwenden Sie eine Klasse mit dem Zielschema, das Sie lesen möchten. Verwenden Sie XmlSerializer, um die Daten in einer XML-Datei abzurufen, die in eine Instanz der Klasse geladen wird.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (schreibgeschützter Zugriff)
eglasius
quelle
2
Eigentlich XmlReader.Create, anstatt XmlTextReader direkt zu verwenden, seit .NET 2.0.
John Saunders
7

Linq zu XML.

Außerdem bietet VB.NET eine viel bessere Unterstützung für das XML-Parsen über den Compiler als C #. Wenn Sie die Option und den Wunsch haben, probieren Sie es aus.


quelle
"Alles falsch"? Nicht genau, sollte ich denken, es sei denn, diese Aussage war im Scherz. Das OP hat keine Informationen zur Verfügung gestellt. über die .NET-Version, an der er arbeitet.
Cerebrus
1
Heh, ja. Es war ein Scherz, aber ich bin nicht lustig, also habe ich es entfernt.
7

Sie können ein DataSet zum Lesen von XML-Zeichenfolgen verwenden.

var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);

Posting dies zur Information.

Prasanna Venkatesh
quelle
sehr gut! Es ist der schnellste Weg, Informationen aus SQL XML-Spalten und .net zu teilen.
elle0087
Nicht ideal, wenn Sie mehrere Ebenen haben, da anscheinend jede Ebene in einer eigenen Tabelle innerhalb des Datasets abgelegt wird.
Lenny K
Auch dafür ist es noch in Ordnung. Ich denke, es hängt wirklich davon ab, wie Ihre Daten tatsächlich aussehen und wie viele Ebenen tief die Daten sind, nach denen Sie suchen.
user2366842
1
  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 einfach den Pfadnamen im Konstruktor von XmlTextReader angeben.

Vishal Kotak
quelle
0

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, ob eine Zeichenfolge XML enthält, ist der reguläre Ausdruck möglicherweise die schnellste und leichteste Wahl, die Sie treffen können. Zum Beispiel habe ich Smoke Tests mit SpecFlow für meine API implementiert und möchte testen, ob eines der Ergebnisse in einem gültigen XML 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 erledigen. Oder ich würde XmlDocument verwenden, wenn ich mit einem großen XML arbeiten muss (und manchmal arbeite ich mit XMLs, die ungefähr 1 Million Zeilen umfassen, sogar mehr). dann konnte ich es sogar Zeile für Zeile lesen. Warum? Versuchen Sie, in Visual Studio mehr als 800 MB in privaten Bytes zu öffnen. Selbst in der Produktion sollten Sie keine Objekte haben, die größer als 2 GB sind. Sie können mit einem twerk, aber Sie sollten nicht. Wenn Sie ein Dokument analysieren müssten, das VIELE Zeilen enthält, handelt es sich bei diesen Dokumenten 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 überprü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 200M XML 10-mal pro Stunde gültiges XML ist. XDocument wird eine Menge Ressourcen verschwenden.

prasanna venkatesh gibt außerdem an, dass Sie versuchen könnten, die Zeichenfolge in ein Dataset einzufügen. Dies zeigt auch gültiges XML an.

nkalfov
quelle