基于C#中XmlReader讀取Xml的深入分析
更新時間:2013年05月20日 09:04:28 作者:
本篇文章是對C#中XmlReader讀取Xml進行了詳細的分析介紹,需要的朋友參考下
XmlDocument和XElement在讀取Xml時要將整個Xml文檔放到內(nèi)存中去操作,這樣做操作簡單,但是很費內(nèi)存,而在有些場景下我們必須考慮盡可能節(jié)省內(nèi)存.這時候就該XmlReader和XmlWriter出場了。
XmlReader讀取Xml需要通過Read()實例方法,不斷讀取Xml文檔中的聲明,節(jié)點開始,節(jié)點內(nèi)容,節(jié)點結(jié)束,以及空白等等,直到文檔結(jié)束,Read()方法返回false。
如下讀取Xml內(nèi)容實例代碼和注釋說明
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的參數(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實例
using (XmlReader rdr = XmlReader.Create(strRdr))
{
//循環(huán)Read方法直到文檔結(jié)束
while (rdr.Read())
{
Console.WriteLine("rdr.NodeType = " + rdr.NodeType);
//如果是開始節(jié)點
if (rdr.NodeType == XmlNodeType.Element) {
//通過rdr.Name得到節(jié)點名
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)容
if(rdr.Read()) {
//通過rdr.Value獲得文本內(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");
}
}
}
}
Console.Read();
}
}
}
如果覺得代碼不明白,下面是一張讀取順序圖,標(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)簽
XmlReader讀取Xml需要通過Read()實例方法,不斷讀取Xml文檔中的聲明,節(jié)點開始,節(jié)點內(nèi)容,節(jié)點結(jié)束,以及空白等等,直到文檔結(jié)束,Read()方法返回false。
如下讀取Xml內(nèi)容實例代碼和注釋說明
復(fù)制代碼 代碼如下:
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的參數(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實例
using (XmlReader rdr = XmlReader.Create(strRdr))
{
//循環(huán)Read方法直到文檔結(jié)束
while (rdr.Read())
{
Console.WriteLine("rdr.NodeType = " + rdr.NodeType);
//如果是開始節(jié)點
if (rdr.NodeType == XmlNodeType.Element) {
//通過rdr.Name得到節(jié)點名
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)容
if(rdr.Read()) {
//通過rdr.Value獲得文本內(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");
}
}
}
}
Console.Read();
}
}
}
如果覺得代碼不明白,下面是一張讀取順序圖,標(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)簽
相關(guān)文章
C#判斷字符串中是否包含指定字符串及contains與indexof方法效率問題
這篇文章主要介紹了C#判斷字符串中是否包含指定字符串及contains與indexof方法效率問題 ,文中給大家列舉通過兩種方法來判斷,需要的朋友可以參考下2018-10-10c#實現(xiàn)16進制和字符串之間轉(zhuǎn)換的代碼
#中十六進制字符串的轉(zhuǎn)換函數(shù)2007-05-05Winform使用DataGridView實現(xiàn)下拉篩選
這篇文章主要為大家詳細介紹了Winform如何使用原生DataGridView實現(xiàn)下拉篩選功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09