標籤:
XmlDocument和XElement在讀取Xml時要將整個Xml文檔放到記憶體中去操作,這樣做操作簡單,但是很費記憶體和IO(可能是磁碟IO或者網路IO);而在有些情境下我們必須考慮儘可能節省記憶體和IO的開銷,這時候就該XmlReader和XmlWriter出場了。
XmlReader讀取Xml需要通過Read()執行個體方法,不斷讀取Xml文檔中的聲明,節點開始,節點內容,節點結束,以及空白等等,直到文檔結束,Read()方法返回false。
如下讀取Xml內容執行個體代碼和注釋說明
?
//玉開技術部落格:http://www.cnblogs.com/yukaizhao using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.IO; namespace UseXmlReader { class Program { static void Main( string [] args) { //聲明StringReader傳入Xml文本,作為XmlReader.Create的參數 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靜態方法建立XmlReader執行個體 using (XmlReader rdr = XmlReader.Create(strRdr)) { //迴圈Read方法直到文檔結束 while (rdr.Read()) { Console.WriteLine( "rdr.NodeType = " + rdr.NodeType); //如果是開始節點 if (rdr.NodeType == XmlNodeType.Element) { //通過rdr.Name得到節點名 string elementName = rdr.Name; Console.WriteLine(elementName + " element start" ); if (elementName == "root" ) { } //讀取到cat元素 這時rdr.Read()讀取到的內容為<cat color="white"> else if (elementName == "cat" ) { //可以通過中括弧獲得屬性值 string colorVal = rdr[ "color" ]; Console.WriteLine( "\tcat‘s color is " + colorVal); //讀取到節點內常值內容 if (rdr.Read()) { //通過rdr.Value獲得常值內容 Console.WriteLine( "\t cat said:" + rdr.Value); } } } else if (rdr.NodeType == XmlNodeType.EndElement) { //在節點結束時也可以通過rdr.Name獲得節點名字 string elementName = rdr.Name; Console.WriteLine(elementName + " element end" ); } } } } Console.Read(); } } } |
如果覺得代碼不明白,下面是一張讀取順序圖,標明了讀取順序號和每次讀取的內容,如所示:可以看到XmlReader在讀取這段Xml時:第1次Read()讀取的是Xml文檔聲明部分第2次Read()讀取的是聲明後的空白第3次Read()讀取的是根節點root的開始標籤第4次Read()讀取的是根節點開始後的空白第5次Read()讀取的是cat節點的開始部分,從左角括弧到右角括弧包括該節點的屬性第6次讀取的是cat節點的內容第7次讀取的是cat節點的結束標籤第8次讀取的是cat節點結束標籤後的空白第9次讀取的是dog節點的開始部分,注意是從左角括弧開始到結束斜杠之前第10次讀取的是dog標籤的結束/>第11次讀取的是dog標籤結束後的空白第12次讀取的是root的結束標籤
感謝@Kingthy對文中消耗IO說法提出問題,XmlReader和XmlDocument消耗的IO是一樣的;不同的是XmlReader可以讀取一點,顯示一點,而XmlDocument必須完全讀入之後才可以開始處理。
C#處理Xml的相關隨筆:
1.通過XmlDocument讀寫Xml文檔2.使用XmlReader讀Xml,使用XmlWriter寫Xml3.使用Linq to xml存取XML4.通過XmlScheme定義固定格式xml文檔5.Xml序列化或者還原序列化類6.通過XPath尋找Xml節點7.通過Xslt轉化Xml格式
C#操作Xml:使用XmlReader讀Xml