? Bạn cần đọc XML từ một stream, hoặc ghi nó ra một stream. Tuy nhiên, bạn muốn xử lý từng nút một, không phải nạp toàn bộ vào bộ nhớ với một XmlDocument.
» Để ghi XML, hãy tạo một XmlTextWriter bọc lấy một stream và sử dụng các phương thức Write (như WriteStartElement và WriteEndElement). Để đọc XML, hãy tạo một XmlTextReader bọc lấy một stream và gọi phương thức Read để dịch chuyển từ nút này sang nút khác.
Lớp XmlTextWriter và XmlTextReader đọc/ghi XML trực tiếp từ stream từng nút một. Các lớp này không cung cấp các tính năng dùng để duyệt và thao tác tài liệu XML như XmlDocument, nhưng hiệu năng cao hơn và vết bộ nhớ nhỏ hơn, đặc biệt khi bạn làm việc với các tài liệu XML cực kỳ lớn.
Để ghi XML ra bất kỳ stream nào, bạn có thể sử dụng XmlTextWriter. Lớp này cung cấp các phương thức Write dùng để ghi từng nút một, bao gồm:
• WriteStartDocument—ghi phần khởi đầu của tài liệu; và WriteEndDocument, đóng bất kỳ phần tử nào đang mở ở cuối tài liệu.
• WriteStartElement—ghi một thẻ mở (opening tag) cho phần tử bạn chỉ định. Kế đó, bạn có thể thêm nhiều phần tử lồng bên trong phần tử này, hoặc bạn có thể gọi WriteEndElement để ghi thẻ đóng (closing tag).
• WriteElementString—ghi một phần tử, cùng với một thẻ mở, một thẻ đóng, và nội dung text.
• WriteAttributeString—ghi một đặc tính cho phần tử đang mở gần nhất, cùng với tên và giá trị.
Sử dụng các phương thức này thường cần ít mã lệnh hơn là tạo một XmlDocument bằng tay, như được trình bày trong mục 5.2 và 5.3.
Để đọc XML, bạn sử dụng phương thức Read của XmlTextReader. Phương thức này tiến reader đến nút kế tiếp, và trả về true. Nếu không còn nút nào nữa, nó sẽ trả về false. Bạn có thể thu lấy thông tin về nút hiện tại thông qua các thuộc tính của XmlTextReader (bao gồm Name, Value, và NodeType).
Để nhận biết một phần tử có các đặc tính hay không, bạn phải kiểm tra thuộc tính HasAttributes và rồi sử dụng phương thức GetAttribute để thu lấy các đặc tính theo tên hay theo chỉ số. Lớp XmlTextReader chỉ có thể truy xuất một nút tại một thời điểm, và nó không thể dịch chuyển ngược hay nhảy sang một nút bất kỳ. Do đó, tính linh hoạt của nó kém hơn lớp XmlDocument.
Ứng dụng dưới đây ghi và đọc một tài liệu XML bằng lớp XmlTextWriter và XmlTextReader. Tài liệu này giống với tài liệu đã được tạo trong mục 5.2 và 5.3 bằng lớp XmlDocument.

Visual C# Code:
  1. using System;
  2. using System.Xml;
  3. using System.IO;
  4. using System.Text;
  5.  
  6. public class ReadWriteXml {
  7.  
  8.     private static void Main() {
  9.  
  10.         // Tạo file và writer.
  11.         FileStream fs = new FileStream("products.xml", FileMode.Create);
  12.         XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
  13.  
  14.         // Khởi động tài liệu.
  15.         w.WriteStartDocument();
  16.         w.WriteStartElement("products");
  17.  
  18.         // Ghi một product.
  19.         w.WriteStartElement("product");
  20.         w.WriteAttributeString("id", "1001");
  21.         w.WriteElementString("productName", "Gourmet Coffee");
  22.         w.WriteElementString("productPrice", "0.99");
  23.         w.WriteEndElement();
  24.  
  25.         // Ghi một product khác.
  26.         w.WriteStartElement("product");
  27.         w.WriteAttributeString("id", "1002");
  28.         w.WriteElementString("productName", "Blue China Tea Pot");
  29.         w.WriteElementString("productPrice", "102.99");
  30.         w.WriteEndElement();
  31.  
  32.         // Kết thúc tài liệu.
  33.         w.WriteEndElement();
  34.         w.WriteEndDocument();
  35.         w.Flush();
  36.         fs.Close();
  37.  
  38.         Console.WriteLine("Document created. " +
  39.           "Press Enter to read the document.");
  40.         Console.ReadLine();
  41.  
  42.         fs = new FileStream("products.xml", FileMode.Open);
  43.         XmlTextReader r = new XmlTextReader(fs);
  44.  
  45.         // Đọc tất cả các nút.
  46.         while (r.Read()) {
  47.  
  48.            if (r.NodeType == XmlNodeType.Element) {
  49.  
  50.                 Console.WriteLine();
  51.                 Console.WriteLine("<" + r.Name + ">");
  52.  
  53.                 if (r.HasAttributes) {
  54.  
  55.                     for (int i = 0; i < r.AttributeCount; i++) {
  56.                         Console.WriteLine("\tATTRIBUTE: " +
  57.                           r.GetAttribute(i));
  58.                     }
  59.                 }
  60.             }
  61.             else if (r.NodeType == XmlNodeType.Text) {
  62.                 Console.WriteLine("\tVALUE: " + r.Value);
  63.             }
  64.         }
  65.         Console.ReadLine();
  66.     }
  67. }

Trích từ "Các giải pháp lập trình C#"