使用 Visual C# 通过 XPath 表达式查询 XML

本文介绍如何使用XPathNavigator类通过 XML 路径语言 (XPath) 表达式查询XPathDocument对象。

原始产品版本: Visual Studio、.NET Framework
原始 KB 数: 308333

总结

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

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

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

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

使用 XPath 表达式查询 XML

  1. 在 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 复制到文件夹,该文件夹位于在其中创建此项目的文件夹下。
  2. 确保项目引用 System.Xml 命名空间。

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

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

    XPathNavigator nav;
    XPathDocument docNav;
    XPathNodeIterator NodeIter;
    String strExpression;
    
  5. XPathDocument使用示例文件加载Books.xml。 该 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. 使用此方法为所选SelectXPathNavigator节点创建一个 XPathNodeIterator 。 表示 XPathNodeIterator XPath 节点集,并支持在此节点集上执行的操作。

    // Select the node and place the results in an iterator.
    NodeIter = nav.Select(strExpression);
    
  11. XPathNodeIterator使用从Select方法XPathNavigator返回的 、在所选节点中移动。 在这种情况下,可以使用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. 生成并运行项目。

    注意

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

故障排除

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

system.Xml.XmlException 类型的未经处理的异常发生在System.xml.dll
其他信息:系统错误。

异常错误发生在以下代码行上:

docNav = new XPathDocument("c:\\books.xml");

异常错误是由无效的处理指令引起的。 例如,处理指令可能包含多余的空格。 以下示例是无效的处理指令:

<?xml version='1.0' ?>

若要解决异常,请使用以下解决方法之一:

  • 更正无效的处理指令。 以下示例是有效的处理指令:

    <?xml version='1.0'?>
    
  • 从Books.xml文件中删除 XML 处理指令。

参考