Как программно использовать функцию XPath в экземпляре XPathExpression?

В моей текущей программе необходимо программно создать экземпляр 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? Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
18 441
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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
             )

Другие вопросы по теме