Bagaimana cara membaca dan mem-parsing file XML dalam C #?

362

Bagaimana cara membaca dan mem-parsing file XML dalam C #?

Gajendra
sumber
2
Solutin yang paling sederhana adalah menggunakan LINQ untuk XML. Lihat contoh saya.
Konstantin Tarkus

Jawaban:

480

XmlDocument untuk membaca XML dari string atau dari file.

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

atau

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

kemudian cari simpul di bawahnya yaitu seperti ini

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

atau

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

kemudian baca teks di dalam simpul itu seperti ini

string text = node.InnerText;

atau membaca atribut

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

Selalu periksa nol pada Atribut ["sesuatu"] karena itu akan menjadi nol jika atribut tidak ada.

Wolf5
sumber
1
Berlaku, tetapi Linq to XML jauh lebih bagus.
Finglas
3
Meskipun Anda mengatakan itu 'lebih baik' apakah ada kelemahan lain untuk melakukannya dengan cara ini daripada LINQ? Secara pribadi saya menemukan metode ini menjadi yang paling sederhana, setidaknya untuk kebutuhan saya.
Kolors
6
Saya menulis ini sebelum saya mulai menggunakan LINQ. LINQ bagus dan dapat dibaca lebih mudah. Saya kebanyakan menggunakan LINQ sendiri hari ini. Tetapi beberapa komponen memang membutuhkan objek XML gaya lama, sehingga masih digunakan sekarang dan nanti. Saya akan merekomendasikan mencoba "gaya lama" di sini dan LINQ dan melihat apa yang cocok untuk Anda.
Wolf5
1
Bukankah seharusnya XmlNode node = XmlDocument.Docu...garis itu benar XmlNode = doc.Docu...? Mengapa jawabannya diubah dan doc.dihapus?
wasatchwizard
Benar. Saya tidak tahu mengapa saya mengubah itu ... Akan diperbaiki.
Wolf5
219

Contoh LINQ to XML :

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

Referensi : LINQ ke XML di MSDN

Konstantin Tarkus
sumber
16
XDocument.Parse ("<xml> something </xml>"); untuk sebuah string.
Wolf5
2
Orang-orang yang tidak termasuk di dalamnya kejam, terima kasih atas jawabannya :)
Gabriel Garcia
@GabrielGarcia benar, kadang-kadang pemula akan terjebak pada kesalahan include yang hilang
Anonymous
1
termasuk apa yang relevan?
sayth
18

Inilah aplikasi yang saya tulis untuk membaca peta situs 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()
        {
        }
    }
}

Kode pada Tempel Bin http://pastebin.com/yK7cSNeY

ajzeffer
sumber
12

Ada banyak cara, beberapa di antaranya:

  • Xmlserializer. gunakan kelas dengan skema target yang ingin Anda baca - gunakan XmlSerializer untuk mendapatkan data dalam Xml yang dimuat ke instance kelas.
  • Linq 2 xml
  • XmlTextReader.
  • Dokumen Xml
  • XPathDocument (akses hanya baca)
eglasius
sumber
2
Sebenarnya, XmlReader.Create alih-alih menggunakan XmlTextReader secara langsung, karena .NET 2.0.
John Saunders
7

Linq ke XML.

Juga, VB.NET memiliki dukungan parsing xml jauh lebih baik melalui kompiler daripada C #. Jika Anda memiliki opsi dan keinginan, lihatlah.


sumber
"Semua salah"? Saya kira tidak akurat, kecuali pernyataan itu bercanda. OP tidak memberikan info. tentang versi .NET yang dikerjakannya.
Cerebrus
1
Heh, yeah. Itu bercanda, tapi saya tidak lucu, jadi saya menghapusnya.
7

Anda bisa menggunakan DataSet untuk membaca string XML.

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

Posting ini demi informasi.

prasanna venkatesh
sumber
sangat baik! itu cara tercepat yang saya temukan untuk berbagi informasi dari kolom xml sql dan .net !!
elle0087
Tidak ideal bila Anda memiliki beberapa level karena tampaknya menempatkan setiap level ke dalam tabelnya sendiri di dalam dataset.
Lenny K
Itu masih baik untuk itu. Saya kira itu benar-benar tergantung pada seperti apa data Anda sebenarnya dan berapa banyak lapisan dalam data yang Anda cari.
user2366842
2

Lihat kelas XmlTextReader misalnya.

Frederik Gheysels
sumber
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;
            }
        }
    }

Anda dapat menghindari pernyataan pertama dan cukup tentukan nama jalur di konstruktor XmlTextReader.

Vishal Kotak
sumber
0

Ada berbagai cara, tergantung dari mana Anda ingin mendapatkannya. XmlDocument lebih ringan dari XDocument, tetapi jika Anda ingin memverifikasi secara minimalis bahwa sebuah string berisi XML, maka ekspresi reguler mungkin merupakan pilihan tercepat dan teringan yang dapat Anda buat. Misalnya, saya telah menerapkan Tes Asap dengan SpecFlow untuk API saya dan saya ingin menguji apakah salah satu hasil dalam XML yang valid - maka saya akan menggunakan ekspresi reguler. Tetapi jika saya perlu mengekstrak nilai dari XML ini, maka saya akan menguraikannya dengan XDocument untuk melakukannya lebih cepat dan dengan kode yang lebih sedikit. Atau saya akan menggunakan XmlDocument jika saya harus bekerja dengan XML besar (dan kadang-kadang saya bekerja dengan XML yang sekitar 1M baris, bahkan lebih); maka saya bahkan bisa membacanya baris demi baris. Mengapa? Coba buka lebih dari 800MB dalam byte pribadi di Visual Studio; bahkan pada produksi Anda seharusnya tidak memiliki objek yang lebih besar dari 2GB. Anda bisa dengan seorang twerk, tetapi seharusnya tidak. Jika Anda harus mengurai dokumen, yang berisi BANYAK garis, maka dokumen ini mungkin CSV.

Saya telah menulis komentar ini, karena saya melihat banyak contoh dengan XDocument. XDocument tidak baik untuk dokumen besar, atau ketika Anda hanya ingin memverifikasi apakah ada konten yang valid XML. Jika Anda ingin memeriksa apakah XML itu sendiri masuk akal, maka Anda perlu Skema.

Saya juga downvoted jawaban yang disarankan, karena saya percaya perlu informasi di atas sendiri. Bayangkan saya perlu memverifikasi apakah 200M XML, 10 kali dalam satu jam, adalah XML yang valid. XDocument akan membuang banyak sumber daya.

prasanna venkatesh juga menyatakan Anda bisa mencoba mengisi string ke dataset, itu juga akan menunjukkan XML yang valid.

nkalfov
sumber