本文演示如何使用
XmlTextReader 类从流中读取扩展标记语言 (XML)。流可以来自各种来源,如来自服务器、文件或
TextReader 类的字节流。
要求
下面列出推荐使用的硬件、软件、网络结构以及所需的 Service Pack:
- Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server 或 Windows NT 4.0 Server
- Microsoft Visual Studio .NET
本文假定您熟悉下列主题:
如何读取数据流中的 XML 数据
- 打开 Visual Studio .NET。
- 新建 Microsoft Visual Basic (VB) 或 Microsoft Visual C# 控制台应用程序。
备注:以下步骤提供了有关如何生成应用程序的详细说明。也可以直接到第 10 步,在此步中提供了完整的代码。 - 确保该项目包含对 System.Xml 和 System.IO 名称空间的引用。
- 对 Xml 名称空间使用 IMPORTS 语句,这样,在后面的代码中就不需要限定该名称空间中的 XmlTextReader 声明了。IMPORTS 语句必须位于所有其他声明之前,如下所示。
Visual Basic .NET 代码
Imports System.Xml
Imports System.IO
Visual C# 代码
using System.Xml;
using System.IO;
- 创建或检索 XML 数据流。流是一个抽象概念,表示用作数据(此处为 XML 数据)源或目标的输入或输出设备。可以写入流或者从流中读取,可以将流最为形象地比作字节的流动。
数据流用于独立于设备,因此,如果出现数据流的来源发生变化之类的情况,并不要求程序也随之变化。给 XmlTextReader 类创建流有几种不同的方法。选择将以下代码示例之一添加到默认模块的 Main 过程中:- 使用 StringReader 对象的代码示例:
StringReader 对象从字符串中读取字符,在构造过程中取得一个字符串值。 Visual Basic .NET 代码
Dim stream as System.IO.StringReader
stream = new StringReader("<?xml version='1.0'?>" & _
"<!-- This file is a book store inventory. -->" & _
"<bookstore>" & _
" <book genre=""autobiography"" ISBN=""1-861003-11-0"">" & _
" <title>The Autobiography of Benjamin Franklin</title>" & _
" <author>" & _
" <first-name>Benjamin</first-name>" & _
" <last-name>Franklin</last-name>" & _
" </author>" & _
" <price>8.99</price>" & _
" </book>" & _
"</bookstore>") C# 代码
StringReader stream;
stream = new StringReader("<?xml version='1.0'?>" +
"<!-- This file represents a fragment of a book store inventory database. -->" +
"<bookstore>" +
" <book genre=\"autobiography\" publicationdate=\"1981\" ISBN=\"1-861003-11-0\">" +
" <title>The Autobiography of Benjamin Franklin</title>" +
" <author>" +
" <first-name>Benjamin</first-name>" +
" <last-name>Franklin</last-name>" +
" </author>" +
" <price>8.99</price>" +
" </book>" +
" <book genre=\"novel\" publicationdate=\"1967\" ISBN=\"0-201-63361-2\">" +
" <title>The Confidence Man</title>" +
" <author>" +
" <first-name>Herman</first-name>" +
" <last-name>Melville</last-name>" +
" </author>" +
" <price>11.99</price>" +
" </book>" +
" <book genre=\"philosophy\" publicationdate=\"1991\" ISBN=\"1-861001-57-6\">" +
" <title>The Gorgias</title>" +
" <author>" +
" <name>Plato</name>" +
" </author>" +
" <price>9.99</price>" +
" </book>" +
"</bookstore>"); - 使用 StreamReader 对象的代码示例:
StreamReader 对象用于从文件读取字符。在构造过程中,该对象读入要读取的文件的名称: Visual Basic .NET 代码
Dim stream as System.IO.StreamReader
' Loads the XML data in the file books.xml in a new stream.
stream = New StreamReader ("books.xml") C# 代码
System.IO.StreamReader stream = new System.IO.StreamReader ("books.xml");
请注意,此处使用 Books.xml 文件。可以创建自己的 Books.xml 文件。示例
Books.xml 文件还随 Visual Studio .Net 和 .Net 框架 SDK 一起提供。
- 使用数据流构造一个 XmlTextReader 类。通常,如果需要在不使用文档对象模型 (DOM) 的情况下将 XML 作为要访问的原始数据,则可以使用 XmlTextReader;因此,XmlTextReader 提供了一种更快读取 XML 的机制。XmlTextReader 使用不同的构造函数来指定 XML 数据的位置。以下代码从某个流加载 XmlTextReader:
Visual Basic .NET 代码
Dim reader As XmlTextReader = New XmlTextReader (stream)
C# 代码
XmlTextReader reader = null;
reader = new XmlTextReader (stream);
- 读取全部 XML 数据。加载后,XmlTextReader 将连续读取 XML 数据,并使用 Read 方法获取下一条记录。到达最后一条记录后,返回 False。
Visual Basic .NET 代码
Do While (reader.Read())
' Do some work here on the data.
Console.WriteLine(reader.Name)
Loop
' Reading of the XML file has finished.
Console.ReadLine() 'Pause
C# 代码
while (reader.Read())
{
// Do some work here on the data.
...
}
while (reader.Read())
{
// Do some work here on the data.
Console.WriteLine(reader.Name);
}
Console.ReadLine(); - 检查节点。若要处理 XML 数据,每个记录都应该有一个节点类型,可通过 NodeType 属性确定该节点类型。Name 和 Value 属性返回当前节点(或记录)的节点名(元素和属性名)和节点值(节点文本)。NodeType 枚举确定节点类型。下面的示例显示了元素的名称和文档类型。注意,此示例忽略了元素属性。
Visual Basic .NET 代码
Do While (reader.Read())
Select Case reader.NodeType
Case XmlNodeType.Element 'Display beginning of element.
Console.Write("<" + reader.Name)
Console.WriteLine(">")
Case XmlNodeType.Text 'Display the text in each element.
Console.WriteLine(reader.Value)
Case XmlNodeType.EndElement 'Display end of element.
Console.Write("</" + reader.Name)
Console.WriteLine(">")
End Select
Loop C# 代码
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:// The node is an Element.
Console.Write("<" + reader.Name);
Console.WriteLine(">");
break;
case XmlNodeType.Text://Display the text in each element.
Console.WriteLine (reader.Value);
break;
case XmlNodeType.EndElement://Display end of element.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
} - 检查属性。元素节点类型可包括一系列与其关联的属性节点。MovetoNextAttribute 方法连续在元素的每个属性中移动。使用 HasAttributes 属性检测节点是否有任何属性。AttributeCount 属性返回当前节点的属性个数。
Visual Basic .NET 代码
Do While (reader.Read())
Select Case reader.NodeType
Case XmlNodeType.Element 'Display beginning of element.
Console.Write("<" + reader.Name)
If reader.HasAttributes Then 'If attributes exist
While reader.MoveToNextAttribute()
'Display attribute name and value.
Console.Write(" {0}='{1}'", reader.Name, reader.Value)
End While
End If
Console.WriteLine(">")
Case XmlNodeType.Text 'Display the text in each element.
Console.WriteLine(reader.Value)
Case XmlNodeType.EndElement 'Display end of element.
Console.Write("</" + reader.Name)
Console.WriteLine(">")
End Select
Loop C# 代码
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:// The node is an Element.
Console.Write("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Read attributes.
Console.Write(" " + reader.Name + "='" + reader.Value + "'");
Console.Write(">");
Console.WriteLine(">");
break;
case XmlNodeType.Text://Display the text in each element.
Console.WriteLine (reader.Value);
break;
case XmlNodeType.EndElement://Display end of element.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
- 为了方便起见,此处提供了完整的代码。
Visual Basic.Net 代码
Imports System.Xml
Imports System.IO
Module Module1
Sub Main()
Dim stream As System.IO.StreamReader
' Loads the XML data in the file books.xml in a new stream.
stream = New StreamReader("books.xml")
Dim reader As XmlTextReader = New XmlTextReader(stream)
Do While (reader.Read())
Select Case reader.NodeType
Case XmlNodeType.Element 'Display beginning of element.
Console.Write("<" + reader.Name)
If reader.HasAttributes Then 'If attributes exist
While reader.MoveToNextAttribute()
'Display attribute name and value.
Console.Write(" {0}='{1}'", reader.Name, reader.Value)
End While
End If
Console.WriteLine(">")
Case XmlNodeType.Text 'Display the text in each element.
Console.WriteLine(reader.Value)
Case XmlNodeType.EndElement 'Display end of element.
Console.Write("</" + reader.Name)
Console.WriteLine(">")
End Select
Loop
End Sub
End Module
C# 代码
using System;
using System.Xml;
using System.IO;
namespace ReadXMLFromStream
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
System.IO.StreamReader stream = new System.IO.StreamReader ("books.xml");
XmlTextReader reader = null;
reader = new XmlTextReader (stream);
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:// The node is an Element.
Console.Write("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Read attributes.
Console.Write(" " + reader.Name + "='" + reader.Value + "'");
Console.Write(">");
Console.WriteLine(">");
break;
case XmlNodeType.Text://Display the text in each element.
Console.WriteLine (reader.Value);
break;
case XmlNodeType.EndElement://Display end of element.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
}
}
}
- 生成并运行您的项目。
有关更多信息,请参见"XML in Microsoft .NET:.NET Framework XML Classes and C# Offer Simple, Scalable Data Manipulation"(Microsoft .NET 中的 XML:.NET 框架 XML 类和 C# 提供了简单、可缩放的数据操作)一文,这篇文章在
MSDN Magazine 中,可从下面的 Microsoft Web 站点访问:
有关
XmlReader、
StreamReader 和
StringReader 类的更多信息,请参见"Microsoft .NET 框架类库"文档。
有关使用
XmlReader 读取 XML 数据的更多信息,请参见《Microsoft .NET 框架开发人员指南》文档。