我当前的程序需要以编程方式创建一个 XPathExpression 实例以应用于 XmlDocument。xpath 需要使用一些 XPath 函数,例如“ends-with”。但是,我找不到在 XPath 中使用“ends-with”的方法。一世
它抛出如下异常
未处理的异常:System.Xml.XPath.XPathException:需要命名空间管理器或 XsltC ontext。此查询具有前缀、变量或用户定义的函数。
在 MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree() 在 System.Xml.XPath.XPathNavigator.Evaluate(XPathExpression expr, XPathNodeIt erator context)
在 System.Xml.XPath.XPathNavigator.Evaluate(XPathExpression expr)
代码是这样的:
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<myXml xmlns=""http://MyNamespace"" xmlns:fn=""http://www.w3.org/2005/xpath-functions"">
<data>Hello World</data>
</myXml>");
XPathNavigator navigator = xdoc.CreateNavigator();
XPathExpression xpr;
xpr = XPathExpression.Compile("fn:ends-with(/myXml/data, 'World')");
object result = navigator.Evaluate(xpr);
Console.WriteLine(result);
我尝试在编译表达式时更改代码以插入 XmlNamespaceManager,如下所示
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<myXml xmlns=""http://MyNamespace"" xmlns:fn=""http://www.w3.org/2005/xpath-functions"">
<data>Hello World</data>
</myXml>");
XPathNavigator navigator = xdoc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("fn", "http://www.w3.org/2005/xpath-functions");
XPathExpression xpr;
xpr = XPathExpression.Compile("fn:ends-with(/myXml/data, 'World')", nsmgr);
object result = navigator.Evaluate(xpr);
Console.WriteLine(result);
XPathExpression.Compile 调用失败:
未处理的异常:System.Xml.XPath.XPathException:由于未知函数,此查询需要 XsltContext。在 MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext(XsltContext context) 在 MS.Internal.Xml 的 MS.Internal.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti on(String prefix, String name, XPathResultType[] ArgTypes)。 XPath.CompiledXpathExpr.SetContext(XmlNamespaceManager nsManager) 在 System.Xml.XPath.XPathExpression.Compile(String xpath, IXmlNamespaceResolver nsResolver)
有人知道在 XPathExpression.Compile 中使用现成的 XPath 函数的技巧吗?谢谢