有没有办法在.NET中的XPath语句中传递参数/变量?

时间:2011-07-19 01:37:39

标签: c# xpath parameter-passing

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

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

然后它会处理所有逃脱,在它周围放置引号等等?

1 个答案:

答案 0 :(得分:3)

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

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

您需要创建自定义XsltContext。对此有两个很好的参考是Case-insensitive XPath in .NETAdding Custom Functions to XPath

XPathCustomContext.cs中的代码有很好的文档和简单,所以我不打算在这里写一下。但是在使用它时会有几个注意事项:

  1. 更改前缀和命名空间值,这样您就不会走在我们的上面 命名空间。
  2. 您将XPath中的变量设置为$ name。你传了进来 XsltArgumentList并在ResolveVariable中传递给你 名字(没有$)。
  3. 这就是biggie - 您必须使用XpathExpressions调用所有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);