65.9K
CodeProject 正在变化。 阅读更多。
Home

XPath 入门指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (9投票s)

2007 年 5 月 27 日

CPOL

5分钟阅读

viewsIcon

72982

downloadIcon

606

本文演示了初学者如何使用 C# 开始掌握 XPath。

引言

本文旨在解释什么是 XPath 表达式以及为什么它们对 C# 程序员极其有用。

背景

当我开始 .NET 编程时,我立即接触到了 XML 的使用。它无处不在,而我以前几乎没有接触过它。在了解了 XML 文档为何被广泛使用之后,我决定在我的下一个应用程序中纳入 XML 文件。于是,我添加了 System.Xml 命名空间到我的项目中,并创建了一个 XmlDocument 对象。我调用了 LoadXml() 方法,并传入了一个有效的 XML 字符串。“太棒了!”我心想,但很快发现我不知道如何从 XmlDocument 对象中获取我想要的数据。

在 C# 中使用 XPath

在本指南中,我将引用以下 XML 文件

<?xml version="1.0" encoding="utf-8" ?>
<books>
  <book>
    <title>A beginners guide to XPath</title>
    <author>Gary Francis</author>
    <description>A book that explains XPath for beginners</description>
    <data type="Price">12.00</data>
    <data type="ISBN">1234567890</data>
  </book>
  <book>
    <title>Advanced C# Programming</title>
    <author>A. Uther</author>
    <description>Advanced applied C# techniques.</description>
    <data type="Price">47.00</data>
  </book>
  <book>
    <title>Understanding C# for beginners</title>
    <author>Any body</author>
    <description>How to get started with C# and .NET</description>
    <data type="Price">12.00</data>
    <data type="Comment">This was a great book... It helped Loads.</data>
    <data type="Comment">Excellent material if you new to C#.</data>
  </book>
</books>

上面的 XML 文件包含有关书籍的信息。正如你所能想象的,这个文件可能会复杂得多,但为了简单起见,我们将保持原样。

在我们能够对这些数据执行任何有用的操作之前,我们需要创建一个 XmlDocument 对象并将其加载到其中。在 Visual Studio 中,创建一个新的 C# Windows Forms 应用程序。在窗体上放置一个按钮,然后双击该按钮以打开其事件处理程序。以下代码从文件中加载 XML 数据

XmlDocument document = null;
XmlNodeList nodeList = null;
XmlNode node = null;
// Try and load xml data into an Xml document object and throw an
// error message if this fails
try
{
    document = new XmlDocument();
    document.Load("Data.xml");
}
catch (Exception ex)
{
    MessageBox.Show("Error loading 'Data.xml'. Exception: " + ex.Message);           
}

为了使上述代码能够编译,您需要在代码文件顶部引用 System.Xml 命名空间。此示例还假定您的项目中有一个名为“Data.xml”的文件。最简单的方法是向项目中添加一个新的 XML 文件,将上述 XML 数据插入到该文件中,并将文件命名为 Data.xml。最后,您应该将 XML 文件的“复制到输出目录”属性设置为“始终复制”。

现在我们已经成功加载了数据,我们需要引用一些数据。为此,我们将使用 XPath 表达式。我们最初要尝试检索的数据是 XML 文件中所有 book 元素的 NodeList。实现此目的的 XPath 表达式是

/books/book

不用太担心您不明白这是什么意思,因为很快就会揭晓。所以我们将以下代码添加到方法中

// Try and retrieve all book nodes
nodeList = document.SelectNodes("/books/book");

这将用所有 book 元素填充我们的 XmlNodeList。嗯,在每个元素中,我们知道会有一个 <title> 元素。所以我们可以使用另一个 XPath 查询来访问它。以下代码将为我们刚刚检索到的每个 book 元素执行此操作

foreach (XmlNode book in nodeList)
{
    // Show a message with the book title
    MessageBox.Show(book.SelectSingleNode("title").InnerText);
}

很简单,对吧?那么,现在,我敢打赌您可以想象在您的应用程序中使用 XPath 的各种方式,您是对的。仍然存在 XPath 语法这个小问题。

构建 XPath 表达式

由于这只是一个入门教程,我将只介绍基本的 XPath 表达式及其含义。随着时间的推移,您可能需要尝试更复杂的 XPath 查询,例如反向读取 XML 数据(从子节点到父节点)。这超出了本文档的范围,但在互联网上有很多其他资源可以帮助您。

在使用 XPath 时,您应该记住的第一件重要事情是您使用表达式时的上下文。例如,如果我们正在尝试选择书籍的标题时使用 /books 表达式,那么我们实际上是在查找我们已经存在的 book 节点内的 books 节点。为了使之生效,我们的 XML 文档必须看起来像

<books>
  <book>
    <books>
      <book></book>
    </books>
  </book>
</books>

从上面的例子中,我希望您能理解上下文的重要性,因为当您尝试在应用程序中使用 XPath 时,这一点将变得显而易见。

那么,使用 XPath 我们可能需要知道做的第一件事是选择一些节点。以下是一些选择节点的方法示例

表达式 描述 示例
节点名 这将选择指定节点名称的所有子节点 书籍

这将选择“books”元素下的所有节点

/ 这将选择从根节点开始的所有与前面表达式匹配的子节点 books/book

这将选择 books 元素中包含的所有 book 节点

// 这将选择当前位置以下 XML 文档中所有与前面表达式匹配的节点 books//book

这也将选择 books 元素中包含的所有 book 节点,但如果 books 元素之外还有一个 book 元素,它们也会被选中

@ 这用于选择节点的属性 books/book/data[@type='Price']

这将选择所有具有 price 属性的 book 元素

同样值得注意的是,您可以使用索引来选择特定节点。例如:/books[1] 将返回第一个“books”元素。请注意,索引不是从零开始的。

注意:这是 W3C 规范。在某些浏览器中,此实现不正确,浏览器会将索引视为从零开始。这只应在您复制最初为特定浏览器编写的代码时才需要担心。我认为 IE5 和 IE6 会出现这种情况,但我从未真正调查过,所以情况可能如此,也可能不是。

推荐

我强烈建议您下载该项目的源文件。它将使您能够轻松地尝试不同的 XML 数据场景和 XPath 表达式,并帮助您学习。我一直说,从错误中学习比不尝试要好。

结论

好了,这就是我对 CodeProject 的第一个贡献。如果您觉得它有用,或者您希望我撰写一篇后续文章,详细介绍一些可能需要的更复杂的 XPath 表达式,请给我发电子邮件。您可以在我的 CodeProject 个人资料页面找到我的地址。

© . All rights reserved.