使用 Visual C++ 从文件读取 XML 数据

本文介绍如何使用 XmlTextReader 类从文件中读取 XML 数据。

原始产品版本: Visual C++
原始 KB 数: 815658

总结

本文介绍如何使用 XmlTextReader 类从文件读取 XML 数据。 该 XmlTextReader 类提供 XML 数据的直接分析和标记。 除了命名空间以外,该 XmlTextReader 类还实现 XML 1.0 规范,该规范在万维网联合会(W3C)定义的 XML 规范中。 本文介绍如何快速对 XML 数据进行标记化流访问,而不是使用对象模型,例如 XML 文档对象模型(DOM)。

有关本文的 Microsoft Visual C# .NET 版本,请参阅 如何使用 Visual C# 从文件中读取 XML。

本文介绍以下Microsoft .NET Framework 类库命名空间: System.xml

要求

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

  • XML 术语
  • 如何创建以及如何读取 XML 文件

以下列表概述了所需的推荐硬件、软件、网络基础结构和服务包:

  • Microsoft Visual Studio .NET
  • Microsoft Visual Studio 2005

从文件读取 XML 数据

本文中的示例使用名为 Books.xml的文件。 可以创建自己的Books.xml文件,也可以使用Microsoft .NET 软件开发工具包(SDK)快速入门中包含的示例文件。 必须将Books.xml文件复制到项目文件夹。

若要从文件读取 XML 数据,请执行以下步骤:

  1. 启动 Visual Studio .NET 2002、Visual Studio .NET 2003 或 Visual Studio 2005。

  2. “文件” 菜单上,指向 “新建” ,然后单击 “项目”

    将显示“新建项目”对话框。

  3. 在“项目类型”下,单击“视觉对象C++项目

    注意

    在 Visual Studio 2005 中, Visual C++ Projects 更改为 Visual C++

  4. 在“模板”下,如果使用的是 Visual Studio .NET 2002,请单击“托管C++应用程序”。

    在“模板”下,如果使用的是 Visual Studio .NET 2003,请单击“控制台应用程序”(.NET)。

    在“模板”下,如果使用的是 Visual Studio 2005,请单击“CLR 控制台应用程序”。

  5. “名称 ”框中,键入 Q815658,然后单击“ 确定”。

  6. 在项目中添加对 System.xml.dll 的引用。 有关如何添加对托管视觉对象C++项目的引用的详细信息,请参阅 添加对托管 Visual C++ 项目的引用

  7. 按如下所示在命名空间中 System::Xml 指定 using 指令:

    using namespace System::Xml;
    

    执行此操作后,无需在代码中限定 XmlTextReader 类声明。 必须在任何其他声明之前使用 using 指令。

  8. 创建对象的 XmlTextReader 实例。 XmlTextReader使用.xml文件填充对象。

    通常, XmlTextReader 如果必须访问原始 XML 数据,而不用 DOM 开销,则使用类。 因此,该 XmlTextReader 类提供了一种更快的方法来读取 XML 数据。 该 XmlTextReader 类具有不同的 constructors 指定 XML 数据的位置。

    以下代码创建类的 XmlTextReader 实例,然后加载 Books.xml 文件。 向 _tmain 函数添加以下代码:

    XmlTextReader* reader = new XmlTextReader ("books.xml");
    

    注意

    在 Visual C++ 2005 中,函数 _tmain 更改为主函数。

  9. 读取 XML 数据。

    注意

    此步骤演示外部 while 循环。 执行此步骤的两个步骤演示如何使用 while 循环读取 XML 数据。

    创建 XmlTextReader 对象后,使用 Read 方法读取 XML 数据。

    Read 方法继续按顺序在 .xml 文件中移动,直到 Read 方法到达文件的末尾。 当 Read 方法到达文件的末尾时,Read 方法返回 false。

    while (reader->Read())
    {
        // Do some work here on the data.
        Console::WriteLine(reader->Name);
    }
    
  10. 检查节点。

    若要处理 XML 数据,每个记录都有一个可从属性确定的 NodeType 节点类型。 该 Name 属性和 Value 属性返回当前节点或当前记录的以下信息:

    • 元素名称和属性名称的节点名称。
    • 节点文本的节点值。

    NodeType枚举确定节点类型。 下面的代码示例显示元素的名称和文档类型。 下面的代码示例忽略元素属性:

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", 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("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    
  11. 检查属性。

    元素节点类型可以包含与元素节点类型关联的属性节点列表。 该方法 MovetoNextAttribute 按顺序移动元素中的每个属性。 使用该 HasAttributes 属性测试节点是否具有任何属性。 该 AttributeCount 属性返回当前节点的属性数。

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
    
                while (reader->MoveToNextAttribute()) // Read the attributes.
                    Console::Write(" {0}='{1}'", reader->Name, reader->Value);
                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("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    
  12. 保存解决方案。 生成解决方案。

  13. 按 Ctrl+F5 运行示例应用程序。

在 Visual Studio .NET 2002 或 Visual Studio .NET 2003 中查看完整的代码列表

#include "stdafx.h"
#include <tchar.h>

#using <mscorlib.dll>
#using <System.xml.dll>

using namespace System;
using namespace System::Xml;

void _tmain(void)
{
    XmlTextReader* reader = new XmlTextReader ("books.xml");

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
  
                while (reader->MoveToNextAttribute()) // Read the attributes.
                    Console::Write(" {0}='{1}'", reader->Name, reader->Value);
                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("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    Console::ReadLine();
}

注意

必须在 Visual C++ 2005 中添加公共语言运行时支持编译器选项(/clr:oldSyntax)才能成功编译前面的代码示例。 若要在 Visual C++ 2005 中添加公共语言运行时支持编译器选项,请执行以下步骤:

  1. 单击“项目”,然后单击“<ProjectName> 属性”。

    注意

    <ProjectName> 是项目名称的占位符。

  2. 展开 配置属性,然后单击“ 常规”。

  3. 单击以选择公共语言运行时支持、旧语法(/clr:oldSyntax)在右窗格中的公共语言运行时支持项目设置中,单击“应用,然后单击“确定”。

    有关公共语言运行时支持编译器选项的详细信息,请参阅 /clr (公共语言运行时编译)。

这些步骤适用于整个文章。

查看示例输出

<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.dll其他信息中发生了 System.Xml.XmlException 类型的未经处理的异常:系统错误。

参考

有关使用 XmlReader 读取 XML 的详细信息,请参阅 使用 XmlReader 读取 XML。