XmlDocument和XElement在讀取Xml時要將整個Xml文檔放到內(nèi)存中去操作,這樣做操作簡單,但是很費(fèi)內(nèi)存和IO(可能是磁盤IO或者網(wǎng)絡(luò)IO);而在有些場景下我們必須考慮盡可能節(jié)省內(nèi)存和IO的開銷,這時候就該XmlReader和XmlWriter出場了。
XmlReader讀取Xml需要通過Read()實例方法,不斷讀取Xml文檔中的聲明,節(jié)點開始,節(jié)點內(nèi)容,節(jié)點結(jié)束,以及空白等等,直到文檔結(jié)束,Read()方法返回false。
如下讀取Xml內(nèi)容實例代碼和注釋說明
using System.Collections.Generic; |
static void Main(string[] args) |
//聲明StringReader傳入Xml文本,作為XmlReader.Create的參數(shù) |
using (StringReader strRdr = new StringReader(@"<?xml version=""1.0"" encoding=""utf-8"" ?> |
<cat color=""white"">I'm a Cat</cat> |
//通過XmlReader.Create靜態(tài)方法創(chuàng)建XmlReader實例 |
using (XmlReader rdr = XmlReader.Create(strRdr)) |
//循環(huán)Read方法直到文檔結(jié)束 |
Console.WriteLine("rdr.NodeType = " + rdr.NodeType); |
if (rdr.NodeType == XmlNodeType.Element) { |
string elementName = rdr.Name; |
Console.WriteLine(elementName + " element start"); |
if (elementName == "root") { |
//讀取到cat元素 這時rdr.Read()讀取到的內(nèi)容為<cat color="white"> |
else if (elementName == "cat") |
string colorVal = rdr["color"]; |
Console.WriteLine("\tcat's color is " + colorVal); |
//讀取到節(jié)點內(nèi)文本內(nèi)容 |
Console.WriteLine("\t cat said:" + rdr.Value); |
else if (rdr.NodeType == XmlNodeType.EndElement) |
//在節(jié)點結(jié)束時也可以通過rdr.Name獲得節(jié)點名字 |
string elementName = rdr.Name; |
Console.WriteLine(elementName + " element end"); |
如果覺得代碼不明白,下面是一張讀取順序圖,標(biāo)明了讀取順序號和每次讀取的內(nèi)容,如下圖所示:

從圖中可以看到XmlReader在讀取這段Xml時: 第1次Read()讀取的是Xml文檔聲明部分 第2次Read()讀取的是聲明后的空白 第3次Read()讀取的是根節(jié)點root的開始標(biāo)簽 第4次Read()讀取的是根節(jié)點開始后的空白 第5次Read()讀取的是cat節(jié)點的開始部分,從左尖括號到右尖括號包括該節(jié)點的屬性 第6次讀取的是cat節(jié)點的內(nèi)容 第7次讀取的是cat節(jié)點的結(jié)束標(biāo)簽 第8次讀取的是cat節(jié)點結(jié)束標(biāo)簽后的空白 第9次讀取的是dog節(jié)點的開始部分,注意是從左尖括號開始到結(jié)束斜杠之前 第10次讀取的是dog標(biāo)簽的結(jié)束/> 第11次讀取的是dog標(biāo)簽結(jié)束后的空白 第12次讀取的是root的結(jié)束標(biāo)簽
感謝@Kingthy對文中消耗IO說法提出問題,XmlReader和XmlDocument消耗的IO是一樣的;不同的是XmlReader可以讀取一點,顯示一點,而XmlDocument必須完全讀入之后才可以開始處理。
//www.cnblogs.com/yukaizhao/archive/2011/07/20/xmlreader_read_xml.html
標(biāo)簽:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園