使用 Visual C# 从 URL 读取 XML 数据

本文介绍如何使用 XmlTextReader 类从 URL 读取 XML。 流式传输的信息可以来自各种源,例如来自服务器的字节流、文件或 TextReader 类。

原始产品版本: Visualstudio
原始 KB 编号: 307643

要求

本文假设你熟悉以下主题:

  • Microsoft Visual Studio
  • XML 术语
  • 创建和读取 XML
  • URL 和创建 XML 终结点

本文引用.NET Framework类库命名空间 System.Xml

如何从 URL 读取 XML 数据

此示例使用名为 Books.xml的文件。 可以创建自己的 Books.xml 文件,或使用 .NET 软件开发工具包 (SDK) 快速入门中包含的示例文件。 此文件也可下载:有关下载位置,请参阅本文的 “参考” 部分中的第一项。

  1. Books.xml 文件复制到 \Inetpub\Wwwroot 计算机上的 文件夹中。

  2. 打开 Visual Studio。

  3. 创建新的 Visual C# 控制台应用程序。 可以继续转到 “完成代码列表 ”部分,也可以继续执行这些步骤来生成应用程序。

  4. 在命名空间上 System.Xml 指定 using 指令,以便稍后无需在代码中限定 XmlTextReader 类声明。 必须在任何其他声明之前使用 using 指令。

    using System.Xml;
    
  5. 通过 URL 检索 XML 流。 流用于独立于设备;因此,如果流的源发生更改,则不需要更改程序。 声明 URL 的 http://localhost/books.xml 常量。 在下一步中,你将使用 常量。XmlTextReader 将以下代码示例添加到默认类的 main 过程:

    String URLString = "http://localhost/books.xml";
    
  6. 创建 类的 XmlTextReader 实例,并指定 URL。 通常, XmlTextReader 如果需要将 XML 作为原始数据访问,而不需要文档对象模型 (DOM) 的开销,则使用 ;因此, XmlTextReader 提供了一种更快的 XML 读取机制。 类 XmlTextReader 具有不同的构造函数,用于指定 XML 数据的位置。 以下代码创建 对象的实例 XmlTextReader ,并将 URL 传递给构造函数:

    XmlTextReader reader = new XmlTextReader (URLString);
    
  7. 通读 XML。

    注意

    此步骤显示了一个基本的外部 while 循环,接下来的两个步骤介绍了如何使用该循环和读取 XML。

    加载后, XmlTextReader 执行顺序读取以跨 XML 数据移动, Read 并使用 方法获取下一条记录。 如果没有更多记录,则 Read 方法返回 false。

    while (reader.Read())
    {
        // Do some work here on the data.
        Console.WriteLine(reader.Name);
    }
    Console.ReadLine();
    
  8. 检查节点。 为了处理 XML 数据,每个记录都有一个节点类型,该类型可通过 属性确定 NodeTypeNameValue 属性返回节点名称 (元素名称和属性名称) ,节点值 (当前节点 (或记录) 的节点文本) 。 枚举 NodeType 确定节点类型。 以下示例代码显示元素的名称和文档类型。

    注意

    此示例忽略元素属性。

    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 the end of the element.
                Console.Write("</" + reader.Name);
                Console.WriteLine(">");
                break;
        }
    }
    
  9. 检查属性。 元素节点类型可以包含与其关联的属性节点的列表。 方法 MovetoNextAttribute 按顺序在 元素中的每个属性之间移动。 HasAttributes使用 属性测试节点是否具有任何属性。 属性 AttributeCount 返回当前节点的属性数。

    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element: // The node is an element.
                Console.Write("<" + reader.Name);
    
                while (reader.MoveToNextAttribute()) // Read the 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 the end of the element.
                Console.Write("</" + reader.Name);
                Console.WriteLine(">");
                break;
        }
    }
    
  10. 生成并运行项目。

完整代码列表

using System;
using System.Xml;

namespace ReadXMLfromURL
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static void Main(string[] args)
        {
            String URLString = "http://localhost/books.xml";
            XmlTextReader reader = new XmlTextReader (URLString);

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element: // The node is an element.
                        Console.Write("<" + reader.Name);

                        while (reader.MoveToNextAttribute()) // Read the 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 the end of the element.
                        Console.Write("</" + reader.Name);
                        Console.WriteLine(">");
                        break;
                }
            }
        }
    }
}

示例输出

<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>

疑难解答

测试代码时,可能会收到以下异常错误消息:

类型为 System.Xml 的未经处理的异常。xmlException 发生在 system.xml.dll 其他信息:意外的 XML 声明。 XML 声明必须是文档中的第一个节点,并且不允许在它前面显示空格字符。 第 1 行,位置 4。

异常错误发生在以下代码行上。

while (reader.Read())

若要解决异常错误,请删除 Books.xml 文档中第一个节点前面的空白字符。

References