本文讨论如何使用 XML 路径语言 (XPath) 表达式和XPathNavigator类查询XPathDocument对象。
XPath 以编程方式用于计算表达式和选择文档中的特定节点。
本文介绍Microsoft .NET Framework 类库命名空间 System.Xml.XPath。
适用于: Visual Studio、.NET Framework
原始 KB 数: 308333
先决条件
本文假定你熟悉以下主题:
- Visual C#
- XML 术语
- 创建和读取 XML 文件
- XPath 语法
查询具有 XPath 表达式的 XPathDocument
在 Microsoft Visual Studio 中,创建 Visual C# 控制台应用程序。
注意
此示例使用名为 Books.xml的文件。 可以创建自己的 Books.xml 文件,也可以使用 .NET 软件开发工具包(SDK)快速入门中包含的示例。
如果您没有安装快速入门指南,并且不想安装,请查看“相关内容”部分以获取Books.xml的下载位置。
如果已安装快速入门,则可以在
Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transforxml\VB文件夹中找到 Books.xml 文件。 可以将该文件复制到\Bin\Debug在其中创建此项目的文件夹的子文件夹中。确保项目引用
System.Xml命名空间。对
using命名空间使用Xml语句XPath,以便你无需在代码后面限定这些命名空间中的声明。 可以在任何其他声明之前使用该using语句,如下所示:using System.Xml; using System.Xml.XPath;声明相应的变量。 声明要
XPathDocument保存 XML 文档的对象、XpathNavigator用于计算 XPath 表达式的对象,以及XPathNodeIterator要循环访问所选节点的对象。 声明一个String对象以保存 XPath 表达式。 将声明代码添加到Class1的Main函数中。XPathNavigator nav; XPathDocument docNav; XPathNodeIterator NodeIter; String strExpression;加载 Books.xml和示例文件
XPathDocument。 该XPathDocument类使用可扩展样式表语言转换(XSLT)为 XML 文档处理提供快速且面向性能的缓存。 它类似于 XML 文档对象模型(DOM),但针对 XSLT 处理和数据XPath模型进行高度优化。// Open the XML. docNav = new XPathDocument(@"c:\books.xml");从文档创建一个
XPathNavigator。 该XPathNavigator对象用于只读 XPath 查询。 XPath 查询可能会返回结果值或多个节点。// Create a navigator to query with XPath. nav = docNav.CreateNavigator();创建 XPath 表达式以查找书籍的平均成本。 此 XPath 表达式返回单个值。 有关 XPath 语法的完整详细信息,请参阅“引用”部分中的 XPath 语法。
// Find the average cost of a book. // This expression uses standard XPath syntax. strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)";Evaluate使用对象的方法来XPathNavigator计算 XPath 表达式。 该方法Evaluate返回表达式的结果。// Use the Evaluate method to return the evaluated expression. Console.WriteLine("The average cost of the books are {0}", nav.Evaluate(strExpression));创建 XPath 表达式以查找成本超过 10 美元的所有书籍。 此 XPath 表达式仅返回来自 XML 源的 Title 节点。
// Find the title of the books that are greater then $10.00. strExpression = "/bookstore/book/title[../price>10.00]";为所选节点和
XPathNavigator的Select方法创建一个XPathNodeIterator。 表示XPathNodeIteratorXPath 节点集,并支持在此节点集上执行的操作。// Select the node and place the results in an iterator. NodeIter = nav.Select(strExpression);若要在所选节点中移动,请使用从
Select方法返回的XPathNodeIterator对象。 在这种情况下,可以使用MoveNext的XPathNodeIterator方法迭代遍历所有的选择节点。Console.WriteLine("List of expensive books:"); //Iterate through the results showing the element value. while (NodeIter.MoveNext()) { Console.WriteLine("Book Title: {0}", NodeIter.Current.Value); };使用此方法
ReadLine在控制台显示结束时添加暂停,以便更方便地显示前面步骤的结果。// Pause Console.ReadLine();生成并运行项目。
注意
结果将显示在控制台窗口中。
故障排除
测试代码时,可能会收到以下异常错误消息:
An unhandled exception of type System.Xml.XmlException occurred in System.xml.dll
Additional information: System error.
此异常发生在以下代码行上:
docNav = new XPathDocument("c:\\books.xml");
错误是由无效的处理指令引起的。 例如,处理指令可能包含多余的空格。 以下示例是无效的处理指令:
<?xml version='1.0' ?>
若要解决异常,请使用以下解决方法之一:
更正无效的处理指令。 以下示例是有效的处理指令:
<?xml version='1.0'?>从Books.xml文件中删除 XML 处理指令。