亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

XMLTextReader和XmlDocument讀取XML文件的比較

2019-11-18 16:54:40
字體:
來源:轉載
供稿:網友

看到網上一片文章,自己式了一下,果然 xmlTextReader速度要快!

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

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

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

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

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

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

  XMLTextWriter------生成遵循 W3C XML 1.0 規范的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/sales.XML")

  創建一個稱為Read()方法的循環,這個方法的返回值總是為真,直到到達文件的底部時,返回值才變為假。換句話說, 循環在文件的開始時啟動并且讀入所有的節點, 一次讀入一個節點, 直到到達文件的結尾:

While (myReader.Read()) {
...
// 在這里處理每個節點.
...
}

  每次成功調用Read()之后,XMLTextReader實例化程序包含了目前節點(即剛剛從文件中讀取的那個節點)的信息。我們可以從XMLTextReader的成員中獲得上述信息,就像表格1中描述的一樣;并通過NodeType屬性判斷出當前節點的類型。在節點類型的基礎上,程序的代碼可以讀取節點數據,檢查它是否有屬性,到底是忽略它還是根據程序需要進行相應的操作和處理。

  當使用NodeType屬性時,理解節點怎么聯系到XML單元是非常重要的。例如, 看下列 XML元素:

<city>Chongqing</city>

  XMLtextReader 把這個元素看作 3 個節點,順序如下:

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

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

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

  這是 3 種重要的節點類型,其它的類型在.NET的說明文檔中有詳細說明,請大家參閱相關資料。

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

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

  運行程序:

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

  2. 把這兩個文件都放在一個已經安裝好.NET 框架的網絡服務器的虛擬文件夾中。

  3. 打開 Internet Explorer 并且瀏覽這個ASPx文件,例如,在一個局域網服務器上, URL 將是 http://localhost/xmltextreader.ASPx ;。

  程序工作的大部分都由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 轉變,不過,這些額外的功能是以運行速度的降低和系統資源的更多占用為代價的。
  代碼段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://創建XMLTextReader的實例。
xmlReader = new XmlTextReader(XmlFileName);
// 處理XML文件
html.Append(ProcessXml(xmlReader));
}
catch (XmlException ex){
html.Append("發生一個XML異常:" +
ex.ToString());
}
catch (Exception ex){
html.Append("發生一個普通異常:" +
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() )
{
// 處理一個元素節點的起始。
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 + ": " );
}
}
// 處理文本節點
else if (xmlReader.NodeType == XmlNodeType.Text)
temp.Append(xmlReader.Value + "<br>");
file://處理元素節點的結尾
else if (xmlReader.NodeType == XmlNodeType.EndElement)
{
file://如果是<email>節點,添加結束段落的標記
if ( xmlReader.Name == "email" )
temp.Append("</p>");
}
}//結束while循環

return temp.ToString();

} file://結束ProcessXML方法

} file://結束XmlDisplay類

private void Page_Load(Object sender, EventArgs e){
file://創建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>

 

 

 

 1    static void Main(string[] args)
 2        {
 3            DateTime d1 =DateTime.Now;
 4            XmlDocumentTest();
 5            DateTime d2 =DateTime.Now;
 6            TimeSpan ts =d2-d1 ;
 7           
 8            Console.WriteLine(ts.TotalMilliseconds) ;   
 9            Console.Read() ;
10
11        }
12
13
14        public static string XmlFileName = "../../XML/1.xml";
15       
16        private static void XmlTextReaderTest()
17        {
18            XmlTextReader reader = new XmlTextReader(XmlFileName);
19            while (reader.Read() )
20            {
21                bool exit =false;
22                switch(reader.NodeType)
23                {
24                    case XmlNodeType.Element :
25                        break;
26                    case XmlNodeType.Text :
27                        if (reader.Value=="last")
28                        {
29                            exit=true;
30                        }
31                        break;
32                    case XmlNodeType.EndElement  :
33                        break;
34                    default:
35                        break;
36                }
37                if(exit)
38                {
39                    return;
40                   
41                }
42
43            }
44        }
45
46        private static void XmlDocumentTest()
47        {
48            XmlDocument xd =new XmlDocument() ;
49            xd.Load(XmlFileName) ;
50            XmlNode node = xd.SelectSingleNode("/people/person[category='last']");
51            Console.Write(node.Name) ;
52        }
 

結果發現第一個耗時:
結果發現第二個耗時:

http://www.49028c.com/goody9807/archive/2006/10/24/534888.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美女啪啪无遮挡免费久久网站| 国产精品电影久久久久电影网| 一本一本久久a久久精品牛牛影视| 欧美精品在线看| 国内精品久久久久影院优| 亚洲第一男人天堂| 茄子视频成人在线| 欧美黑人一级爽快片淫片高清| 国产成人免费av电影| 亚洲精品国产精品自产a区红杏吧| 色综合五月天导航| 欧美黑人性生活视频| 精品日韩视频在线观看| 久久久91精品| 欧美自拍大量在线观看| 日韩高清免费在线| 日韩成人在线视频网站| 日韩一级裸体免费视频| 日韩在线免费av| 成人乱人伦精品视频在线观看| 26uuu另类亚洲欧美日本老年| 米奇精品一区二区三区在线观看| 亚洲精品不卡在线| 日本午夜人人精品| 97av在线播放| 成人欧美一区二区三区黑人| 色偷偷噜噜噜亚洲男人的天堂| 成人国内精品久久久久一区| www.xxxx欧美| 亚洲香蕉成人av网站在线观看| 欧美精品激情blacked18| 久久久日本电影| 隔壁老王国产在线精品| 国产亚洲a∨片在线观看| 亚洲国产欧美一区二区三区久久| 欧美小视频在线观看| 亚洲精品视频在线观看视频| 国产精品丝袜一区二区三区| 日本精品久久中文字幕佐佐木| 久久视频这里只有精品| 久久精品色欧美aⅴ一区二区| 欧美国产精品日韩| 亚洲欧洲在线看| 91在线精品播放| 91精品国产色综合久久不卡98| 狠狠爱在线视频一区| 亚洲欧美国产一本综合首页| 欧美亚洲另类制服自拍| 亚洲黄色成人网| 日韩在线小视频| 久久久久五月天| 欧洲永久精品大片ww免费漫画| 亚洲精品一区二区网址| 国产精品久久久久久久久久久新郎| 精品亚洲国产成av人片传媒| 亚洲国产成人在线播放| 久久久国产一区| 亚洲人成自拍网站| 97精品伊人久久久大香线蕉| 亚洲网站在线播放| 久久亚洲综合国产精品99麻豆精品福利| 97国产在线视频| 国产精品久久久久99| 国产精品福利网站| 国产精品第七影院| 久久精品国产一区| 久久免费精品日本久久中文字幕| 日韩美女免费线视频| 热99在线视频| 日韩成人久久久| 国语自产偷拍精品视频偷| 国产午夜精品麻豆| 中文字幕在线看视频国产欧美在线看完整| 欧美午夜精品久久久久久浪潮| 亚洲第一区中文字幕| 91性高湖久久久久久久久_久久99| 操人视频在线观看欧美| 日本道色综合久久影院| 亚洲欧洲国产精品| 91精品国产91久久久久福利| 最近2019中文免费高清视频观看www99| 亚洲精品国产精品久久清纯直播| 亚洲成人a**站| 欧美午夜视频一区二区| 日韩精品在线观| 久久人91精品久久久久久不卡| 7777kkkk成人观看| 国产成人中文字幕| 欧美综合在线观看| 国产拍精品一二三| 国产成人精品视频在线观看| 97视频在线观看播放| 国产欧美韩国高清| 国产亚洲一区二区精品| 91系列在线播放| 久久五月天色综合| 精品成人久久av| 国产一级揄自揄精品视频| 国产精品无码专区在线观看| 91久久国产精品| 色悠悠国产精品| 日韩精品在线第一页| 国外视频精品毛片| 欧美巨乳美女视频| 欧美综合在线第二页| 中文字幕欧美在线| 国产精品免费网站| 久久精品亚洲热| 亚洲人午夜色婷婷| 岛国av午夜精品| 欧美性videos高清精品| 亚洲欧洲xxxx| 久久激情视频久久| 日韩av片永久免费网站| 亚洲国产欧美在线成人app| 欧美丰满老妇厨房牲生活| 精品自在线视频| 日韩中文字幕在线| 亚洲色图狂野欧美| 成人黄色午夜影院| 欧美做爰性生交视频| 国产日韩欧美综合| 性夜试看影院91社区| 日韩精品极品毛片系列视频| 亚洲aⅴ男人的天堂在线观看| 亚洲国产欧美一区二区三区同亚洲| 欧美精品少妇videofree| 久久99热精品这里久久精品| 亚洲精品在线观看www| 久久久久久网站| 在线观看日韩www视频免费| 91高清在线免费观看| 日韩国产欧美精品一区二区三区| 国内精品视频在线| 91九色综合久久| 成人美女av在线直播| 尤物yw午夜国产精品视频明星| 午夜精品福利电影| 97精品国产97久久久久久| 久久99精品久久久久久青青91| 久久久久久久久久亚洲| 欧美激情精品久久久久久| 久久久中精品2020中文| 国模叶桐国产精品一区| 91免费看片网站| 最近2019中文字幕在线高清| 国产高清视频一区三区| 国产91网红主播在线观看| 狠狠躁夜夜躁久久躁别揉| 亚洲性生活视频在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品中文字幕有码专区| 川上优av一区二区线观看| 欧美精品第一页在线播放| 亚洲福利精品在线| 国产精品专区第二| 久久精品国产久精国产思思| 久久这里只有精品99| 国内久久久精品| 精品亚洲国产成av人片传媒| 欧美日韩美女视频| 亚洲人成在线观看| 国产欧美日韩最新|