Làm cách nào để đọc và phân tích tệp XML trong C #?


362

Làm cách nào để đọc và phân tích tệp XML trong C #?


2
Solutin đơn giản nhất là sử dụng LINQ to XML. Xem ví dụ của tôi.
Konstantin Tarkus

Câu trả lời:


480

XmlDocument để đọc XML từ chuỗi hoặc từ tệp.

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

hoặc là

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

sau đó tìm một nút bên dưới nó tức là như thế này

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

hoặc là

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

sau đó đọc văn bản bên trong nút đó như thế này

string text = node.InnerText;

hoặc đọc một thuộc tính

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

Luôn kiểm tra null trên các thuộc tính ["cái gì đó"] vì nó sẽ là null nếu thuộc tính không tồn tại.


1
Hợp lệ, nhưng Linq to XML đẹp hơn nhiều.
Fingerlas

3
Mặc dù bạn nói nó 'đẹp hơn' nhưng có bất lợi nào khác khi làm theo cách này trên LINQ không? Cá nhân tôi thấy phương pháp này là đơn giản nhất, ít nhất là cho nhu cầu của tôi.
Kolors

6
Tôi đã viết điều này trước khi tôi bắt đầu sử dụng LINQ. LINQ là tốt đẹp và có thể dễ đọc hơn. Tôi chủ yếu sử dụng LINQ những ngày này. Nhưng một số thành phần cần các đối tượng XML kiểu cũ, vì vậy nó vẫn được sử dụng ngay bây giờ. Tôi khuyên bạn nên thử cả "kiểu cũ" ở đây và LINQ và xem những gì phù hợp với bạn.
Wolf5

1
Không nên XmlNode node = XmlDocument.Docu...thực sự là dòng XmlNode = doc.Docu...? Tại sao câu trả lời đã thay đổi và doc.bị loại bỏ?
wasatchwizard

Thật. Tôi không biết tại sao tôi lại thay đổi ... Sẽ sửa.
Wolf5

218

Ví dụ 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);
}

Tham khảo : LINQ to XML tại MSDN


16
XDocument.Pude ("<xml> gì đó </ xml>"); cho một chuỗi.
Wolf5

2
Những người không bao gồm bao gồm có nghĩa là, cảm ơn vì câu trả lời tho :)
Gabriel Garcia

@GabrielGarcia đúng, đôi khi người mới bắt đầu sẽ bị mất tích bao gồm lỗi
Ẩn danh

1
những gì có liên quan bao gồm?
sayth

18

Đây là một ứng dụng tôi đã viết để đọc sơ đồ trang web 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()
        {
        }
    }
}

Mã trên Thùng dán http://pastebin.com/yK7cSNeY


12

Có rất nhiều cách, một số:

  • XmlSerializer. sử dụng một lớp với lược đồ đích mà bạn muốn đọc - sử dụng XmlSerializer để lấy dữ liệu trong một Xml được tải vào một thể hiện của lớp.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (truy cập chỉ đọc)

2
Trên thực tế, XmlReader.Create thay vì sử dụng trực tiếp XmlTextReader, kể từ .NET 2.0.
John Saunders


7

Linq sang XML.

Ngoài ra, VB.NET có hỗ trợ phân tích xml tốt hơn nhiều thông qua trình biên dịch so với C #. Nếu bạn có tùy chọn và mong muốn, hãy kiểm tra nó.


"Sai hết"? Không chính xác, tôi nên suy nghĩ, trừ khi tuyên bố đó là trong trò đùa. OP đã không cung cấp thông tin. về phiên bản .NET mà anh ấy làm việc.
Cerebrus

1
Heh, vâng. Đó là trong trò đùa, nhưng tôi không hài hước, vì vậy tôi đã loại bỏ nó.

7

Bạn có thể sử dụng Bộ dữ liệu để đọc các chuỗi XML.

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

Đăng bài này vì lợi ích của thông tin.


rất ổn! đó là cách nhanh nhất tôi tìm thấy để chia sẻ thông tin từ các cột sql xml và .net !!
elle0087

Không lý tưởng khi bạn có nhiều cấp độ vì nó xuất hiện để đặt từng cấp vào bảng riêng trong tập dữ liệu.
Lenny K

Nó vẫn tốt cho điều đó. Tôi đoán nó thực sự phụ thuộc vào dữ liệu của bạn thực sự trông như thế nào và dữ liệu mà bạn đang theo dõi có bao nhiêu lớp.
dùng2366842


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

Bạn có thể tránh câu lệnh đầu tiên và chỉ định tên đường dẫn trong hàm tạo của XmlTextReader.


0

Có nhiều cách khác nhau, tùy thuộc vào nơi bạn muốn nhận. XmlDocument nhẹ hơn XDocument, nhưng nếu bạn muốn xác minh một cách tối giản rằng một chuỗi chứa XML, thì biểu thức chính quy có thể là lựa chọn nhanh nhất và nhẹ nhất bạn có thể thực hiện. Ví dụ: tôi đã triển khai Kiểm tra khói với SpecFlow cho API của mình và tôi muốn kiểm tra nếu một trong các kết quả trong bất kỳ XML hợp lệ nào - thì tôi sẽ sử dụng biểu thức chính quy. Nhưng nếu tôi cần trích xuất các giá trị từ XML này, thì tôi sẽ phân tích nó với XDocument để thực hiện nhanh hơn và với ít mã hơn. Hoặc tôi sẽ sử dụng XmlDocument nếu tôi phải làm việc với một XML lớn (và đôi khi tôi làm việc với XML có khoảng 1M dòng, thậm chí nhiều hơn); sau đó tôi thậm chí có thể đọc từng dòng một. Tại sao? Hãy thử mở hơn 800 MB theo byte riêng tư trong Visual Studio; ngay cả khi sản xuất, bạn không nên có các đối tượng lớn hơn 2GB. Bạn có thể với một twerk, nhưng bạn không nên. Nếu bạn phải phân tích một tài liệu chứa RẤT NHIỀU dòng thì tài liệu này có thể sẽ là CSV.

Tôi đã viết bình luận này, bởi vì tôi thấy một loạt các ví dụ với XDocument. XDocument không tốt cho các tài liệu lớn hoặc khi bạn chỉ muốn xác minh xem nội dung đó có hợp lệ không. Nếu bạn muốn kiểm tra xem bản thân XML có hợp lý hay không, thì bạn cần Schema.

Tôi cũng đánh giá thấp câu trả lời được đề xuất, bởi vì tôi tin rằng nó cần thông tin trên trong chính nó. Hãy tưởng tượng tôi cần xác minh xem 200M XML, 10 lần một giờ, có phải là XML hợp lệ không. XDocument sẽ lãng phí một nguồn tài nguyên.

prasanna venkatesh cũng nói rằng bạn có thể thử điền chuỗi vào tập dữ liệu, nó cũng sẽ chỉ ra XML hợp lệ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.