C#操作Xml:使用XmlReader讀Xml


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的相關隨筆:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM