你目前正处于脱机状态,正在等待 Internet 重新连接

HOW TO:在 .NET 框架 SDK 中读取数据流的 XML 数据

本文的发布号曾为 CHS301228
本文引用下面的 Microsoft .NET 框架类库名称空间:
  • System.Xml
  • System.IO

本任务的内容

概要
本文演示如何使用 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 术语
  • 创建和读取 XML

如何读取数据流中的 XML 数据

  1. 打开 Visual Studio .NET。
  2. 新建 Microsoft Visual Basic (VB) 或 Microsoft Visual C# 控制台应用程序。

    备注:以下步骤提供了有关如何生成应用程序的详细说明。也可以直接到第 10 步,在此步中提供了完整的代码。
  3. 确保该项目包含对 System.Xml System.IO 名称空间的引用。
  4. Xml 名称空间使用 IMPORTS 语句,这样,在后面的代码中就不需要限定该名称空间中的 XmlTextReader 声明了。IMPORTS 语句必须位于所有其他声明之前,如下所示。
    Visual Basic .NET 代码
    Imports System.XmlImports System.IO
    Visual C# 代码
    using System.Xml;using System.IO;
  5. 创建或检索 XML 数据流。流是一个抽象概念,表示用作数据(此处为 XML 数据)源或目标的输入或输出设备。可以写入流或者从流中读取,可以将流最为形象地比作字节的流动。

    数据流用于独立于设备,因此,如果出现数据流的来源发生变化之类的情况,并不要求程序也随之变化。给 XmlTextReader 类创建流有几种不同的方法。选择将以下代码示例之一添加到默认模块的 Main 过程中:
    • 使用 StringReader 对象的代码示例:

      StringReader 对象从字符串中读取字符,在构造过程中取得一个字符串值。 Visual Basic .NET 代码
      Dim stream as System.IO.StringReaderstream = 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 一起提供。

  6. 使用数据流构造一个 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);
  7. 读取全部 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();
  8. 检查节点。若要处理 XML 数据,每个记录都应该有一个节点类型,可通过 NodeType 属性确定该节点类型。Name Value 属性返回当前节点(或记录)的节点名(元素和属性名)和节点值(节点文本)。NodeType 枚举确定节点类型。下面的示例显示了元素的名称和文档类型。注意,此示例忽略了元素属性。
    Visual Basic .NET 代码
    Do While (reader.Read())Select Case reader.NodeTypeCase 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 SelectLoop
    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;    }}
  9. 检查属性。元素节点类型可包括一系列与其关联的属性节点。MovetoNextAttribute 方法连续在元素的每个属性中移动。使用 HasAttributes 属性检测节点是否有任何属性。AttributeCount 属性返回当前节点的属性个数。
    Visual Basic .NET 代码
    Do While (reader.Read())Select Case reader.NodeTypeCase 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 WhileEnd IfConsole.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 SelectLoop
    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;    }}

  10. 为了方便起见,此处提供了完整的代码。
    Visual Basic.Net 代码
    Imports System.XmlImports System.IOModule Module1Sub 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.NodeTypeCase XmlNodeType.Element 'Display beginning of element.Console.Write("<" + reader.Name)If reader.HasAttributes Then 'If attributes existWhile reader.MoveToNextAttribute()'Display attribute name and value.Console.Write(" {0}='{1}'", reader.Name, reader.Value)End WhileEnd IfConsole.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 SelectLoopEnd SubEnd 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;				}			}		}	}}
  11. 生成并运行您的项目。
返回页首
参考
有关更多信息,请参见"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 站点访问:有关 XmlReaderStreamReaderStringReader 类的更多信息,请参见"Microsoft .NET 框架类库"文档。

有关使用 XmlReader 读取 XML 数据的更多信息,请参见《Microsoft .NET 框架开发人员指南》文档。

返回页首
dotnet xml
属性

文章 ID:301228 - 上次审阅时间:06/25/2002 14:26:00 - 修订版本: 1.1

  • Microsoft .NET Framework 1.1
  • kbhowtomaster kbxml tslic_tslic KB301228
反馈