DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 在.NET Framework中輕松處理XML數據(1-2)
在.NET Framework中輕松處理XML數據(1-2)
編輯:XML詳解     
NEWS_AD_BEGIN-->XMLReader類

XML閱讀器支持一個編程接口,接口用於連接XML文檔,“推出”你要的數據。如果你更深入去了解閱讀器,你會發現閱讀器工作原理類似於我們的桌面應用程序從數據庫中取出數據的原理。數據庫服務返回一個游標對象,它包含所有查詢結果集,並返回指向目標數據集的開始地址的引用。XML閱讀器的客戶端收到一個指向閱讀器實例的引用。該實例提取底層的數據流並把取出的數據呈現為一棵XML樹。閱讀器類提供只讀、向前的游標,你可以用閱讀器類提供的方法滾動游標遍歷結果集中的每一條數據。

從閱讀器中看XML文檔不是一個標簽文本文件,而是一個序列化的節點集合。它是.NET Framework中的一種特殊的游標模式;在.Net Framework中,你找不到其它的任何一個類似的API函數。

閱讀器和XMLDOM分析器有幾點不同的地方。XML閱讀器是只進的,它沒有父、子、祖宗、兄弟節點的概念,而且是只讀的。在.Net Framework中,讀寫XML文檔是分為兩種完全不同的功能,分別由XMLReader和XMLWriter類來完成。要編輯XML文檔,你可以用XMLDOM分析器,或者你自己設計一個類來實現這兩種功能。讓我們開始分析閱讀器的程序功能。

XMLReader是一個抽象類,你可以繼承並擴展它的功能。用戶程序一般都基於下面的三種類:XMLTextReader、XMLValidatingReader或者 XMLNodeReader類。所有的這些類都有如圖一的屬性和圖二的方法。要注意的是,某些屬性的值實際上依賴於實際的某個閱讀器類,不同的類與基類可能不同。因此,在圖一中每個屬性的說明都是以基類為准的。例如,CanResolveEntity屬性在XMLValidatingReader類中只返回true;而在其它的閱讀器類中它卻可以設為false。同樣的,在圖二中的某些方法的實際返回值對不同的類可能不同。例如,如果節點類型不是元素節點(element node),所有包含Atrributes的方法的返回值類型都是void。

XMLTextReader類用只進,只讀的方式快速訪問XML數據流。閱讀器先驗證XML文檔是否是格式良好的,如果不是則拋出一個異常。XMLTextReader 檢查 DTD 的格式是否良好,但不使用 DTD 對文檔進行驗證。XMLTextReader通過XML文檔的文件名,或它的URL,或者從文件流中載入XML文檔,然後快速的處理XML文檔數據。如果你需要對文檔的數據進行驗證,你可以用XMLValidatingReader類。

可以用多種方法創建XMLTextReader類的實例,從硬盤中加載文件,或從URL地址中加載,流(streams)中加載,還有就是從文本中讀入XML文檔數據:

XMLTextReader reader = new XMLTextReader(file);

注意,所有XMLTextReader類的公共(public)構造函數都要求你指定數據源,數據源可以是stream、文件或者其它。XMLTextReader默認的構造函數是受保護的(protected),所以不能直接使用。像.Net Framework中所有的閱讀器類一樣(如SqlDataReader類),一旦閱讀器對象連接並打開,你就可以用Read方法去訪問數據了。開始的時候只能用Read方法把指針移到第一個元素;然後我們可以用Read方法或其它方法(如Skip, MoveToContent和ReadInnerXML)移動指針到下一個節點元素。要處理整個XML文檔的內容,可以根據Read方法的返回值用一個循環遍歷文檔內容,因為Read方法返回一個布爾值,當讀到文檔的尾節點時,Read方法返回false,否則它返回true。



Figure 3 Outputting an XML Document Node Layout

string GetXMLFileNodeLayout(string file)
{
// 創建一個XMLTextReader類使它指向目標XML文檔
XMLTextReader reader = new XMLTextReader(file);

// 循環取出節點的文本並放入到StringWriter對象實例中
StringWriter writer = new StringWriter();
string tabPrefix = "";

while (reader.Read())
{
// 寫開始標志,如果節點類型為元素
if (reader.NodeType == XMLNodeType.Element)
{
//根據元素所處節點的深度,加入reader.Depth個tab符,然後把元素名寫入到<>中。
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;
}


圖三演示了一個簡單的用於輸出一個給定的XML文檔的節點元素的函數。該函數先打開一個XML文檔,然後用循環處理XML文檔中所有的內容。每次調用Read方法,閱讀器的指針都會向下移一個節點。大部分情況下,用Read方法可以處理的元素節點,但有時候,當你從一個節點移動到下一個節點時,可能是在兩個不同類型的節點間移動。但是Read方法不能在屬性節點之間移動。閱讀器的MoveToContent方法可以讓指針從頭部節點位置跳到第一個內容節點位置。在ProcessingInstruction, DocumentType, Comment, Whitespace和SignificantWhitespace類型節點中也可以用Skip方法移動指針。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved