文章编号: 308333 - 最后修改: 2006年4月28日 - 修订: 2.0

HOW TO:使用 Visual C# .NET 通过 XPath 表达式查询 XML

系统提示此文章适用于与您所使用的操作系统不同的操作系统。文章内容可能与您无关,并且已被禁用。
本文的发布号曾为 CHS308333

本页

展开全部 | 关闭全部

概要

本文演示如何使用 XPathNavigator 类通过 XML 路径语言 (XPath) 表达式查询 XPathDocument 对象。XPath 用于以编程方式计算表达式并选择文档中的特定节点。

要求

下面的列表列出了推荐使用的硬件、软件、网络基础结构以及所需的服务包:
  • Visual C# .NET
本文假定您熟悉下列主题:
  • XML 术语
  • 创建和读取 XML 文件
  • XPath 语法

如何用 XPath 表达式查询 XML

  1. 在 Visual Studio .NET 中新建一个 Visual C# .NET 控制台应用程序。

    备注:本示例使用名为 Books.xml 的文件。您可以创建自己的 Books.xml 文件,也可以使用 .NET 软件开发工具包 (SDK) 快速入门中包括的示例。如果您没有安装"快速入门"而且也不想安装它们,请参阅 Books.xml 下载位置的"参考"部分。如果已经安装了"快速入门",则该文件位于以下文件夹中:
    Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB
    必须将该文件复制到 \Bin\Debug 文件夹,该文件夹位于您在其中创建该项目的文件夹中。
  2. 确保该项目引用 System.Xml 名称空间。
  3. Xml XPath 名称空间上使用 using 语句,这样以后就不需要在代码中限定这些名称空间中的声明了。using 语句必须在所有其他声明之前使用,如下所示:
    using System.Xml;
    using System.Xml.XPath;
  4. 声明合适的变量。声明 XPathDocument 对象以保存 XML 文档,声明 XpathNavigator 对象以计算 XPath 表达式,声明 XPathNodeIterator 对象以迭代通过选定节点。声明 String 对象以保存 XPath 表达式。在 Class1 的 Main 函数中添加声明代码。
    XPathNavigator nav; 
    XPathDocument docNav; 
    XPathNodeIterator NodeIter;
    String strExpression;
  5. 用示例文件 Books.xml 加载 XPathDocumentXPathDocument 类使用可扩展样式表语言转换 (XSLT) 为 XML 文档处理提供快速和面向性能的缓存。它类似于 XML 文档对象模型 (DOM),但经过了高度优化,以用于 XSLT 处理和 XPath 数据模型。
    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
  6. 从文档创建 XPathNavigatorXPathNavigator 对象用于进行只读 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. 使用 XPathNavigator 对象的 Evaluate 方法计算 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. 为使用 XPathNavigator Select 方法选择的节点创建 XPathNodeIteratorXPathNodeIterator 表示 XPath 节点集,因此它支持针对该节点集执行的操作。
    // Select the node and place the results in an iterator.
    NodeIter = nav.Select(strExpression);
  11. 使用从 XPathNavigator Select 方法返回的 XPathNodeIterator 遍历选定的节点。在这种情况下,可使用 XPathNodeIterator MoveNext 方法迭代通过选定的所有节点。
    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,以便更容易地显示上述结果。
    //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 处理指令。

参考

下列文件可从 Microsoft 下载中心下载:
收起这个图片展开这个图片
下载
立即下载 Books.xml (http://download.microsoft.com/download/xml/utility/1.0.0.1/wxp/en-us/books.exe)
有关更多信息,请访问以下 Microsoft Web 站点:
.NET 中的 XML:.NET Framework XML Classes and C# Offer Simple, Scalable Data Manipulation(.NET 中的 XML:.NET 框架 XML 类和 C# 提供简单的可缩放的数据操作)R/> http://msdn.microsoft.com/msdnmag/issues/01/01/xml/default.aspx (http://msdn.microsoft.com/msdnmag/issues/01/01/xml/default.aspx)

XPathNavigator Class
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNavigatorClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNavigatorClassTopic.asp)

XPathDocument Class(XPathDocument 类)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathDocumentClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathDocumentClassTopic.asp)

XPathNodeIterator Class(XPathNodeIterator 类)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNodeIteratorClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNodeIteratorClassTopic.asp)

XSLT Transformations with the XslTransform Class(使用 XslTransform 类 的 XSLT 转换)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconxslttransformationswithxsltransformclass.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconxslttransformationswithxsltransformclass.asp)

XPath Examples(XPath 示例)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathexamples.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathexamples.asp)

XPath Syntax(XPath 语法)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathsyntax.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathsyntax.asp)
有关 XPath 的更多信息,请访问下列 WWW 联合会 (W3C) Web 站点:
XML 路径语言 (XPath)
1.0 版:W3C 在 1999 年 11 月 16 日提出的建议
http://www.w3.org/TR/1999/REC-xpath-19991116 (http://www.w3.org/TR/1999/REC-xpath-19991116)

这篇文章中的信息适用于:
  • Microsoft ADO.NET(随 .NET 框架一起提供)
  • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbhowto kbhowtomaster kbdownload KB308333
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。