在.NET Framework中輕鬆處理XML資料(1-2)

來源:互聯網
上載者:User
?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方法移動指標。

以上就是在.NET Framework中輕鬆處理XML資料(1-2) 的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.