有没有一种方法可以在.net的XPath语句中传递参数/变量?

本文关键字:语句 XPath 参数 变量 net 一种 方法 有没有 | 更新日期: 2023-09-27 18:02:47

在c# XPath中是否有一种方法可以像SQL select一样传递参数?例如:

XPathExpression expr = nav.Compile("/root/employee[@name = @p1]");
expr.SetParameter ("@p1", "Smith");

然后处理所有转义,在其周围放置引号等?

有没有一种方法可以在.net的XPath语句中传递参数/变量?

.net XPath支持XPath 1.0。但是,有一种简单的方法可以添加对变量的支持,您可以在SQL选择调用中执行与SetParameter()调用相同的操作。这也为您提供了定义自己的函数的支持,比如matches()。(这是来自我的博客- Windward Wrocks。)

注意:我无法找到一种方法来添加对日期不等式的支持。如果有人知道如何添加这个,请告诉我。

您需要创建一个定制的XsltContext。这方面有两个很好的参考:. net中不区分大小写的XPath和向XPath添加自定义函数。

XPathCustomContext.cs中的代码有很好的文档记录并且很简单,所以我不打算在这里写它。但是,使用它时需要注意几点:

  1. 改变前缀和命名空间的值,这样你就不会走在我们的名称空间。
  2. 在XPath中放入一个变量作为$name。你把它传进去并在resolvvariable中把它传递给你name(没有$).

最重要的是—必须使用xpatheexpressions调用所有Evaluate()和Select*(),如下所示。如果使用直接以字符串形式传入XPath的调用,则会得到一个异常,表示正在使用未知函数。即使传入自定义上下文,也会发生这种情况。

private object SelectSingleNodeTyped(XPathNavigator nav, string select, XsltArgumentList parameters)
{
myContext.ArgList = parameters;
XPathExpression exp = nav.Compile(myXPathSelect);
exp.SetContext(myContext);
object obj = nav.Evaluate(exp);