傳統字串拼接生成 XML 易出錯、難維護。XmlTextWriter 以只進方式輸出 XML 至流/檔案,保證符合 W3C XML 1.0 規範,自動處理閉合標籤、縮進、命名空間。
.NET 僅提供 XmlTextWriter 具體實作(XmlWriter 為抽象基類)。
StringBuilder sb = new StringBuilder();
sb.Append("");
foreach (string s in theArray) {
sb.Append(" ");
}
sb.Append(" ");
void CreateXmlFileUsingWriters(String[] theArray, string filename)
{
XmlTextWriter xmlw = new XmlTextWriter(filename, null);
xmlw.Formatting = Formatting.Indented;
xmlw.WriteStartDocument();
xmlw.WriteStartElement("array");
foreach (string s in theArray)
{
xmlw.WriteStartElement("element");
xmlw.WriteAttributeString("value", s);
xmlw.WriteEndElement();
}
xmlw.WriteEndDocument();
xmlw.Close();
}
WriteState 列舉定義狀態流轉:
| 狀態 | 說明 |
|---|---|
| Start | 初始狀態,等待寫入調用 |
| Prolog | 調用 WriteStartDocument 後,寫入 XML 序言 |
| Element | 寫入根元素開始標籤後 |
| Attribute | 調用 WriteStartAttribute 時(非 WriteAttributeString) |
| Content | 寫入閉合標籤 > 後 |
| Closed | Close 已調用,不可再寫入 |
狀態轉換邏輯:Start → Prolog → Element → (Attribute/Content) → ... → Closed
WriteBase64/WriteBinHex 接受 byte[] 而非字串。Encoding.GetBytes 完成字串轉 byte[]。
XmlTextWriter xmlw = new XmlTextWriter(filename, null);
xmlw.Formatting = Formatting.Indented;
xmlw.WriteStartDocument();
xmlw.WriteComment("Array to Base64 XML");
xmlw.WriteStartElement("array");
xmlw.WriteAttributeString("xmlns", "x", null, "dinoe:msdn-mag");
foreach (string s in theArray)
{
xmlw.WriteStartElement("x", "element", null);
xmlw.WriteBase64(Encoding.Unicode.GetBytes(s), 0, s.Length * 2);
xmlw.WriteEndElement();
}
xmlw.WriteEndDocument();
xmlw.Close();
// 讀取驗證
XmlTextReader reader = new XmlTextReader(filename);
while (reader.Read())
{
if (reader.LocalName == "element")
{
byte[] bytes = new byte[1000];
int n = reader.ReadBase64(bytes, 0, 1000);
string buf = Encoding.Unicode.GetString(bytes);
Console.WriteLine(buf.Substring(0, n));
}
}
reader.Close();

XmlTextReader reader = new XmlTextReader(filename);
while (reader.Read()) {
if (reader.LocalName == "element") {
byte[] bytes = new byte[1000];
int n = reader.ReadBase64(bytes, 0, 1000);
string buf = Encoding.Unicode.GetString(bytes);
Console.WriteLine(buf.Substring(0, n));
}
}
reader.Close();
同樣適用 BinHex(替換為 ReadBinHex)。此技術可處理任何 byte[] 形式的二進制數據(特別是圖像)。