This article is currently in the process of being translated into Chinese (~70% done).
Reading XML with the XmlReader class
C#读取XML大致有两种方法:使用XmlDocument 类 或者 使用 XmlReader 类。 XmlDocument类读取整个XML文档到内存中,然后允许你向前或者向后操作,或者使用XPath技术来查询。
XmlReader是另外一种方案,这种方案占用内存更少,而且更快。它让你可以一次处理一个XML元素,允许你查看元素的值,然后继续操作下一个元素。因为这种操作,它显然会消耗更少的内存,因为它只操作当前的元素,并且因为你需要人为地检查元素的值,所以你只需要操作相关的元素即可,而这让它运行地很快。在本章,我们将关注XmlReader类,然后在下一章学习XmlDocument类。
让我们尝试一个小示例,我们将读取一个包含货币汇率的XML文档。幸运的是,欧洲央行(ecb)有一个我们可以利用的XML文件。我们可以把它下载到本地硬盘再去读取它,但实际上,XmlReader和XmlDocument类都可以从远程URL读取XML,就像从本地文件读取一样。您可以在这里看到这个XML( http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml)。下面是一些代码和解释:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlReader xmlReader = XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
while(xmlReader.Read())
{
if((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Cube"))
{
if(xmlReader.HasAttributes)
Console.WriteLine(xmlReader.GetAttribute("currency") + ": " + xmlReader.GetAttribute("rate"));
}
}
Console.ReadKey();
}
}
}
我们首先使用静态Create()方法创建XmlReader实例。它有几个重载,但其中最简单的只需要提供一个指向文件的URL。在while循环中,我们在XmlReader实例上调用Read()方法。它将读取器推进到下一个元素,只要还有更多的内容需要读取,它就会返回true。在循环内部,我们可以使用XmlReader上的属性和方法来访问当前元素的数据。
在我们的例子中,我们检查NodeType以查看是否有一个元素(标记部分),以及名称是否为“Cube”。正如你在这个XML文档中所看到的,每个货币汇率都在一个名为Cube的元素中,所以当然这是我们要寻找的——其余的都被忽略了。一旦我们有了一个Cube元素,我们会做一个检查,看看它是否有属性(它应该有),然后我们使用GetAttribute()方法来读取两个属性值“currency”和“rate”。我们将它们打印到控制台,然后转到下一个元素。其结果应该是一份完整的货币清单及其当前汇率。
正如你所看到的,这是非常简单的,但主要是因为我们只需要按读取数据的相同顺序读取数据,而不需要对数据做任何修改。在下一章中,我们将做同样的事情,但是要使用XmlDocument类,以便您可以看到区别。
注意:你应该意识到,上面的代码可能会以多种方式失败并触发异常,你当然应该处理这些情况。更多信息,请参见异常这一章。