在NET框架的SystemXML名稱空間中包含的XMLTextReader類不需要對系統資源要求很高就能從XML文件中快速讀取數據使用XMLTextReader類能夠從XML文件中讀取數據並且將其轉換為HTML格式在浏覽器中輸出
讀本文之前讀者需要了解一些基本知識XMLHTMLC#編程語言以及NET尤其是ASPNET框架的一些知識
微軟公司的NET框架為開發者提供了許多開發的便利隨著XML的重要性不斷增長開發者們都期待著有一整套功能強大的XML工具被開發出來NET框架沒有辜負我們的這番期望在SystemXML 名稱空間中組織進了以下幾個用於XML的類
XMLTextReader提供以快速單向無緩沖的方式存取XML數據(單向意味著你只能從前往後讀取XML文件而不能逆向讀取)
XMLValidatingReader與XMLTextReader類一起使用提供驗證DTDXDR和XSD架構的能力
XMLDocument遵循WC文檔對象模型規范的一級和二級標准實現XML數據隨機的有緩存的存取一級水平包含了DOM的最基本的部分而二級水平增加多種改進包括增加了對名稱空間和級連狀圖表(css)的支持
XMLTextWriter生成遵循 WC XML 規范的XML文件
本文主要講述的是第一個類XMLTextReader這個類設計的目的就是從XML文件中快速的讀取數據而對系統資源(主要包括內存和處理器時間)不做很高的要求在父級程序的控制下它通過每次只處理一個節點的方式對XML文件進行逐步操作實現這種工作過程在XML文件的每個節點中父級程序能決定該節點的類型它的屬性和數據(如果有的話)以及其他有關該節點的信息基於這些信息父級程序可以選擇是處理這個節點還是忽略該節點的信息以滿足各種應用程序請求的需要這被稱為抽取式(pull)處理模型因為父級程序發出請求並且從XML文件中抽取各個節點然後根據需要處理它或者是不處理它
我們可以把XMLTextReader類和XML簡單應用程序接口即SAX相比後者是在編程人員中非常流行的另一種讀取XML數據的技術XMLTextReader 和SAX有一點很相似它們都不需要占用很多的系統資源就能迅速的從XML文件讀取數據但是與XMLTextReader的抽取式模型迥然不同SAX使用的是推入式模型XML處理器通過 事件告知主機應用程序哪些節點數據是可以獲得那些不能獲得根據需要主機程序則作出相應的反應或置之不理換句話說數據的傳送方向是從SAX處理程序中推入到主機程序員們勢必會在抽取式和推入式處理模型誰更有優勢的問題上爭論一番但是大家都不可否認的是兩種模型都能很好的進行工作NET 框架不支持SAX但是你能使用現存的SAX工具 例如 MSXML分析器用於你的NET 程序
XMLTextReader 類有一些構造程序來適應各種各樣的情況比如從一個已經存在的數據流或統一資源定位網址讀取數據最常見的是你或許想從一個文件讀取XML數據那麼也就有一個相應的構造程序來為此服務這裡有一個例子(我的所有代碼例子都使用的是C#語言如果你喜歡使用VISUAL BASIC語言它們轉換起來很容易)
XMLTextReader myReader;
myReader = New XMLTextReader(c:\data\salesXML)
創建一個稱為Read()方法的循環這個方法的返回值總是為真
直到到達文件的底部時返回值才變為假換句話說 循環在文件的開始時啟動並且讀入所有的節點 一次讀入一個節點 直到到達文件的結尾
While (myReaderRead()) {
// 在這裡處理每個節點
}
每次成功調用Read()之後XMLTextReader實例化程序包含了目前節點(即剛剛從文件中讀取的那個節點)的信息我們可以從XMLTextReader的成員中獲得上述信息就像表格中描述的一樣並通過NodeType屬性判斷出當前節點的類型在節點類型的基礎上程序的代碼可以讀取節點數據檢查它是否有屬性到底是忽略它還是根據程序需要進行相應的操作和處理
當使用NodeType屬性時理解節點怎麼聯系到XML單元是非常重要的例如 看下列 XML元素
<city>Chongqing</city>
XMLtextReader 把這個元素看作 個節點順序如下
.<city>標簽被讀為類型 XMLNodeTypeElement 節點元素的名字city可從 XMLTextReader 的Name屬性中獲得
.文本數據Chongqing被讀為類型為XMLNodeTypeText的節點數據Chongqing 可從XMLTextReader 的Value屬性中取得
.</city>標簽被讀為類型為XMLNodeTypeEndElement 節點同樣元素的名稱city可從XMLTextReader的Name屬性中獲得
這是 種重要的節點類型其它的類型在NET的說明文檔中有詳細說明請大家參閱相關資料
如果XMLTextReader遇到一個錯誤 例如出現違反XML句法的情況它拋出一個SystemXMLXMLException類型的異常使用這個類的代碼應該總是被保護 ( 在Try……Catch塊中)就像你以後在演示程序中看到的一樣
本文只是一篇相當簡單的介紹XMLTextReader 類的文章XMLTextReader類有相當多的成員在這裡不可能一一述及當讀入XML數據時XMLTextReader能提供相當強的靈活性即便如此我仍然進行了大量的論述以保證讀者能編制程序來實現現實世界中經常要求完成的任務也就是從一個XML文件讀取數據然後以HTML的格式輸出從而實現在浏覽器中的顯示
這個ASPNET程序(腳本)在服務器上運行並產生一個HTML頁面返回浏覽器這段腳本程序在代碼段 給出它用來工作使用的 XML 數據文件在代碼段 給出你能看到這個 XML 文件包含一份表示聯系關系的列表程序的目標即是將這個列表顯示出來為了更容易我們觀察這些列表已經被格式化了
運行程序
. 將代碼段存為XMLTextReaderASPx文件將代碼段存為XMLDataXML文件
. 把這兩個文件都放在一個已經安裝好NET 框架的網絡服務器的虛擬文件夾中
. 打開 Internet Explorer 並且浏覽這個ASPx文件例如在一個局域網服務器上 URL 將是 localhost/xmltextreaderASPx
程序工作的大部分都由XMLDisplay 類來做尤其是被ProcessXML()方法完成的它每次讀取一個節點XML數據對於感興趣的元素節點數據和後跟冒號的節點名將和相應的HTML格式化標簽一起寫入輸出結果中在這階段輸出結果由一個HTML文本暫時儲存在其中的StringBuilder對象構成
ProcessXML()方法是從LoadDocument()方法調用的這個方法執行的任務是產生一個XMLTextReader實例化程序並在調用ProcessXML之前裝載XML文件它同時也處理異常隨後產生錯誤的信息並在浏覽器中顯示出來最終該方法返回一個字符串這個字符串或者包含產生的HTML內容或者如果異常發生的話就包含出錯信息
程序執行以Page_Load()程序開始當浏覽器請求浏覽這個頁面時這一步會自動執行這裡的代碼實例化了XMLDisplay 類並調用它的LoadDocument()方法如果一切運行正常的話格式化的HTML形式的返回值將被拷貝到頁面的一個<div>標簽中生成的HTML文檔被送回到浏覽器中並顯示出來
其他的NET 框架的類比如XMLDocument類在讀取XML數據方面表現如何呢XMLDocument 類與XMLTextReader 類不同它在存儲器中創建整個XML文檔的節點樹這樣就可以隨機的獲得XML數據(與XMLTextReader 類獲得數據的線性方式正好相反)並且在修改XML文件的數據和結構時具有非常完美的靈活性另外XMLDocument允許執行XSLT 轉變不過這些額外的功能是以運行速度的降低和系統資源的更多占用為代價的
代碼段XmlTextReaderaspx
<%@ Import Namespace=SystemXml %>
<script language=C# runat=server>
public class XmlDisplay
file://這個類讀入並處理XML文件
{
public string LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
try {
file://創建XMLTextReader的實例
xmlReader = new XmlTextReader(XmlFileName);
// 處理XML文件
htmlAppend(ProcessXml(xmlReader));
}
catch (XmlException ex){
htmlAppend(發生一個XML異常 +
exToString());
}
catch (Exception ex){
htmlAppend(發生一個普通異常 +
exToString());
}
finally
{
if (xmlReader != null)
xmlReaderClose();
}
return htmlToString();
}
private string ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder();
file://這個方法讀入XML文件並生成輸出的HTML文檔
while ( xmlReaderRead() )
{
// 處理一個元素節點的起始
if (xmlReaderNodeType == XmlNodeTypeElement)
{
file://忽略<people>和<person>元素
if ((xmlReaderName != person) && (xmlReaderName != people))
{
file://如果是一個<category>元素開始一個新的段落
From:http://tw.wingwit.com/Article/program/net/201311/11558.html