В моей текущей программе необходимо программно создать экземпляр XPathExpression для применения к XmlDocument. Xpath должен использовать некоторые функции XPath, такие как «заканчивается на». Однако я не могу найти способ использовать "заканчивается на" в XPath. я
Он генерирует исключение, как показано ниже
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.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
)