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

文章翻译 文章翻译
文章编号: 301228 - 查看本文应用于的产品
本文的发布号曾为 CHS301228
展开全部 | 关闭全部

本文内容

概要

本文演示如何使用 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.Xml
    Imports 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.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 一起提供。

  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.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;
        }
    }
  9. 检查属性。元素节点类型可包括一系列与其关联的属性节点。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;
        }
    }

  10. 为了方便起见,此处提供了完整的代码。
    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;
    				}
    			}
    
    		}
    	}
    }
    
  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 站点访问:
http://msdn.microsoft.com/library/periodic/period01/xml0101.htm
有关 XmlReaderStreamReaderStringReader 类的更多信息,请参见"Microsoft .NET 框架类库"文档。

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

属性

文章编号: 301228 - 最后修改: 2002年6月25日 - 修订: 1.1
这篇文章中的信息适用于:
  • Microsoft .NET Framework 1.1
关键字:?
kbhowtomaster kbxml tslic_tslic KB301228
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com