本文介绍如何使用XPathNavigator
类通过 XML 路径语言 (XPath) 表达式查询XPathDocument
对象。
原始产品版本: Visual Studio、.NET Framework
原始 KB 数: 308333
总结
XPath 以编程方式用于计算表达式和选择文档中的特定节点。
本文介绍Microsoft .NET Framework 类库命名空间 System.Xml.XPath
。
本文假定你熟悉以下主题:
- Visual C#
- XML 术语
- 创建和读取 XML 文件
- XPath 语法
使用 XPath 表达式查询 XML
在 Visual Studio 中创建新的 Visual C# 控制台应用程序。
注意
- 此示例使用名为 Books.xml的文件。 可以创建自己的Books.xml文件,也可以使用 .NET 软件开发工具包(SDK)快速入门中包含的示例。 如果没有安装快速入门并不想安装它们,请参阅 Books.xml下载位置的“参考” 部分。 如果已安装快速入门,可以在文件夹中找到
Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transforxml\VB
该文件。 可以将文件\Bin\Debug
复制到文件夹,该文件夹位于在其中创建此项目的文件夹下。
- 此示例使用名为 Books.xml的文件。 可以创建自己的Books.xml文件,也可以使用 .NET 软件开发工具包(SDK)快速入门中包含的示例。 如果没有安装快速入门并不想安装它们,请参阅 Books.xml下载位置的“参考” 部分。 如果已安装快速入门,可以在文件夹中找到
确保项目引用
System.Xml
命名空间。对
using
命名空间使用XPath
语句Xml
,以便你无需在代码后面限定这些命名空间中的声明。 可以在任何其他声明之前使用该using
语句,如下所示:using System.Xml; using System.Xml.XPath;
声明相应的变量。 声明要
XPathDocument
保存 XML 文档的对象、XpathNavigator
用于计算 XPath 表达式的对象,以及XPathNodeIterator
要循环访问所选节点的对象。 声明一个String
对象以保存 XPath 表达式。 在函数中添加Main
声明代码。Class1
XPathNavigator nav; XPathDocument docNav; XPathNodeIterator NodeIter; String strExpression;
XPathDocument
使用示例文件加载Books.xml。 该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]";
使用此方法为所选
Select
XPathNavigator
节点创建一个XPathNodeIterator
。 表示XPathNodeIterator
XPath 节点集,并支持在此节点集上执行的操作。// Select the node and place the results in an iterator. NodeIter = nav.Select(strExpression);
XPathNodeIterator
使用从Select
方法XPathNavigator
返回的 、在所选节点中移动。 在这种情况下,可以使用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();
生成并运行项目。
注意
结果将显示在控制台窗口中。
故障排除
测试代码时,可能会收到以下异常错误消息:
system.Xml.XmlException 类型的未经处理的异常发生在System.xml.dll
其他信息:系统错误。
异常错误发生在以下代码行上:
docNav = new XPathDocument("c:\\books.xml");
异常错误是由无效的处理指令引起的。 例如,处理指令可能包含多余的空格。 以下示例是无效的处理指令:
<?xml version='1.0' ?>
若要解决异常,请使用以下解决方法之一:
更正无效的处理指令。 以下示例是有效的处理指令:
<?xml version='1.0'?>
从Books.xml文件中删除 XML 处理指令。