gpt4 book ai didi

c# - 如何以编程方式在 XPathExpression 实例中使用 XPath 函数?

转载 作者:数据小太阳 更新时间:2023-10-29 01:42:32 33 4
gpt4 key购买 nike

我当前的程序需要使用编程方式创建一个 XPathExpression 实例以应用于 XmlDocument。 xpath 需要使用一些 XPath 函数,如“ends-with”。但是,我找不到在 XPath 中使用“ends-with”的方法。我

抛出如下异常

Unhandled Exception: System.Xml.XPath.XPathException: Namespace Manager or XsltC ontext needed. This query has a prefix, variable, or user-defined function.
at MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree() at System.Xml.XPath.XPathNavigator.Evaluate(XPathExpression expr, XPathNodeIt erator context)
at 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 调用上失败:

Unhandled Exception: System.Xml.XPath.XPathException: XsltContext is needed for this query because of an unknown function. at MS.Internal.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti on(String prefix, String name, XPathResultType[] ArgTypes) at MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext(XsltContext context) at MS.Internal.Xml.XPath.CompiledXpathExpr.SetContext(XmlNamespaceManager nsM anager) at System.Xml.XPath.XPathExpression.Compile(String xpath, IXmlNamespaceResolv er nsResolver)

有人知道将现成的 XPath 函数与 XPathExpression.Compile 一起使用的诀窍吗?谢谢

最佳答案

函数 ends-with() 没有为 XPath 1.0 定义 但仅限XPath 2.0XQuery .

您正在使用 .NET。 .NET 在这个日期没有实现 XPath 2.0 , XSLT 2.0XQuery .

可以轻松构造一个 XPath 1.0 表达式,其计算结果与函数 ends-with() 相同:

$str2 = substring($str1, string-length($str1)- string-length($str2) +1)

产生相同的 bool 结果(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
)

关于c# - 如何以编程方式在 XPathExpression 实例中使用 XPath 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/402211/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com