XmlTextWriter 是 .NET 中以串流方式產生 XML 的核心類別,支援編碼控制、格式化縮排、命名空間、CDATA、Base64 等完整 XML 功能。本文詳細說明建構函式、核心方法,並提供六個實際範例:基本元素、屬性、巢狀結構、複製節點、CDATA、Base64 圖片編碼。
public XmlTextWriter(TextWriter w);
public XmlTextWriter(Stream s, Encoding enc);
public XmlTextWriter(string filename, Encoding enc); // 最常用:指定檔案路徑與編碼
| 方法 | 用途 |
|---|---|
WriteStartDocument() | 寫入 XML 宣告 |
WriteEndDocument() | 關閉所有開啟元素,重設狀態 |
WriteStartElement(name) | 寫入開始標籤,支援前綴/命名空間多載 |
WriteEndElement() | 寫入結束標籤 (或自動縮寫 />) |
WriteElementString(name, value) | 一次寫入完整元素 <name>value</name> |
WriteAttributeString(name, value) | 在當前元素寫入屬性 |
WriteStartAttribute/WriteEndAttribute | 手動控制屬性範圍 (支援實體編碼) |
WriteNode(XmlReader, bool) | 從 Reader 複製節點至 Writer |
WriteComment(text) | 寫入註解 <!-- text --> |
WriteCData(text) | 寫入 CDATA 區段 |
WriteBase64(buffer, index, count) | 二進位資料 Base64 編碼寫入 |
Flush()/Close() | 刷新緩衝區/關閉串流 |

XmlTextWriter w = new XmlTextWriter("ex1.xml", Encoding.UTF8);
w.Formatting = Formatting.Indented;
w.WriteStartDocument();
w.WriteElementString("message", "Hello XML");
w.WriteEndDocument();
w.Close();
w.WriteStartDocument();
w.WriteStartElement("book");
w.WriteAttributeString("isbn", "978-1234567890");
w.WriteElementString("title", "C# in Depth");
w.WriteElementString("author", "Jon Skeet");
w.WriteEndElement(); // book
w.WriteEndDocument();
來源檔 唐詩.xml:
<唐詩>
<五言絕句>
<作者 字號="太白">李白作者>
<標題>靜夜思標題>
<內容>床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。內容>
五言絕句>
...
唐詩>
XmlTextReader reader = new XmlTextReader("唐詩.xml");
XmlTextWriter writer = new XmlTextWriter("copy.xml", Encoding.UTF8);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
while (reader.Read())
{
if (reader.Name == "五言絕句" && reader.NodeType == XmlNodeType.Element)
writer.WriteNode(reader, true); // 複製整個五言絕句節點含屬性
}
writer.WriteEndDocument();
writer.Close(); reader.Close();
// 產生包含多層巢狀、屬性、註解的完整 XML
w.WriteStartElement("script");
w.WriteCData("if (a < b) { doSomething(); }"); // 內含特殊字元無需跳脫
w.WriteEndElement();
// 編碼寫入
byte[] imgBytes = File.ReadAllBytes("photo.jpg");
w.WriteStartElement("image");
w.WriteAttributeString("format", "jpeg");
w.WriteBase64(imgBytes, 0, imgBytes.Length);
w.WriteEndElement();
// 解碼還原
XmlDocument doc = new XmlDocument();
doc.Load("image.xml");
string b64 = doc.SelectSingleNode("/image").InnerText;
byte[] restored = Convert.FromBase64String(b64);
File.WriteAllBytes("restored.jpg", restored);
using (XmlTextWriter w = new XmlTextWriter(...)) { ... } 自動 Close()。XmlWriter.Create(stream, settings) 提供更多設定 (如 NewLineChars, IndentChars) 且為抽象工廠模式。System.Xml.Linq.XDocument / XElement 以函數式建構 XML,語法更簡潔:new XElement("root", new XElement("child", "value"))。XmlTextWriter 以串流方式產生 XML,記憶體效率高、功能完整。掌握其核心方法與建構模式,能應對各類 XML 產出需求。新專案建議優先使用 LINQ to XML (XDocument) 享受更優雅的語法與整合查詢能力。