使用XmlReader讀Xml XmlDocument和XElement在讀取Xml時要將整個Xml文檔放到記憶體中去操作,這樣做操作簡單,但是很費記憶體和IO(可能是磁碟IO或者網路IO);而在有些場景下我們必須考慮儘可能節省記憶體和IO的開銷,這時候就該XmlReader和XmlWriter出場了。 ...
使用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();
}
}
}
|
感謝@Kingthy對文中消耗IO說法提出問題,XmlReader和XmlDocument消耗的IO是一樣的;不同的是XmlReader可以讀取一點,顯示一點,而XmlDocument必須完全讀入之後才可以開始處理。
C#處理Xml的相關隨筆:
1.通過XmlDocument讀寫Xml文檔 2.使用XmlReader讀Xml,使用XmlWriter寫Xml 3.使用Linq to xml存取XML 4.通過XmlScheme定義固定格式xml文檔 5.Xml序列化或者反序列化類 6.通過XPath查找Xml節點 7.通過Xslt轉化Xml格式