本文介绍如何使用 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 数据,请执行以下步骤:
启动 Visual Studio .NET 2002、Visual Studio .NET 2003 或 Visual Studio 2005。
在 “文件” 菜单上,指向 “新建” ,然后单击 “项目” 。
将显示“新建项目”对话框。
在“项目类型”下,单击“视觉对象C++项目。
注意
在 Visual Studio 2005 中, Visual C++ Projects 更改为 Visual C++。
在“模板”下,如果使用的是 Visual Studio .NET 2002,请单击“托管C++应用程序”。
在“模板”下,如果使用的是 Visual Studio .NET 2003,请单击“控制台应用程序”(.NET)。
在“模板”下,如果使用的是 Visual Studio 2005,请单击“CLR 控制台应用程序”。
在 “名称 ”框中,键入 Q815658,然后单击“ 确定”。
在项目中添加对
System.xml.dll
的引用。 有关如何添加对托管视觉对象C++项目的引用的详细信息,请参阅 添加对托管 Visual C++ 项目的引用按如下所示在命名空间中
System::Xml
指定 using 指令:using namespace System::Xml;
执行此操作后,无需在代码中限定
XmlTextReader
类声明。 必须在任何其他声明之前使用 using 指令。创建对象的
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
更改为主函数。读取 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); }
检查节点。
若要处理 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; } }
检查属性。
元素节点类型可以包含与元素节点类型关联的属性节点列表。 该方法
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; } }
保存解决方案。 生成解决方案。
按 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 中添加公共语言运行时支持编译器选项,请执行以下步骤:
单击“项目”,然后单击“<ProjectName> 属性”。
注意
<ProjectName> 是项目名称的占位符。
展开 配置属性,然后单击“ 常规”。
单击以选择公共语言运行时支持、旧语法(/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。