為什麼用 XmlTextWriter?
- 前向寫入、流式處理,記憶體效率高。
- 自動處理逸出字元、編碼、縮排格式。
- 支援寫入檔案、串流、
TextWriter。
建構函式
// 寫入檔案(指定編碼)
var writer = new XmlTextWriter("output.xml", Encoding.UTF8);
// 寫入串流
var writer = new XmlTextWriter(memoryStream, Encoding.UTF8);
// 寫入 TextWriter
var writer = new XmlTextWriter(stringWriter);
核心方法速查
| 方法 | 用途 | 範例輸出 |
WriteStartDocument() | 寫入 XML 宣告 | |
WriteEndDocument() | 關閉所有開啟元素 | - |
WriteStartElement("name") | 開始元素 | |
WriteEndElement() | 結束元素 | 或 /> |
WriteElementString("n", "v") | 寫入含值元素 | v |
WriteStartAttribute("attr") | 開始屬性 | attr=" |
WriteEndAttribute() | 結束屬性 | " |
WriteAttributeString("a", "v") | 寫入屬性 | a="v" |
WriteCData("text") | 寫入 CDATA | |
WriteComment("text") | 寫入註解 | |
WriteNode(reader, false) | 從 XmlReader 複製節點 | - |
Flush()/Close() | 刷新/關閉 | - |
實戰範例:產生唐詩 XML
using (var writer = new XmlTextWriter("TangPoems.xml", Encoding.UTF8))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("唐詩");
writer.WriteStartElement("五言絕句");
writer.WriteAttributeString("作者", "李白");
writer.WriteAttributeString("字號", "太白");
writer.WriteElementString("標題", "靜夜思");
writer.WriteElementString("內容", "床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。");
writer.WriteEndElement(); // 五言絕句
// 更多詩句...
writer.WriteEndElement(); // 唐詩
writer.WriteEndDocument();
}
進階技巧
- 命名空間:
WriteStartElement("prefix", "local", "nsUri")。
- Base64 編碼二進位:
WriteBase64(byte[], offset, count) 可將圖片嵌入 XML。
- 實體字元處理:屬性值含
&、< 等時,使用 WriteStartAttribute + WriteString + WriteCharEntity 組合寫入。
注意事項
- 一定要呼叫
Close() 或 Dispose(),否則輸出可能不完整。
- .NET Core / .NET 5+ 建議改用
XmlWriter.Create 工廠方法,提供更多設定選項(如 XmlWriterSettings)。
XmlTextWriter 在新版標記為過時但仍可使用,內部實作相同。