C#XPath中是否有一种方法可以像SQL select一样传递参数?例如:
XPathExpression expr = nav.Compile("/root/employee[@name = @p1]");
expr.SetParameter ("@p1", "Smith");
然后它会处理所有逃脱,在它周围放置引号等等?
答案 0 :(得分:3)
.net XPath支持适用于XPath 1.0。但是,有一种简单的方法可以添加对变量的支持,您可以在SQL select选择调用上执行SetParameter()调用的等效操作。这也为您提供了定义自己的函数的支持,比如matches()。 (这是我的博客 - Windward Wrocks。)
注意:我无法找到在日期添加对不等式的支持的方法。如果有人知道添加这个的方法,请告诉我。
您需要创建自定义XsltContext。对此有两个很好的参考是Case-insensitive XPath in .NET和Adding Custom Functions to XPath。
XPathCustomContext.cs中的代码有很好的文档和简单,所以我不打算在这里写一下。但是在使用它时会有几个注意事项:
这就是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);