使用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必须完全读入之后才可以开始处理。