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