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

.NET Framework 輕鬆處理 XML 數據(一):XmlReader/XmlWriter 架構基石與核心 API 詳解

     編輯:關於.NET

從 MSXML 到 .NET XML

MSXML 為 COM 元件,深層嵌入作業系統,作為外部服務元件使用。.NET Framework XML 類別直接整合於命名空間,代碼更易讀、互操作性更強。雖 MSXML 支援非同步分析,但 .NET 透過與其他類別整合可輕鬆實現同等功能並擴展更多特性。

.NET XML 類別體系

  • 基本分析、查詢、轉換:XPath、XSLT、讀寫類別
  • 擴展功能:XmlSerializer/SoapFormatter(序列化)、AppSettingsReader(配置)、DataSet(資料存儲)
  • 本系列專注基本 XML I/O 操作類別

XML 分析模式對比

.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}", 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式代表特點
樹狀XMLDOM文檔載入記憶體樹結構,功能完整但大文檔佔用大量記憶體,不可擴展
事件驅動SAX流式處理,推模式,記憶體佔用極小,但必須處理所有資訊(含無用)
游標式XmlReader/XmlWriter.NET 核心模式,只進唯讀/只寫,拉模式,應用程式主動拉取所需數據,兼具 DOM 功能與 SAX 效能