XML文件的快速读取器:XmlReader类
XmlReader类相当于XML数据读取器,该类提供对XML数据进行快速、非缓存、只进读取的功能。使用该类可以从当前定位的节点,用多种读取方法向前唯一地读取下一个节点。
XmlReader类在.net framework中具有多种实现,例如XmlTextReader类、XmlNodeReader类和XmlValidatingReader类等。一般的做法不是使用这些类的构造函数来创建XmlReader类的实例,而是通过Create方法创建。
在使用Create方法创建xmlReader类实例的时候,可以指定XmlReaderSettings类实例的相关属性,启用或者禁用其某些功能,然后将XmlReaderSettings实例作为参数传递给Create方法。
之所以使用该方法创建XmlReader,是因为可以通过XmlReaderSettings类实例属性的指定,来决定创建的XmlReader类实例所支持的功能,还可以使用通过一个XmlReaderSettings类实例创建多个具有相同功能的XmlReader类实例。这在批量处理XML文档时具有相当重要的意义。
另外,使用Create 方法可以从原有的XmlReader 类实例的读取特性。如果不创建新的XmlReader类实例,同时通过XmlReaderSettings来指定新XmlReader类实例的读取特性。如果不创建新的XmlReader实例,而是赋值给原有的XmlReader类实例,将修改原有的XmlReader类实例的读取特性。
最后,使用Create方法创建的XmlReader类实例可以更好地使用.net framework中的某些功能,例如更好的一致性检查、与XML1.0标准的一致性等。这是其他方法创建的XmlReader类实例所不具备的。
XmlReader类在读取XML数据错误时将引发XmlException异常。此时的XmlReader类实例不能正常使用,例如,返回的节点属性与实际的当前节点属性会不一致。通过查看ReadState可以检查当前XmlReader类实例是否正常。
XmlReader类的语法定义如下:
public abstract class XmlRaader : IDisposeable
XmlReader 是抽象类,没有构造函数,可以使用XmlReader类的Create静态方法创建其实例。下面将演示如何使用Create方法创建XmlReader类实例,代码如下:
应用:XML文件的快速读取
XmlReader类提供的XML文档只读进非缓存的读取方式,能够快速地读取XML结构中包含的数据。在读取较大的XML文档时,使用XmlReader类提供的读取功能,也可以获得较好的性能。
本例的目的是演示如何通过XmlReader提供的方法,获取XML数据中指定的数据,并把这些数据显示出来。实例的详细步骤如下所述。
1、建立一个名为“Book.xml”文件。
<?xml version="1.0"?>
<store>
<book id = "1" genre="novel" publicationdate="1997" ISBN="1-861001-57-5">
<title>Pride And Prejudice</title>
<price>24.95</price>
</book>
<book id = "2" genre="business" publicationdate="2003" ISBN="4-746623-03-2">
<title>Custumor Manger</title>
<price>31.46</price>
</book>
</store>
2、新建一个Windows控制台应用程序,命名为“ReadBook”。
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace ReadBook
{
class Program
{
static void Main(string[] args)
{
XmlReader read = XmlReader.Create(@"C:\book.xml");
while (read.Read())
{
read.ReadToFollowing("book");
if (!(read.ReadState == ReadState.EndOfFile))
{
String sgenre = read.GetAttribute("genre");
String spublicationdate = read.GetAttribute("publicationdate");
read.ReadToFollowing("title");
if (!(read.ReadState == ReadState.EndOfFile))
{
String sname = read.ReadElementString("title");
Console.WriteLine("书名:" + sname + " 类别:" + sgenre + " 出版日期:" + spublicationdate);
}
}
}
read.Close();
Console.ReadLine();
}
}
}
3、输出结果: