ฉันจะอ่านและแยกวิเคราะห์ไฟล์ XML ใน C # ได้อย่างไร


362

ฉันจะอ่านและแยกวิเคราะห์ไฟล์ XML ใน C # ได้อย่างไร


2
โซลูตินที่ง่ายที่สุดคือใช้ LINQ กับ XML ดูตัวอย่างของฉัน
Konstantin Tarkus

คำตอบ:


480

XmlDocument เพื่ออ่าน XML จากสตริงหรือจากไฟล์

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

หรือ

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

จากนั้นหาโหนดด้านล่างมันเช่นนี้

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

หรือ

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

จากนั้นอ่านข้อความในโหนดนั้นเช่นนี้

string text = node.InnerText;

หรืออ่านคุณสมบัติ

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

ตรวจสอบค่าว่างของแอตทริบิวต์ ["บางอย่าง"] เสมอเนื่องจากจะเป็นค่าว่างหากแอตทริบิวต์นั้นไม่มีอยู่


1
ถูกต้อง แต่ Linq ถึง XML นั้นดีกว่ามาก
Finglas

3
แม้ว่าคุณจะบอกว่ามัน 'ดีกว่า' มีข้อเสียอื่น ๆ ที่ทำเช่นนี้กับ LINQ หรือไม่? โดยส่วนตัวแล้วฉันพบว่าวิธีนี้เป็นวิธีที่ง่ายที่สุดอย่างน้อยก็สำหรับความต้องการของฉัน
Kolors

6
ฉันเขียนสิ่งนี้ก่อนที่ฉันจะเริ่มใช้ LINQ LINQ นั้นดีและสามารถอ่านได้ง่ายขึ้น วันนี้ฉันใช้ LINQ เป็นส่วนใหญ่ แต่บางองค์ประกอบต้องการวัตถุ XML แบบเก่าดังนั้นจึงยังคงสามารถใช้งานได้ในตอนนี้ ฉันขอแนะนำให้ลองทั้ง "แบบเก่า" ที่นี่และ LINQ และดูว่าอะไรเหมาะกับคุณ
Wolf5

1
XmlNode node = XmlDocument.Docu...เส้นไม่ควรเป็นจริงXmlNode = doc.Docu...หรือ ทำไมคำตอบถูกเปลี่ยนและdoc.ลบออก?
wasatchwizard

จริง ฉันไม่รู้ว่าทำไมฉันถึงเปลี่ยน ... จะแก้ไข
Wolf5

217

ตัวอย่าง LINQ ถึง 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);
}

การอ้างอิง : LINQ ถึง XMLที่ MSDN


16
XDocument.Parse ( "<XML> สิ่งที่ </ XML>"); สำหรับสตริง
Wolf5

2
คนที่ไม่ได้รวมถึงการรวมเป็นค่าเฉลี่ยขอบคุณสำหรับคำตอบสรรพสินค้า :)
Gabriel Garcia

@GabrielGarcia จริงบางครั้งผู้เริ่มต้นอาจติดอยู่ที่ข้อผิดพลาดที่ขาดหายไปของรวม
Anonymous

1
สิ่งที่เกี่ยวข้องรวมถึงอะไร
sayth

18

นี่คือแอปพลิเคชันที่ฉันเขียนเพื่ออ่านแผนผังไซต์ 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()
        {
        }
    }
}

รหัสบน Paste Bin http://pastebin.com/yK7cSNeY


12

มีหลายวิธีบางอย่าง:

  • XmlSerializer ใช้คลาสที่มีสกีมาเป้าหมายที่คุณต้องการอ่าน - ใช้ XmlSerializer เพื่อรับข้อมูลใน Xml ที่โหลดเข้าไปในอินสแตนซ์ของคลาส
  • Linq 2 xml
  • XmlTextReader
  • XmlDocument
  • XPathDocument (การเข้าถึงแบบอ่านอย่างเดียว)

2
ที่จริงแล้ว XmlReader.Create แทนที่จะใช้ XmlTextReader โดยตรงตั้งแต่. NET 2.0
จอห์นแซนเดอ


7

Linq ถึง XML

นอกจากนี้ VB.NET ยังมีการแยกวิเคราะห์ xml ที่ดีกว่าผ่านทางคอมไพเลอร์มากกว่า C # หากคุณมีตัวเลือกและความปรารถนาลองดูสิ


"ผิดทั้งหมด"? ไม่ถูกต้องฉันควรคิดยกเว้นว่าข้อความนั้นเป็นเรื่องตลก OP ไม่ได้ให้ข้อมูลใด ๆ เกี่ยวกับเวอร์ชั่น. NET ที่เขาทำงาน
Cerebrus

1
เฮ้ใช่ มันเป็นเรื่องตลก แต่ฉันไม่ตลกเลยฉันเอามันออกไป

7

คุณสามารถใช้ชุดข้อมูลเพื่ออ่านสตริง XML

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

การโพสต์สิ่งนี้เพื่อประโยชน์ของข้อมูล


สบายมาก! มันเป็นวิธีที่เร็วที่สุดที่ฉันพบว่าใช้ข้อมูลร่วมกันจากคอลัมน์ sql xml และ. net !!
elle0087

ไม่เหมาะเมื่อคุณมีหลายระดับตามที่ปรากฏเพื่อใส่แต่ละระดับลงในตารางของตัวเองภายในชุดข้อมูล
Lenny K

มันก็ยังดีอยู่ดี ฉันเดาว่ามันขึ้นอยู่กับว่าข้อมูลของคุณมีลักษณะเป็นอย่างไรและมีชั้นข้อมูลจำนวนมากเท่าไร
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;
            }
        }
    }

คุณสามารถหลีกเลี่ยงคำสั่งแรกและเพียงระบุชื่อเส้นทางในตัวสร้างของ XmlTextReader


0

มีหลายวิธีขึ้นอยู่กับตำแหน่งที่คุณต้องการ XmlDocument เบากว่า XDocument แต่ถ้าคุณต้องการตรวจสอบว่าสตริงมี XML น้อยที่สุดการแสดงออกปกติอาจเป็นตัวเลือกที่เร็วและเบาที่สุดที่คุณสามารถทำได้ ตัวอย่างเช่นฉันได้ติดตั้ง Smoke Tests กับ SpecFlow สำหรับ API ของฉันและฉันต้องการทดสอบว่าผลลัพธ์ใดรายการหนึ่งใน XML ที่ถูกต้อง - จากนั้นฉันจะใช้นิพจน์ทั่วไป แต่ถ้าฉันต้องการแยกค่าจาก XML นี้ฉันจะแยกมันด้วย XDocument เพื่อทำมันให้เร็วขึ้นและใช้รหัสน้อยลง หรือฉันจะใช้ XmlDocument ถ้าฉันต้องทำงานกับ XML ขนาดใหญ่ (และบางครั้งฉันทำงานกับ XML ที่มีบรรทัดประมาณ 1M ยิ่งกว่านั้น); จากนั้นฉันก็สามารถอ่านทีละบรรทัด ทำไม? ลองเปิดมากกว่า 800MB ในไบต์ส่วนตัวใน Visual Studio แม้ในการผลิตคุณไม่ควรมีวัตถุที่ใหญ่กว่า 2GB คุณสามารถทำได้ด้วยการกระตุก แต่คุณไม่ควร หากคุณต้องแยกวิเคราะห์เอกสารซึ่งมีบรรทัดจำนวนมากเอกสารนี้อาจเป็น CSV

ฉันได้เขียนความคิดเห็นนี้เพราะฉันเห็นตัวอย่างของ XDocument XDocument ไม่ดีสำหรับเอกสารขนาดใหญ่หรือเมื่อคุณต้องการตรวจสอบว่ามีเนื้อหาที่ถูกต้อง XML หากคุณต้องการตรวจสอบว่า XML นั้นเหมาะสมหรือไม่คุณจำเป็นต้องมี Schema

ฉันยัง downvote คำตอบที่แนะนำเพราะฉันเชื่อว่ามันต้องการข้อมูลข้างต้นภายในตัวเอง ลองนึกภาพฉันต้องตรวจสอบว่า 200M ของ XML, 10 ครั้งต่อชั่วโมงเป็น XML ที่ถูกต้องหรือไม่ XDocument จะทำให้สิ้นเปลืองทรัพยากร

prasanna venkatesh ยังระบุว่าคุณสามารถลองเติมสตริงไปยังชุดข้อมูลก็จะระบุ XML ที่ถูกต้องเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.