国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用XMLTextReader類加速.NET中XML存取

2019-11-17 04:42:08
字體:
供稿:網(wǎng)友

  在.NET框架的System.xml名稱空間中包含的XMLTextReader類不需要對系統(tǒng)資源要求很高,就能從XML文件中快速讀取數(shù)據(jù)。使用XMLTextReader類能夠從XML文件中讀取數(shù)據(jù),并且將其轉(zhuǎn)換為Html格式在瀏覽器中輸出。

  讀本文之前,讀者需要了解一些基本知識:XML、HTML、C#編程語言,以及.NET尤其是asp.net框架的一些知識。

  微軟公司的.NET框架為開發(fā)者提供了許多開發(fā)的便利,隨著XML的重要性不斷增長,開發(fā)者們都期待著有一整套功能強大的XML工具被開發(fā)出來。.NET框架沒有辜負(fù)我們的這番期望,在System.XML 名稱空間中組織進(jìn)了以下幾個用于XML的類:

  XMLTextReader------提供以快速、單向、無緩沖的方式存取XML數(shù)據(jù)。(單向意味著你只能從前往后讀取XML文件,而不能逆向讀取)

  XMLValidatingReader------與XMLTextReader類一起使用,提供驗證DTD、XDR和XSD架構(gòu)的能力。

  XMLDocument------遵循W3C文檔對象模型規(guī)范的一級和二級標(biāo)準(zhǔn),實現(xiàn)XML數(shù)據(jù)隨機的、有緩存的存取。一級水平包含了DOM的最基本的部分,而二級水平增加多種改進(jìn),包括增加了對名稱空間和級連狀圖表(CSS)的支持。

  XMLTextWriter------生成遵循 W3C XML 1.0 規(guī)范的XML文件。

  本文主要講述的是第一個類XMLTextReader,這個類設(shè)計的目的就是從XML文件中快速的讀取數(shù)據(jù),而對系統(tǒng)資源(主要包括內(nèi)存和處理器時間)不做很高的要求。在父級程序的控制下,它通過每次只處理一個節(jié)點的方式對XML文件進(jìn)行逐步操作,實現(xiàn)這種工作過程。在XML文件的每個節(jié)點中,父級程序能決定該節(jié)點的類型,它的屬性和數(shù)據(jù)(假如有的話),以及其他有關(guān)該節(jié)點的信息。基于這些信息,父級程序可以選擇是處理這個節(jié)點還是忽略該節(jié)點的信息,以滿足各種應(yīng)用程序請求的需要。這被稱為抽取式(pull)處理模型,因為父級程序發(fā)出請求并且從XML文件中抽取各個節(jié)點,然后根據(jù)需要處理它或者是不處理它。
  我們可以把XMLTextReader類和XML簡單應(yīng)用程序接口,即SAX相比,后者是在編程人員中非常流行的另一種讀取XML數(shù)據(jù)的技術(shù)。XMLTextReader 和SAX有一點很相似,它們都不需要占用很多的系統(tǒng)資源,就能迅速的從XML文件讀取數(shù)據(jù)。
但是,與XMLTextReader的抽取式模型迥然不同,SAX使用的是推入式模型:XML處理器通過 “事件”告知主機應(yīng)用程序哪些節(jié)點數(shù)據(jù)是可以獲得,那些不能獲得;根據(jù)需要,主機程序則作出相應(yīng)的反應(yīng)或置之不理。換句話說,數(shù)據(jù)的傳送方向是從SAX處理程序中推入到主機。程序員們勢必會在抽取式和推入式處理模型誰更有優(yōu)勢的問題上爭論一番,但是大家都不可否認(rèn)的是,兩種模型都能很好的進(jìn)行工作。.NET 框架不支持SAX,但是你能使用現(xiàn)存的SAX工具, 例如 MSXML分析器,用于你的.NET 程序。

  XMLTextReader 類有一些構(gòu)造程序來適應(yīng)各種各樣的情況,比如從一個已經(jīng)存在的數(shù)據(jù)流或統(tǒng)一資源定位網(wǎng)址讀取數(shù)據(jù)。最常見的是,你或許想從一個文件讀取XML數(shù)據(jù),那么也就有一個相應(yīng)的構(gòu)造程序來為此服務(wù)。這里有一個例子(我的所有代碼例子都使用的是C#語言,假如你喜歡使用VISUAL BASIC語言,它們轉(zhuǎn)換起來很輕易)。

XMLTextReader myReader;
myReader = New XMLTextReader("c:/data/sales.XML")
  創(chuàng)建一個稱為Read()方法的循環(huán),這個方法的返回值總是為真,直到到達(dá)文件的底部時,返回值才變?yōu)榧佟Q句話說, 循環(huán)在文件的開始時啟動并且讀入所有的節(jié)點, 一次讀入一個節(jié)點, 直到到達(dá)文件的結(jié)尾:

While (myReader.Read()) {
...
// 在這里處理每個節(jié)點.
...
}
  每次成功調(diào)用Read()之后,XMLTextReader實例化程序包含了目前節(jié)點(即剛剛從文件中讀取的那個節(jié)點)的信息。我們可以從XMLTextReader的成員中獲得上述信息,就像表格1中描述的一樣;并通過NodeType屬性判定出當(dāng)前節(jié)點的類型。在節(jié)點類型的基礎(chǔ)上,程序的代碼可以讀取節(jié)點數(shù)據(jù),檢查它是否有屬性,到底是忽略它還是根據(jù)程序需要進(jìn)行相應(yīng)的操作和處理。

  當(dāng)使用NodeType屬性時,理解節(jié)點怎么聯(lián)系到XML單元是非常重要的。例如, 看下列 XML元素:

<city>Chongqing</city>
  XMLtextReader 把這個元素看作 3 個節(jié)點,順序如下:

  1.<city>標(biāo)簽被讀為類型 XMLNodeType.Element 節(jié)點,元素的名字“city”可從 XMLTextReader 的Name屬性中獲得。

  2.文本數(shù)據(jù)“Chongqing”被讀為類型為XMLNodeType.Text的節(jié)點。數(shù)據(jù)“Chongqing ” 可從XMLTextReader 的Value屬性中取得。

  3.</city>標(biāo)簽被讀為類型為XMLNodeType.EndElement 節(jié)點。同樣,元素的名稱“city”可從XMLTextReader的Name屬性中獲得。

  這是 3 種重要的節(jié)點類型,其它的類型在.NET的說明文檔中有具體說明,請大家參閱相關(guān)資料。

  假如XMLTextReader碰到一個錯誤, 例如出現(xiàn)違反XML句法的情況,它拋出一個System.XML.XMLException類型的異常。使用這個類的代碼應(yīng)該總是被保護(hù) ( 在Try……Catch塊中),就像你以后在演示程序中看到的一樣。
  本文只是一篇相當(dāng)簡單的介紹XMLTextReader 類的文章,XMLTextReader類有相當(dāng)多的成員,在這里不可能一一述及。當(dāng)讀入XML數(shù)據(jù)時,XMLTextReader能提供相當(dāng)強的靈活性。
即便如此,我仍然進(jìn)行了大量的論述,以保證讀者能編制程序來實現(xiàn)現(xiàn)實世界中經(jīng)常要求完成的任務(wù),也就是從一個XML文件讀取數(shù)據(jù)然后以HTML的格式輸出,從而實現(xiàn)在瀏覽器中的顯示。

  這個ASP.NET程序(腳本)在服務(wù)器上運行并產(chǎn)生一個HTML頁面返回瀏覽器。這段腳本程序在代碼段 1 給出,它用來工作使用的 XML 數(shù)據(jù)文件在代碼段 2給出。你能看到這個 XML 文件包含一份表示聯(lián)系關(guān)系的列表;程序的目標(biāo)即是將這個列表顯示出來,為了更輕易我們觀察,這些列表已經(jīng)被格式化了。

  運行程序:

  1. 將代碼段1存為XMLTextReader.ASPx文件,將代碼段2存為XMLData.XML文件。

  2. 把這兩個文件都放在一個已經(jīng)安裝好.NET 框架的網(wǎng)絡(luò)服務(wù)器的虛擬文件夾中。

  3. 打開 Internet EXPlorer 并且瀏覽這個ASPx文件,例如,在一個局域網(wǎng)服務(wù)器上, URL 將是 http://localhost/xmltextreader.ASPx 。

  程序工作的大部分都由XMLDisplay 類來做,尤其是被PRocessXML()方法完成的。它每次讀取一個節(jié)點XML數(shù)據(jù),對于感愛好的元素,節(jié)點數(shù)據(jù)和后跟冒號的節(jié)點名將和相應(yīng)的HTML格式化標(biāo)簽一起寫入輸出結(jié)果中。在這階段,“輸出結(jié)果”由一個HTML文本暫時儲存在其中的StringBuilder對象構(gòu)成。

  ProcessXML()方法是從LoadDocument()方法調(diào)用的。這個方法執(zhí)行的任務(wù)是產(chǎn)生一個XMLTextReader實例化程序并在調(diào)用ProcessXML之前裝載XML文件。它同時也處理異常,隨后產(chǎn)生錯誤的信息并在瀏覽器中顯示出來。最終該方法返回一個字符串,這個字符串或者包含產(chǎn)生的HTML內(nèi)容,或者假如異常發(fā)生的話就包含出錯信息,。

  程序執(zhí)行以Page_Load()程序開始,當(dāng)瀏覽器請求瀏覽這個頁面時,這一步會自動執(zhí)行。這里的代碼實例化了XMLDisplay 類并調(diào)用它的LoadDocument()方法。假如一切運行正常的話,格式化的HTML形式的返回值將被拷貝到頁面的一個<div>標(biāo)簽中,生成的HTML文檔被送回到瀏覽器中并顯示出來。

  其他的.NET 框架的類,比如XMLDocument類在讀取XML數(shù)據(jù)方面表現(xiàn)如何呢?XMLDocument 類與XMLTextReader 類不同,它在存儲器中創(chuàng)建整個XML文檔的節(jié)點樹。這樣就可以隨機的獲得XML數(shù)據(jù)(與XMLTextReader 類獲得數(shù)據(jù)的線性方式正好相反),并且在修改XML文件的數(shù)據(jù)和結(jié)構(gòu)時,具有非常完美的靈活性。另外,XMLDocument答應(yīng)執(zhí)行XSLT 轉(zhuǎn)變,不過,這些額外的功能是以運行速度的降低和系統(tǒng)資源的更多占用為代價的。

  代碼段1:XmlTextReader.aspx

<%@ Import Namespace="System.Xml" %>

<script language="C#" runat=server>

public class XmlDisplay
file://這個類讀入并處理XML文件。
{

public string LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
try {
file://創(chuàng)建XMLTextReader的實例。
xmlReader = new XmlTextReader(XmlFileName);
// 處理XML文件
html.Append(ProcessXml(xmlReader));
}
catch (XmlException ex){
html.Append("發(fā)生一個XML異常:" +
ex.ToString());
}
catch (Exception ex){
html.Append("發(fā)生一個普通異常:" +
ex.ToString());
}
finally
{
if (xmlReader != null)
xmlReader.Close();
}
return html.ToString();
}

private string ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder();

file://這個方法讀入XML文件并生成輸出的HTML文檔。
while ( xmlReader.Read() )
{
// 處理一個元素節(jié)點的起始。
if (xmlReader.NodeType == XmlNodeType.Element)
{
file://忽略<people>和<person>元素
if ((xmlReader.Name != "person") && (xmlReader.Name != "people"))
{
file://假如是一個<category>元素,開始一個新的段落
if ( xmlReader.Name == "category" )
temp.Append("<p>
");
file://添加元素名到輸出中
temp.Append( xmlReader.Name + ": " );
}
}
// 處理文本節(jié)點
else if (xmlReader.NodeType == XmlNodeType.Text)
temp.Append(xmlReader.Value + "
");
file://處理元素節(jié)點的結(jié)尾
else if (xmlReader.NodeType == XmlNodeType.EndElement)
{
file://假如是<email>節(jié)點,添加結(jié)束段落的標(biāo)記
if ( xmlReader.Name == "email" )
temp.Append("</p>");
}
}//結(jié)束while循環(huán)

return temp.ToString();

} file://結(jié)束ProcessXML方法

} file://結(jié)束XmlDisplay類

private void Page_Load(Object sender, EventArgs e){
file://創(chuàng)建XmlDisplay類的實例
XmlDisplay XmlDisplayDemo = new XmlDisplay();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</script>
<html>
<head>
</head>
<body>
<h2>演示XmlTextReader類</h2>
<div id="output" runat="server"/>
</body>
</html>


  代碼段2:XMLData.xml

<?xml version="1.0" encoding="gb2312"?>
<people>
<person>
<category>朋友</category>
<name>方舟</name>
<phone>111-222-333</phone>
<email>tjfangzhou@yesky.com</email>
</person>
<person>
<category>家人</category>
<name>媽媽</name>
<phone>555-666-7777</phone>
<email>mother@family.com</email>
</person>
<person>
<category>家人</category>
<name>爸爸</name>
<phone>123-456-7890</phone>
<email>father@family.com</email>
</person>
<person>
<category>朋友</category>
<name>靜靜</name>
<phone>999-999-9999</phone>
<email>jingjing@girlfriend.com</email>
</person>

</people>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 神池县| 册亨县| 墨玉县| 澜沧| 于田县| 宣化县| 六枝特区| 安徽省| 叶城县| 白水县| 城步| 林甸县| 砀山县| 平原县| 琼中| 雷州市| 中卫市| 佛坪县| 霍林郭勒市| 呈贡县| 澎湖县| 邵阳县| 阜新| 读书| 新密市| 灵川县| 淮北市| 扶沟县| 内黄县| 建水县| 南召县| 汝城县| 建阳市| 绥宁县| 台中县| 乐昌市| 公安县| 丹阳市| 胶州市| 湖南省| 辽阳市|