在 Visual C 中使用 XPath 表达式查询 XML#

本文讨论如何使用 XML 路径语言 (XPath) 表达式和XPathNavigator类查询XPathDocument对象。

XPath 以编程方式用于计算表达式和选择文档中的特定节点。

本文介绍Microsoft .NET Framework 类库命名空间 System.Xml.XPath

适用于: Visual Studio、.NET Framework

原始 KB 数: 308333

先决条件

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

  • Visual C#
  • XML 术语
  • 创建和读取 XML 文件
  • XPath 语法

查询具有 XPath 表达式的 XPathDocument

  1. 在 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 在其中创建此项目的文件夹的子文件夹中。

  2. 确保项目引用 System.Xml 命名空间。

  3. using命名空间使用Xml语句XPath,以便你无需在代码后面限定这些命名空间中的声明。 可以在任何其他声明之前使用该 using 语句,如下所示:

    using System.Xml;
    using System.Xml.XPath;
    
  4. 声明相应的变量。 声明要 XPathDocument 保存 XML 文档的对象、 XpathNavigator 用于计算 XPath 表达式的对象,以及 XPathNodeIterator 要循环访问所选节点的对象。 声明一个 String 对象以保存 XPath 表达式。 将声明代码添加到 Class1Main 函数中。

    XPathNavigator nav;
    XPathDocument docNav;
    XPathNodeIterator NodeIter;
    String strExpression;
    
  5. 加载 Books.xml和示例文件 XPathDocument。 该 XPathDocument 类使用可扩展样式表语言转换(XSLT)为 XML 文档处理提供快速且面向性能的缓存。 它类似于 XML 文档对象模型(DOM),但针对 XSLT 处理和数据 XPath 模型进行高度优化。

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. 从文档创建一个 XPathNavigator 。 该 XPathNavigator 对象用于只读 XPath 查询。 XPath 查询可能会返回结果值或多个节点。

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. 创建 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)";
    
  8. 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));
    
  9. 创建 XPath 表达式以查找成本超过 10 美元的所有书籍。 此 XPath 表达式仅返回来自 XML 源的 Title 节点。

    // Find the title of the books that are greater then $10.00.
    strExpression = "/bookstore/book/title[../price>10.00]";
    
  10. 为所选节点和 XPathNavigatorSelect 方法创建一个 XPathNodeIterator。 表示 XPathNodeIterator XPath 节点集,并支持在此节点集上执行的操作。

    // Select the node and place the results in an iterator.
    NodeIter = nav.Select(strExpression);
    
  11. 若要在所选节点中移动,请使用从 Select 方法返回的 XPathNodeIterator 对象。 在这种情况下,可以使用MoveNextXPathNodeIterator方法迭代遍历所有的选择节点。

    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);
    };
    
  12. 使用此方法 ReadLine 在控制台显示结束时添加暂停,以便更方便地显示前面步骤的结果。

    // Pause
    Console.ReadLine();
    
  13. 生成并运行项目。

    注意

    结果将显示在控制台窗口中。

故障排除

测试代码时,可能会收到以下异常错误消息:

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 处理指令。