Nasıl bir XML dosyası C # okuma ve ayrıştırma?


364

Nasıl bir XML dosyası C # okuma ve ayrıştırma?


2
En basit çözüm, LINQ to XML kullanmaktır. Örneğime bakın.
Konstantin Tarkus

Yanıtlar:


480

Dize veya dosyadan XML okumak için XmlDocument.

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

veya

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

sonra altında bir düğüm bulun yani

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

veya

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

sonra bu düğümün içindeki metni şöyle okuyun

string text = node.InnerText;

veya bir özelliği okuyun

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

Öznitelik yoksa, "[bir şey"] için her zaman null olup olmadığını kontrol edin.


1
Geçerli, ancak Linq to XML çok daha hoş.
Finglas

3
Her ne kadar 'güzel' olduğunu söylese de, LINQ üzerinden bunu yapmanın başka bir dezavantajı var mı? Şahsen bu yöntemi en azından benim için en basit buldum.
Kolors

6
Bunu LINQ kullanmaya başlamadan önce yazdım. LINQ güzeldir ve daha kolay okunabilirliğe sahiptir. Bugünlerde çoğunlukla LINQ kullanıyorum. Ancak bazı bileşenlerin eski stil XML nesnelerine ihtiyacı vardır, bu yüzden ara sıra kullanılmaya devam eder. Hem "eski stil" burada ve LINQ denemenizi tavsiye ve size neyin uygun olduğunu görmek.
Wolf5

1
Olmamalı XmlNode node = XmlDocument.Docu...çizgi gerçekten olmak XmlNode = doc.Docu...? Yanıt neden değiştirildi ve doc.kaldırıldı?
wasatchwizard

Doğru. Bunu neden değiştirdiğime dair hiçbir fikrim yok ... Düzeltecek.
Wolf5

220

LINQ to XML Örneği:

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

Referans : MSDN'de LINQ'dan XML'e


16
XDocument.Parse ( "<xml> şey </ xml>"); bir dize için.
Wolf5

2
Dahil etmeyen insanlar ortalama, tho cevap için teşekkürler :)
Gabriel Garcia

@GabrielGarcia doğru, bazen acemi dahil içerir hatası eksik sıkışmış
Anonim

1
ilgili içerikler nelerdir?
sayth

18

İşte xml site haritalarını okumak için yazdığım bir uygulama:

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()
        {
        }
    }
}

Yapıştırma Kutusundaki Kod http://pastebin.com/yK7cSNeY


12

Çok yol var, bazıları:

  • XmlSerializer. okumak istediğiniz hedef şemasına sahip bir sınıf kullanın - sınıfın bir örneğine yüklenen bir Xml'deki verileri almak için XmlSerializer'ı kullanın.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocumentSystem.Xml.XmlNode
  • XPathDocument (salt okunur erişim)

2
Aslında, .NET 2.0'dan beri XmlTextReader'ı doğrudan kullanmak yerine XmlReader.Create.
John Saunders


7

Linq to XML.

Ayrıca, VB.NET derleyici üzerinden C # daha çok daha iyi xml ayrıştırma desteği vardır. Seçenek ve arzu varsa, bir göz atın .


"Hepsi yanlış"? Doğru değil, düşünmeliyim ki, bu ifade şaka değilse. OP hiçbir bilgi sağlamamıştır. üzerinde çalıştığı .NET sürümü hakkında.
Cerebrus

1
Heh, evet. Jest gibiydi, ama komik değilim, bu yüzden kaldırdım.

7

XML dizelerini okumak için bir DataSet kullanabilirsiniz.

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

Bunu bilgi uğruna yayınlamak.


çok iyi! sql xml sütunları ve .net bilgi paylaşmak için buldum en hızlı yolu s !!
elle0087

Her seviyeyi veri kümesindeki kendi tablosuna koyduğu için birden fazla düzeyiniz olduğunda ideal değildir.
Lenny K

Bunun için hala iyi. Sanırım gerçekte verilerinizin gerçekte nasıl göründüğüne ve verilerin kaç katman derinlikte olduğuna bağlı.
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;
            }
        }
    }

İlk ifadeden kaçınabilir ve yalnızca XmlTextReader yapıcısında yol adını belirtebilirsiniz.


0

Nereden almak istediğinize bağlı olarak farklı yollar vardır. XmlDocument XDocument'ten daha hafiftir, ancak bir dizenin XML içerdiğini minimalist olarak doğrulamak istiyorsanız, normal ifade muhtemelen yapabileceğiniz en hızlı ve en hafif seçimdir. Örneğin, API'm için SpecFlow ile Duman Testleri uyguladım ve herhangi bir geçerli XML'deki sonuçlardan birinin olup olmadığını test etmek istiyorum - o zaman normal bir ifade kullanırım. Ama ben bu XML değerleri ayıklamak gerekirse, o zaman daha hızlı ve daha az kod ile yapmak için XDocument ile ayrıştırmak istiyorum. Ya da ben büyük bir XML ile çalışmak zorunda XmlDocument kullanırdım (ve bazen daha 1M hatları, hatta daha fazla XML ile çalışır); hatta satır satır okuyabiliyordum. Neden? Visual Studio'da özel baytlarda 800MB'den fazla açmayı deneyin; üretimde bile 2GB'tan büyük nesneleriniz olmamalıdır. Bir twerk ile yapabilirsiniz, ama yapmamalısınız. Çok satır içeren bir belgeyi ayrıştırmanız gerekirse, bu belgeler muhtemelen CSV olacaktır.

Bu yorumu yazdım, çünkü XDocument ile bir sürü örnek görüyorum. XDocument, büyük belgeler için iyi değildir veya yalnızca içeriğin XML geçerli olup olmadığını doğrulamak istediğinizde. XML'in mantıklı olup olmadığını kontrol etmek istiyorsanız, Şemaya ihtiyacınız vardır.

Ayrıca önerilen cevabı da düşürdüm, çünkü kendi içinde yukarıdaki bilgilere ihtiyaç duyduğuna inanıyorum. Saatte 10 kez 200M XML'in geçerli XML olup olmadığını doğrulamam gerektiğini düşünelim. XDocument bir sürü kaynağı boşa harcar.

prasanna venkatesh ayrıca dizeyi bir veri kümesine doldurmayı deneyebileceğinizi, geçerli XML'yi de göstereceğini belirtir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.