如何以编程方式在 XPathExpression 实例中使用 XPath 函数?
Posted
技术标签:
【中文标题】如何以编程方式在 XPathExpression 实例中使用 XPath 函数?【英文标题】:How to use XPath function in a XPathExpression instance programatically? 【发布时间】:2010-09-28 23:14:44 【问题描述】:我当前的程序需要以编程方式创建一个 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 运行器上下文) 在 System.Xml.XPath.XPathNavigator.Evaluate(XPathExpression 表达式)
代码是这样的:
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.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti on(字符串前缀,字符串名称, XPathResultType[] ArgTypes) 在 MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext(XsltContext 上下文)在 MS.Internal.Xml.XPath.CompiledXpathExpr.SetContext(XmlNamespaceManager nsM 经理)在 System.Xml.XPath.XPathExpression.Compile(字符串 xpath, IXmlNamespaceResolver nsResolver)
有人知道在 XPathExpression.Compile 中使用现成的 XPath 函数的技巧吗? 谢谢
【问题讨论】:
【参考方案1】:函数 ends-with()
没有为XPath 1.0定义 只为XPath 2.0和XQuery定义。
您正在使用 .NET。 .NET 目前尚未实现 XPath 2.0、XSLT 2.0 或 XQuery。
可以很容易地构造一个 XPath 1.0 表达式,其计算结果与函数 ends-with()
:
$str2 = substring($str1, string-length($str1)- string-length($str2) +1)
产生与以下相同的布尔结果(true()
或 false()
):
ends-with($str1, $str2)
在您的具体情况下,您只需将正确的表达式替换为 $str1
和 $str2
。因此,它们是 /myXml/data
和 'World'
。
所以,要使用的 XPath 1.0 表达式,即等效于 XPath 2.0 表达式ends-with(/myXml/data, 'World')
是:
'World' =
substring(/myXml/data,
string-length(/myXml/data) - string-length('World') +1
)
【讨论】:
以上是关于如何以编程方式在 XPathExpression 实例中使用 XPath 函数?的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?
Android 编程:如何以网格方式以编程方式创建各种视图类型