Tab Menu

Đọc ghi XML C# - Read and Write XML with C#

Read and Write XML with C#, doc va ghi file xml voi C#, xml C#, đọc, ghi file XML với Xpath Read and Write XML with C#
XML (eXtensible Markup Langue) đóng một vai trò quan trọng trong .NET, đọc và ghi một file xml là những xử lý cơ bản chúng ta cần biết. Hôm nay s chia sẽ một cách thức đọc, ghi file XML linh động hơn với Xpath, khác với việc dùng các lớp ghi đọc XML cơ bản của C# như tất cả vẫn thường dùng.

Giới thiệu về System.Xml namespace
Trước tiên hãy làm quen với các Class cơ bản về đọc và ghi trong namespace để chúng ta có khái quát chung.

Tên lớp
Giải thích
XmlReader
Một lớp đọc - trừu tượng nhanh và non-cached dữ liệu XML.
XmlWriter
Một lớp viết - trừu tượng nhanh và non-cached dữ liệu XML trong một dòng hoặc định dạng file.
XmlTexReader
Mở rộng của XmlReader. Cung cấp chuỗi truy cập nhanh dữ liệu XML.
XmlTexWriter
Mở rộng của XmlWriter. Phát nhanh các dòng XML.
XmlNode
Một lớp trừu tượng miêu tả một nút đơn trong một tài liệu XML. Lớp cơ sở cho các lớp khác trong namespace XML.
XmlDocument
Mở rộng của XmlNode. Nó cung cấp một cây miêu tả tài liệu XML trong bộ nhớ, cho phép điều hướng và soạn thảo trước khi Save thành file. Hỗ trợ Xpath.
XmlDataDocument           
Mở rộng của XmlDocument. Đây là một tài liệu có thể được tải từ dữ liệu XML hoặc từ dữ liệu trong một ADO.NET DataSet. Cho phép hòa trộn XML và dữ liệu quan hệ trong cùng một view

Tại sao s lại highlight XMLDocument? Vì bài viết này, s dùng nó để đọc và ghi một XML file mà không dùng các lớp phổ biến phía trên nó. Linh động, dễ dàng xử lý và không thao tác trực tiếp trên XML file là ưu điểm khiến s chọn nó.

Đọc ghi XML file với C#
1. Đọc XML file

Để đọc một XML file trong lớp này, chúng sẽ sử dụng phương thức Load(TenFile) để sao chép cấu trúc của XML file vào một đối tượng XMLDocument. Từ đây mọi thao tác, thay đổi của chúng ta sẽ chỉ xảy ra trên đối tượng này mà không ảnh hưởng đến file XML gốc thumbs up
XmlDocument docXML = new XmlDocument();
docXML.Load("D:\book.xml");
Lúc này, biến docXML là một bản sao hoàn hảo từ XML file. Việc còn lại là chúng ta sẽ tham chiếu đến các node và lấy ra các dữ liệu mà chúng ta muốn.

Nếu bạn chỉ cần đọc và show tất cả các node thì s khuyên bạn nên dùng các XmlTextReader, XmlReader Class thay vì làm theo bài viết này. Vì nó không tận dụng được ưu điểm của XMLDocument mà ngược lại có thể gây phiền phức cho bạn. nerd

Chúng ta nên biết một chút về XPATH trước khi thao tác trên đối tượng XMLDocument. XPATH giúp chúng ta có thể "đi bất cứ đâu" trong một tài liệu XML để select ra các node, thuộc tính cần thiết. Xpath đơn giản chỉ là một chuỗi biểu thức để căn cứ vào đó các node, thuộc tính được chọn ra.

Để chọn ra các Node (bao gồm các node con), cơ bản chúng ta sẽ có 2 phương thức sau:
  • SelectNodes(): Chọn ra một tập các Node thõa điều kiện Xpath.
  • SelectSingleNode(): Chọn ra Node đầu tiên thõa điều kiện.
string xpath = "//book";
// Lấy ra node book đầu tiên.
XmlNode book = Xml.SelectSingleNode(xpath);
// Lấy ra tất cả node book hiện có.
XmlNodeList bookList = Xml.SelectNodes(xpath);
Để lấy giá trị từ các Node đơn trả về, chúng ta sử dụng các thuộc tính sau
  • InnerText: Lấy giá trị của node hiện tại.
  • InnerXml: Lấy node con của node hiện tại dạng XML.
  • OuterXml: Lấy node hiện tại và các node con dạng XML
string value = book.innerText;
// Lấy thuộc tính đầu tiên của node book
string value = book.Attributes[0].InnerText;
Ngoài ra chúng ta còn thể tham chiếu đến rất nhiều thứ thông qua node hiện tại. Xem phần thuộc tính của XmlNode ở cuối bài nhé. Đến đây xem như việc đọc file Xml của ta đã hoàn tất. happy

2. Tạo và ghi XML file

a) Tạo và thêm Node mới trong XML
Để tạo nhanh nội dung cho một XML file mới, chúng ta có thể dùng phương thức LoadXml() và dùng đối tượng XmlTextWriter để lưu chúng thành XML file.

string contentXML = "" +
                        "wrench" +
                        "salipro" +
                        "";
    XmlDocument docXML = new XmlDocument();
    docXML.LoadXml(contentXML);

    // Save thành file.
    XmlTextWriter writer = new XmlTextWriter("data.xml",null);
    writer.Formatting = Formatting.Indented;
    docXML.Save(writer);
Thông thường tạo một Node mới để chèn chúng vào một tài liệu Xml có sẵn, chúng ta sẽ sử dụng những phương thức bên dưới đây.
  • CreateNode(): Tạo node mới.
  • CreateElement(): Tạo element mới cho node.
  • CreateAttribute(): Tạo thuộc tính mới cho node hoặc element.
  • node.PrependChild(element): Thêm element vào trước những element đã có.
  • node.AppendChild(element): Thêm element vào sau những element đã có.
  • node.Attributes.Append(attribute): Thêm thuộc tính vào node.
  • element.Attributes.Append(attribute): Thêm thuộc tính vào element.
  • root.AppendChild(node): Thêm node vừa tạo vào node khác, cụ thể là root.
            // Lấy node gốc đã có
            XmlNode root = Xml.SelectSingleNode("/bookstore");
            // Tạo một node mới.
            XmlNode node = Xml.CreateNode(XmlNodeType.Element, "book", null);
            XmlAttribute attCat = Xml.CreateAttribute("category");
            node.Attributes.Append(attCat);
         
            XmlElement  = Xml.CreateElement("title");
            element1.InnerText = "Tên sách";
            XmlElement  = Xml.CreateElement("price");
            element2.InnerText = "Giá";
            node.AppendChild(element1);
            node.AppendChild(element2);
            // Thêm node vào bookstore
            root.AppendChild(node);           

b) Cập nhật một Node
Chúng ta sẽ dùng phương thức ReplaceChild() để cập nhật một node. Xem ví dụ bên dưới
            XmlNode root = Xml.SelectSingleNode("/bookstore");
            XmlNodeList titleList = Xml.SelectNodes("//book/title");

            //Giả sử chúng ta đã tạo ra một node mới từ TaoNodeMoi()
            XmlNode newNode = TaoNodeMoi(title, price);

            XmlNode oldNode = null;

            foreach (XmlNode nameBook in titleList)
            {
                if (nameBook.InnerText == "AAA")
                {
                    //Xác định Node cần cập nhật.
                    oldNode = nameBook.ParentNode;
                    //Cập nhật Node
                    root.ReplaceChild(newNode, oldNode);
                    break;
                }
            }
Ví dụ trên mục tiêu là cập nhật Node "book"title = "AAA". Đầu tiên ta cần tham chiếu đến node Cha của Node book (cụ thể root), vì chỉ có node Cha mới đủ quyền thao tác, điều này đúng cho cả phần Xóa node.

c) Xóa Node
Hoàn toàn tương tự nhứ Cập nhật node, ở đây chúng ta sử dung phương thức RemoveChild(). Ngoài ra, chúng ta có thể tham khảo phần method của XmlNode bên dưới hiểu thêm về nhiều phương thức khác.

Tham khảo
Lớp XmlDocument: http://msdn.microsoft.com/.../system.xml.xmldocument.aspx
Thuộc tính XmlNode: http://msdn.microsoft.com/.../system.xml.xmlnode_properties.aspx
Cách đọc và ghi khác: http://www.c-sharpcorner.com/.../ReadWriteXMLTutMellli21.aspx

Hiện có 7 comments

Anonymous

Bài này là để ôn tập cho người "đã biết rồi" hở bạn?
Có bài nào dành cho beginer không?
Bài gì mà khó hiểu...à nhầm phải là "cực cực cực" khó hiểu chứ

Anonymous

Bạn chỉ có nói công dụng và Demo chứ chả có gì cả. Học trang này chắc gọi là học vẹt mất

Anonymous

2 comment trên mình thấy như có vẻ các bạn chưa biết xml là gì nên đọc vào khong hỉu gì là đúng rùi, các bạn nên có kiến thức về xml trước thì mới coi cách dùng C# để xử lý file .xml. :). Các bạn đừng quăng gạch thớt khỏi tội nghiệp. :)

Unknown

Bài viết khá tốt, cám ơn bạn đã bỏ công sức ra viết bài này. :)

name

Thanks you, bài đăng rất hữu ích :x

mùi trần văn

XmlNode book = Xml.SelectSingleNode(xpath);
Vì sao mình ko làm dc câu lệnh này rồi hèo. Xml does not exist rồi. đã using system.xml;

Post a Comment

Bạn có thể tự do cho ý kiến, thảo luận về bài viết này nhưng phải theo những điều khoản sau:
- Phải nghiêm túc, không dung tục, không spam.
- Nội dung phải liên quan đến bài viết.
- Không mang tính chất chính trị...
- Hạn chế sử dụng Ẩn danh, hãy dùng Tên/URL để thay thế.
Lưu ý : Có thể sử dụng tag HTML cơ bản trong comment: br, b, i, u, a href= ...

:)
:(
;)
:D
=))
:-/
:x
I-)
@-)
=D:
:-q
:-w
[-X
B-)
:((
:-B
:-h
:x(
:-*
~O)
@};-

About

RSS
Coming soon... :))