MSXML 為 COM 元件,深層嵌入作業系統,作為外部服務元件使用。.NET Framework XML 類別直接整合於命名空間,代碼更易讀、互操作性更強。雖 MSXML 支援非同步分析,但 .NET 透過與其他類別整合可輕鬆實現同等功能並擴展更多特性。
| 模式 | 代表 | 特點 |
| 樹狀 | XMLDOM | 文檔載入記憶體樹結構,功能完整但大文檔佔用大量記憶體,不可擴展 |
| 事件驅動 | SAX | 流式處理,推模式,記憶體佔用極小,但必須處理所有資訊(含無用) |
| 游標式 | XmlReader/XmlWriter | .NET 核心模式,只進唯讀/只寫,拉模式,應用程式主動拉取所需數據,兼具 DOM 功能與 SAX 效能 |
.NET 完整支援 XMLDOM,不支援 SAX,但 XmlReader 可輕鬆實現所有 SAX 功能且更高效。XmlReader/XmlWriter 為所有 .NET XML 類別(含 XMLDOM、ADO.NET、配置類)的基礎抽象類。
XmlReader 核心架構
類似資料庫游標:客戶端獲取閱讀器引用,實例提取底層流呈現為 XML 樹。提供只進、唯讀、游標式 API,無父/子/兄弟節點概念。
三大具體閱讀器類別
- XmlTextReader:快速唯進唯讀訪問,驗證格式良好性,檢查 DTD 格式但不驗證內容
- XmlValidatingReader:支援 DTD/XDR/XSD 驗證(第 3 文詳細)
- XmlNodeReader:遍歷記憶體中 DOM 節點(第 3 文詳細)
所有類別共享基類屬性(圖一)與方法(圖二),但具體值依賴實際類別。
XmlTextReader 實戰
創建實例的多種來源
XmlTextReader reader = new XmlTextReader(file); // 檔案
XmlTextReader reader = new XmlTextReader(url); // URL
XmlTextReader reader = new XmlTextReader(stream); // 流
XmlTextReader reader = new XmlTextReader(textReader); // 文字閱讀器
預設建構子為 protected,公共建構子均需指定資料源。連接開啟後用 Read() 逐節點訪問。
輸出 XML 文檔節點結構範例
string GetXmlFileNodeLayout(string file)
{
XmlTextReader reader = new XmlTextReader(file);
StringWriter writer = new StringWriter();
string tabPrefix = "";
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
tabPrefix = new string('\t', reader.Depth);
writer.WriteLine("{0}<{1}>", tabPrefix, reader.Name);
}
else if (reader.NodeType == XmlNodeType.EndElement)
{
tabPrefix = new string('\t', reader.Depth);
writer.WriteLine("{0}{1}>", tabPrefix, reader.Name);
}
}
string buf = writer.ToString();
writer.Close();
reader.Close();
return buf;
}
輸入範例:
<mags>
<mag name="MSDN Magazine">MSDN Magazine</mag>
<mag name="MSDN Voices">MSDN Voices</mag>
</mags>
輸出結果(忽略屬性與內容,僅結構):
<mags>
<mag>
</mag>
<mag>
</mag>
</mags>
屬性節點訪問
Read() 不自動訪問屬性。需用 MoveToNextAttribute() 遍歷:
if (reader.HasAttributes)
while (reader.MoveToNextAttribute())
buf += reader.Name + "=\"" + reader.Value + "\",";
reader.MoveToElement(); // 返回所屬元素節點
MoveToElement 實際不移動游標(指針從未離開元素),而是切換內部成員訪問目標。
導航輔助方法
- MoveToContent():從頭部跳至第一個內容節點
- Skip():跳過 ProcessingInstruction、DocumentType、Comment、Whitespace、SignificantWhitespace 類型節點
- ReadInnerXml():讀取當前元素內部 XML
- 上一篇文章: .NET Framework 輕鬆處理 XML 數據(二):屬性值深度解析與 XML 片段處理技巧
- 下一篇文章: WPF 3D 列表項翻轉效果完整實現指南
Copyright ©
程式碼之家 All Rights Reserved