首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Framework 輕鬆處理 XML 數據(四):XmlTextWriter 深度解析與 Base64/BinHex 流處理

     編輯:關於.NET

XmlTextWriter:強類型 XML 創建利器

傳統字串拼接生成 XML 易出錯、難維護。XmlTextWriter 以只進方式輸出 XML 至流/檔案,保證符合 W3C XML 1.0 規範,自動處理閉合標籤、縮進、命名空間。

.NET 僅提供 XmlTextWriter 具體實作(XmlWriter 為抽象基類)。

傳統方式 vs XmlTextWriter

字串拼接範例(易錯、擴充困難)

StringBuilder sb = new StringBuilder();
sb.Append("");
foreach (string s in theArray) {
    sb.Append("");
}
sb.Append("");

XmlTextWriter 範例(結構清晰、易讀)

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();
}

XmlTextWriter 限制與注意事項

  • 不檢查元素/屬性名稱有效性
  • 不保證 Unicode 字符適配當前編碼
  • 不檢驗屬性名稱與元素名稱衝突
  • 非驗證式 Writer,不保證輸出符合 Schema/DTD
  • 避免傳遞敏感標記字符(如 <),需用 WriteRaw 輸出原始字串

Writer 狀態機模型

WriteState 列舉定義狀態流轉:

表 7:Writer 狀態值

狀態說明
Start初始狀態,等待寫入調用
Prolog調用 WriteStartDocument 後,寫入 XML 序言
Element寫入根元素開始標籤後
Attribute調用 WriteStartAttribute 時(非 WriteAttributeString)
Content寫入閉合標籤 > 後
ClosedClose 已調用,不可再寫入

狀態轉換邏輯:Start → Prolog → Element → (Attribute/Content) → ... → Closed

緩衝區與屬性寫入兩種方式

  • Flush():清空緩衝區寫入流,釋放部分記憶體,Writer 保持開啟
  • 屬性寫入法一:WriteStartAttribute → WriteString → WriteEndElement
  • 屬性寫入法二:WriteAttributeString(狀態為 Element 時單獨創建屬性)

讀寫 Base64 與 BinHex 編碼流

WriteBase64/WriteBinHex 接受 byte[] 而非字串。Encoding.GetBytes 完成字串轉 byte[]。

範例:字串陣列持久化為 Base64 XML

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();

Base64 輸出結果

Reader 解析 Base64/BinHex

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[] 形式的二進制數據(特別是圖像)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved