使用 Visual C# 从 URL 读取 XML 数据
本文介绍如何使用 XmlTextReader
类从 URL 读取 XML。 流式传输的信息可以来自各种源,例如来自服务器、文件或 TextReader
类的字节流。
原始产品版本: Visual Studio
原始 KB 数: 307643
要求
本文假定你熟悉以下主题:
- Microsoft Visual Studio
- XML 术语
- 创建和读取 XML
- URL 和创建 XML 终结点
本文介绍 .NET Framework 类库命名空间 System.Xml
。
如何从 URL 读取 XML 数据
此示例使用名为 Books.xml的文件。 可以创建自己的 Books.xml 文件或使用 .NET 软件开发工具包(SDK)快速入门中包含的示例文件。 此文件也可供下载;有关下载位置,请参阅本文“ 参考” 部分中的第一项。
将 Books.xml 文件复制到
\Inetpub\Wwwroot
计算机上的文件夹。打开“Visual Studio”。
创建新的 Visual C# 控制台应用程序。 可以继续执行 “完成代码列表 ”部分,也可以继续执行以下步骤来生成应用程序。
在命名空间上
System.Xml
指定 using 指令,以便在代码后面不需要限定XmlTextReader
类声明。 必须在任何其他声明之前使用 using 指令。using System.Xml;
通过 URL 检索 XML 流。 流用于提供独立于设备;因此,如果流源发生更改,则不需要程序更改。 声明 URL 的
http://localhost/books.xml
常量。 在下一步中,你将使用常量。XmlTextReader
将以下代码示例添加到默认类的主过程:String URLString = "http://localhost/books.xml";
创建类的
XmlTextReader
实例并指定 URL。 通常,XmlTextReader
如果需要在没有文档对象模型(DOM)开销的情况下以原始数据的形式访问 XML,则使用它;因此,XmlTextReader
为读取 XML 提供了更快的机制。 该XmlTextReader
类具有不同的构造函数来指定 XML 数据的位置。 以下代码创建对象的XmlTextReader
实例,并将 URL 传递给构造函数:XmlTextReader reader = new XmlTextReader (URLString);
通读 XML。
注意
此步骤演示了一个基本的外部
while
循环,接下来的两个步骤介绍如何使用该循环和读取 XML。加载后,
XmlTextReader
执行顺序读取以跨 XML 数据移动,并使用Read
该方法获取下一条记录。 如果没有更多记录,该方法Read
将返回 false。while (reader.Read()) { // Do some work here on the data. Console.WriteLine(reader.Name); } Console.ReadLine();
检查节点。 若要处理 XML 数据,每个记录都有一个可从属性确定的
NodeType
节点类型。 属性Name
Value
返回节点名称(元素和属性名称)以及当前节点(或记录)的节点值(节点文本)。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; } }
检查属性。 元素节点类型可以包含与其关联的属性节点的列表。 该方法
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; } }
生成并运行项目。
完整代码清单
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文档中第一个节点之前的空白字符。