使用XmlReader读Xml
生活随笔
收集整理的這篇文章主要介紹了
使用XmlReader读Xml
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
XmlDocument和XElement在讀取Xml時(shí)要將整個(gè)Xml文檔放到內(nèi)存中去操作,這樣做操作簡單,但是很費(fèi)內(nèi)存和IO(可能是磁盤IO或者網(wǎng)絡(luò)IO);而在有些場景下我們必須考慮盡可能節(jié)省內(nèi)存和IO的開銷,這時(shí)候就該
XmlReader和XMLWriter出場了
XmlReader讀取Xml需要通過Read()實(shí)例方法,不斷讀取Xml文檔中的聲明,節(jié)點(diǎn)開始,節(jié)點(diǎn)內(nèi)容,節(jié)點(diǎn)結(jié)束,以及空白等等,直到文檔結(jié)束,Read()方法返回FALSE
如下讀取Xml內(nèi)容實(shí)例代碼和注釋說明
using System; using System.Collection.Generic; using System.Text; using System.Xml; using System.IO; namespace UseXmlReader {class Program{static void Main(string[] args){//聲明StringReader傳入Xml文本,作為XMLReader.Create的參數(shù)using(StringReader strRdr=new StringReader(@"<?xml version=""1.0"" encoding=""utf-8""?><root><cat color=""white"">I'm a Cat</cat><dog color=""yellow""/> </root>")){//通過XMLReader.Create靜態(tài)方法創(chuàng)建XMLReader實(shí)例using (XmlReader rdr=XmlReader.Create(strRdr)){//循環(huán)Read方法直到文檔結(jié)束 white(rdr.Read()){Console.WriteLine("rdr.NodeType="+rdr.NodeType);//如果是開始節(jié)點(diǎn)if(rdr.NodeType==XmlNodeType.Element){//通過rdr.Name得到節(jié)點(diǎn)名string elementName=rdr.Name;Console.WriteLine(elementName+"element start");if(elementName=="root"){}//讀取到cat元素 這時(shí)rdr.Read()讀取到的內(nèi)容為<cat color="white">else if(elementName="cat"){//可以通過中括號獲得屬性值string colorVal=rdr["color"];Console.WriteLine("\tcat's color is" +colorVal);//讀取到節(jié)點(diǎn)內(nèi)文本內(nèi)容if(rdr.Read()){//通過rdr.Value獲得文本內(nèi)容Console.WriteLine("\t cat said:" +rdr.Value); } } }else if(rdr.NodeType==XmlNodeType.EndElement){//在節(jié)點(diǎn)結(jié)束時(shí)也可以通過rdr.Name獲得節(jié)點(diǎn)名字string elementName=rdr.Name;Console.WriteLine(elementName +"element end"); } } } }Console.Read(); } } }如果覺得代碼不明白,下面是一張讀取順序圖,標(biāo)明了讀取順序號和每次讀取的內(nèi)容,如下圖所示:
從圖中可以看到XmlReader在讀取這段Xml時(shí): 第1次Read()讀取的是Xml文檔聲明部分 第2次Read()讀取的是聲明后的空白 第3次Read()讀取的是根節(jié)點(diǎn)root的開始標(biāo)簽 第4次Read()讀取的是根節(jié)點(diǎn)開始后的空白 第5次Read()讀取的是cat節(jié)點(diǎn)的開始部分,從左尖括號到右尖括號包括該節(jié)點(diǎn)的屬性 第6次讀取的是cat節(jié)點(diǎn)的內(nèi)容 第7次讀取的是cat節(jié)點(diǎn)的結(jié)束標(biāo)簽 第8次讀取的是cat節(jié)點(diǎn)結(jié)束標(biāo)簽后的空白 第9次讀取的是dog節(jié)點(diǎn)的開始部分,注意是從左尖括號開始到結(jié)束斜杠之前 第10次讀取的是dog標(biāo)簽的結(jié)束/> 第11次讀取的是dog標(biāo)簽結(jié)束后的空白 第12次讀取的是root的結(jié)束標(biāo)簽感謝@Kingthy對文中消耗IO說法提出問題,XmlReader和XmlDocument消耗的IO是一樣的;不同的是XmlReader可以讀取一點(diǎn),顯示一點(diǎn),而XmlDocument必須完全讀入之后才可以開始處理。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zzp0320/p/8287297.html
總結(jié)
以上是生活随笔為你收集整理的使用XmlReader读Xml的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: labview事件结构
- 下一篇: BZOJ2631: tree