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

Моя текущая программа должна использовать программное создание экземпляра XPathExpression для применения к XmlDocument. Xpath должен использовать некоторые функции XPath, такие как «end-with». Однако я не могу найти способ использовать «end-with» в XPath. я

Это исключение, как показано ниже

Необработанное исключение: System.Xml.XPath.XPathException: необходим диспетчер пространств имен или XsltC. Этот запрос имеет префикс, переменную или пользовательскую функцию.
в MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree () в System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr, XPathNodeIt).
в System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr)

Код выглядит так:

XmlDocument xdoc = new XmlDocument(); xdoc.LoadXml(@"  Hello World "); 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(@"  Hello World "); 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 (префикс String, имя строки, XPathResultType [] ArgTypes) в MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext (контекст XsltContext) в MS.Internal.Xml. XPath.CompiledXpathExpr.SetContext (XmlNamespaceManager nsM anager) в 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 ) 
  • Как игнорировать пространство имен при выборе узлов XML с помощью XPath
  • Как правильно использовать пространства имен в C ++?
  • Без имени / анонимных пространств имен или статических функций
  • как игнорировать пространства имен с XPath
  • Как я могу получить все classы в пространстве имен?
  • Поддерживает ли C # проектное пространство имён по умолчанию, как VB.NET?
  • Почему включение «использования пространства имен» в файл заголовка - плохая идея на C ++?
  • Как я могу «отключить» пространство имен?
  • имя не существует в пространстве имен clr-namespace
  • Почему «использование пространства имен X» не допускается внутри уровня classа / структуры?
  • Поиск всех пространств имен в сборке с использованием Reflection (DotNET)
  • Interesting Posts

    В чем разница между связанными типами данных SQLite, такими как INT, INTEGER, SMALLINT и TINYINT?

    AppFabric: не удалось связаться с службой кеша

    Как получить доступ к BIOS на ноутбуке ASUS?

    Создание файлов Excel из C # без офиса

    PowerShell IE9 ComObject имеет все свойства null после перехода на веб-страницу

    Продолжение задачи в streamе пользовательского интерфейса

    Как читать и писать регистры x86 флаги напрямую?

    Запретить добавление приложений для запуска экрана при установке

    LibreOffice Calc: Как получить общее количество для HH: MM: SS-ячейки

    Массовая деинсталляция

    Добавление платы контроллера PCI Express SATA 6 Гбит / с?

    Укажите личный SSH-ключ для использования при выполнении команды оболочки?

    Gradle не находит tools.jar

    Есть ли выбранная вкладка Измененное событие в стандартном WPF Tab Control

    Получение ошибки при попытке настроить общие папки на экземпляре Ubuntu VMWare Fusion, работающем на OSX

    Давайте будем гением компьютера.