XPath 入门指南






4.11/5 (9投票s)
本文演示了初学者如何使用 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/book
这将选择 |
// |
这将选择当前位置以下 XML 文档中所有与前面表达式匹配的节点 | books//book
这也将选择 |
@ |
这用于选择节点的属性 | books/book/data[@type='Price']
这将选择所有具有 |
同样值得注意的是,您可以使用索引来选择特定节点。例如:/books[1]
将返回第一个“books
”元素。请注意,索引不是从零开始的。
注意:这是 W3C 规范。在某些浏览器中,此实现不正确,浏览器会将索引视为从零开始。这只应在您复制最初为特定浏览器编写的代码时才需要担心。我认为 IE5 和 IE6 会出现这种情况,但我从未真正调查过,所以情况可能如此,也可能不是。
推荐
我强烈建议您下载该项目的源文件。它将使您能够轻松地尝试不同的 XML 数据场景和 XPath 表达式,并帮助您学习。我一直说,从错误中学习比不尝试要好。
结论
好了,这就是我对 CodeProject 的第一个贡献。如果您觉得它有用,或者您希望我撰写一篇后续文章,详细介绍一些可能需要的更复杂的 XPath 表达式,请给我发电子邮件。您可以在我的 CodeProject 个人资料页面找到我的地址。