?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(file);
??// 迴圈取出節點的文字並放進到StringWriter物件實例中
??StringWriter writer = new StringWriter();
?le? reader.Read())
??{
??// 寫開端標記,假如節點類型為元素
??if (reader.NodeType == XmlNodeType.Element)
??{
??//根據元素所定義//根據元素所定義。處節點的深度,參加reader.Depth個tab符,然後把元素名寫進中。
??tabPrefix = new string('t', reader.Depth);
??writer.WriteLine('{0}', tabPrefix, reader.Name);
??}
?else
??{
??//寫結束標記,假如節點類型為元素
??if (reader.NodeType == XmlNodeType.EndElement)
??{
??tabPrefix = new string('t', reader. Depth);
??writer.WriteLine('{0}', tabPrefix, reader.Name);
??}
??}
??}
??// 輸出到螢幕
??}
??// 輸出到螢幕 c? );
??writer.Close();
??// 封閉流
??reader.Close();
??return buf;
??}
??return buf;
??}
??return buf;
??}