如何使用 XPathExpression 类
此示例阐释如何使用 XPathExpression 类编译 XML 路径语言 (XPath) 表达式,以从 XML 文件中选择节点集。然后,该示例说明如何添加自定义排序例程,并使用 XPathExpression 对编译的 XPath 所返回的元素进行排序。最后,它还说明如何使用可扩展样式表语言转换 (XSLT) 参数,以重复使用编译的 XPath 的方式进行排序。此示例使用 XPathNavigator 类,该类提供对 XPathDocument 进行光标样式的浏览。此示例还使用表示已编译的 XPath 表达式的 XPathExpression 类。该 XPathExpression 类是从 XPathNavigator 的 Compile 方法返回的,并被提供给 Select、Evaluate 和 Matches 方法。
[运行示例] | [查看源代码] |
首先,该示例编译一个 XPath 表达式,以从 XML 文件选择节点集。为此,该示例先创建一个 XPathDocument,并将 books.xml 文件加载到该对象中。然后,该示例从 XPathDocument 创建一个 XPathNavigator。该示例使用 XPathNavigator 对象在使用 XPathNodeIterator 的文档中移动。
XPathDocument myXPathDocument = new XPathDocument(args); //Create an XPathNavigator XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator(); |
||
C# | VB |
在创建了选择 XPathDocument 中的书籍元素的 XPath 表达式之后,该示例将表达式编译到 XPathNavigator 中,然后使用 Select 方法执行该 XPath 表达式。该示例使用 FormatXml 函数显示得到的 XML 数据。通过将 XPathNodeIterator 传递到此函数,此函数可连续地选择各个节点以进行格式化。
// Get the Book elements selectExpr = "bookstore/book"; ... // Ensure we are at the root node myXPathNavigator.MoveToRoot(); myXPathExpr = myXPathNavigator.Compile(selectExpr); ... // Create an XPathNodeIterator to walk over the selected nodes XPathNodeIterator myXPathNodeIterator = myXPathNavigator.Select (myXPathExpr); FormatXml(myXPathNodeIterator); |
||
C# | VB |
此示例的第二部分显示如何使用 XPath 表达式对节点集进行排序。
第二部分使用在该示例的第一部分中已编译的相同 XPathExpression 来选择书籍元素。然而,第二部分中的代码添加了一个自定义排序例程,以按 ISBN 属性的属性值对结果进行排序。然后,该示例使用 FormatXml 函数和 XPathNodeIterator 显示得到的 XML。
XPathExpression 的 AddSort 方法支持一般排序功能,XSLT 处理器将该功能应用于节点集中的节点。该排序操作通过 IComparer 接口进行。该接口提供 Compare 方法的实现,该方法比较对象的数据类型。
// Create comparision class for the ISBN number ISBNCompare myISBNCompare = new ISBNCompare(); // Add a comparer to do a string compare on the ISBN number myXPathExpr.AddSort("@ISBN", (IComparer)myISBNCompare); myXPathNodeIterator = myXPathNavigator.Select (myXPathExpr); FormatXml(myXPathNodeIterator); |
||
C# | VB |
为了在示例的最后一部分演示通过 XSLT 参数进行排序,使用了一个自定义排序例程,该例程使用 XPathExpression 的 AddSort 方法实现新的 IComparer 例程。有了此自定义排序功能后,您就可以对用户定义的类进行排序了。这对于不方便进行比较的数据(如字符串)非常有用。
public class ISBNCompare : IComparer { public int Compare( Object First, Object Second ) { String s1 = (String) First; String s2 = (String) Second; //Console.WriteLine("ISBN's to Compare: 1. {0} 2. {1}", s1, s2); return s1.ToString().CompareTo (s2.ToString ()); } }// End class ISBNCompare |
||
C# | VB |
然后,该示例在 XPathDocument 上创建第二个 XPathNavigator,并将基于 XSLT 参数的排序添加到 XPathExpression。
XPathExpression 支持
// Create Second XPathNavigator XPathNavigator myXPathNavigator2 = myXPathDocument.CreateNavigator(); // Ensure we are at the root node myXPathNavigator2.MoveToRoot(); myXPathExpr = myXPathNavigator2.Compile(selectExpr); ... // Add an XSLT based sort myXPathExpr.AddSort("@publicationdate", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text); myXPathNodeIterator = myXPathNavigator2.Select (myXPathExpr); FormatXml(myXPathNodeIterator); |
||
C# | VB |
摘要
- 使用 XPathExpression 类编译 XPath 表达式来从 XML 文件中选择节点集。
- 使用 XPathNavigator 提供对 XPathDocument 的快速浏览。