Wie programmatisch XPath-Funktion in einer XPathExpression Instanz benutzen?
-
03-07-2019 - |
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
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
)