在C#XPath中是否有一種方法可以像使用SQL select一樣傳遞參數?例如:有沒有辦法在.NET中的XPath語句中傳遞參數/變量?
XPathExpression expr = nav.Compile("/root/employee[@name = @p1]");
expr.SetParameter ("@p1", "Smith");
那麼它會在哪裏處理所有的轉義,在它周圍引號等等?
在C#XPath中是否有一種方法可以像使用SQL select一樣傳遞參數?例如:有沒有辦法在.NET中的XPath語句中傳遞參數/變量?
XPathExpression expr = nav.Compile("/root/employee[@name = @p1]");
expr.SetParameter ("@p1", "Smith");
那麼它會在哪裏處理所有的轉義,在它周圍引號等等?
.net XPath支持用於XPath 1.0。但是,有一種簡單的方法可以添加對變量的支持,您可以在SQL select調用上執行SetParameter()調用的等價調用。這也支持您定義自己的函數,比如match()。 (這是從我的博客 - 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);