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

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

Он генерирует исключение, как показано ниже

Необработанное исключение: System.Xml.XPath.XPathException: требуется диспетчер пространства имен или текст XsltC. Этот запрос имеет префикс, переменную или определяемую пользователем функцию.
в MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree () в System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr, XPathNodeIt erator context) < br> в 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.Internal context.XsltContext.XsltContext. XPath.CompiledXpathExpr.SetContext (XmlNamespaceManager nsM anager) в System.Xml.XPath.XPathExpression.Compile (String xpath, IXmlNamespaceResolv er nsResolver)

Кто-нибудь знает, как использовать стандартные функции XPath с XPathExpression.Compile? Спасибо


person Morgan Cheng    schedule 31.12.2008    source источник


Ответы (1)


Функция _1 _ не определен для 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
             )
person Dimitre Novatchev    schedule 31.12.2008