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

Dav*_*len 5 c# xpath parameter-passing

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

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

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

Dav*_*len 4

.net XPath 支持适用于 XPath 1.0。然而,有一种简单的方法来添加对变量的支持,您可以在 SQL select 调用上执行相当于 SetParameter() 调用的操作。这还支持您定义自己的函数,例如 matches()。(这是来自我的博客 - Windward Wrocks。)

\n\n

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

\n\n

您需要创建一个自定义 XsltContext。对此有两个很好的参考:.NET 中的不区分大小写的 XPath向 XPath 添加自定义函数

\n\n

XPathCustomContext.cs中的代码有详细记录且简单明了,因此我不打算在这里编写它。不过使用时有几点注意事项:

\n\n
    \n
  1. 更改前缀和命名空间值,这样您就不会在我们的命名空间上行走。
  2. \n
  3. 您将变量作为 $name 放入 XPath 中。您将其传递到 XsltArgumentList 中,并在 ResolveVariable 中将其作为名称(无 $)传递给您。
  4. \n
\n\n

这是重要的 \xe2\x80\x93 您必须使用 XpathExpressions 调用所有 Evaluate() 和 Select*() 调用,如下所示。如果您使用直接将 XPath 作为字符串传递的调用,您将收到一个异常,表明您正在使用未知函数。即使您传入自定义上下文,也会发生这种情况。

\n\n
private object SelectSingleNodeTyped(XPathNavigator nav, string select, XsltArgumentList parameters)\n{\nmyContext.ArgList = parameters;\nXPathExpression exp = nav.Compile(myXPathSelect);\nexp.SetContext(myContext);\nobject obj = nav.Evaluate(exp);\n
Run Code Online (Sandbox Code Playgroud)\n