Frage

Mein aktuelles Programm muß programmatisch verwenden, um eine XPathExpression Instanz erstellen, um XmlDocument anzuwenden. Der XPath braucht einige XPath-Funktionen zu verwenden, wie „ends-with“. Allerdings kann ich nicht einen Weg finden, „Enden-mit“ in XPath zu verwenden. I

Es wirft Ausnahme wie unten

  

Unbehandelte Ausnahme:   System.Xml.XPath.XPathException:   Namespace-Manager oder XSLTC ONTEXT   erforderlich. Diese Abfrage hat einen Präfix,   Variable oder benutzerdefinierte Funktion.
  beim   MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree ()   beim   System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression   ausdr, XPathNodeIt erator Kontext)
  beim   System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression   expr)

Der Code ist wie folgt:

    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);

Ich habe versucht, den Code zu ändern XmlNamespaceManager einzufügen, wenn die Expression kompilieren, wie unter

    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);

Es schlägt fehl, auf XPathExpression.Compile Aufruf:

  

Unbehandelte Ausnahme:   System.Xml.XPath.XPathException:   XsltContext ist für diese Abfrage benötigt   aufgrund einer unbekannten Funktion. beim   MS.Internal.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti   on (String prefix, String name,   XPathResultType [] argTypes) bei   MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext (XsltContext   Kontext) bei   MS.Internal.Xml.XPath.CompiledXpathExpr.SetContext (XmlNamespaceManager   nsM anager) bei   System.Xml.XPath.XPathExpression.Compile (String   XPath, IXmlNamespaceResolv er   nsResolver)

Weiß jemand den Trick off-the-shelf zu verwenden XPath-Funktionen mit XPathExpression.Compile? Dank

War es hilfreich?

Lösung

Die Funktion ends-with() ist nicht definiert für XPath 1.0 aber nur für XPath 2.0 und XQuery .

Sie verwenden .NET. . NET zu diesem Zeitpunkt nicht implementiert XPath 2.0 , XSLT 2.0 oder XQuery .

Man kann sich leicht ein XPath 1.0 Expressionskonstrukts, die Auswertung von denen das gleiche Ergebnis wie die Funktion ends-with() :

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

erzeugt das gleiche boolean Ergebnis (true() oder false()) als:

ends-with($str1, $str2)

In Ihrem konkreten Fall brauchen Sie nur die richtige Ausdrücke für $str1 und $str2 zu ersetzen. Sie sind dementsprechend /myXml/data und 'World' .

der XPath 1.0 Ausdruck Also, zu verwenden, das entspricht den XPath 2.0-Ausdruck ends-with(/myXml/data, 'World') ist :

'World' = 
   substring(/myXml/data,
             string-length(/myXml/data) - string-length('World') +1
             )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top