¿Cómo usar la función XPath en una instancia de XPathExpression programáticamente?

Mi progtwig actual necesita usar programáticamente crear una instancia de XPathExpression para aplicar a XmlDocument. El xpath necesita usar algunas funciones XPath como “ends-with”. Sin embargo, no puedo encontrar una forma de usar “ends-with” en XPath. yo

Tira una excepción como abajo

Excepción no controlada: System.Xml.XPath.XPathException: Namespace Manager o XsltC ontext needed. Esta consulta tiene un prefijo, variable o función definida por el usuario.
en MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree () en System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr, XPathNodeIt erator context)
en System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr)

El código es así:

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

Traté de cambiar el código para insertar XmlNamespaceManager al comstackr la expresión, como a continuación

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

Falla en la invocación de XPathExpression.Compile:

Excepción no controlada: System.Xml.XPath.XPathException: XsltContext es necesario para esta consulta debido a una función desconocida. en MS.Internal.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti on (String prefix, String name, XPathResultType [] ArgTypes) en MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext (XsltContext context) en MS.Internal.Xml. XPath.CompiledXpathExpr.SetContext (XmlNamespaceManager nsM anager) en System.Xml.XPath.XPathExpression.Compile (String xpath, IXmlNamespaceResolv er nsResolver)

¿Alguien conoce el truco para usar las funciones XPath estándar con XPathExpression.Compile? Gracias

La función ends-with() no está definida para XPath 1.0, sino solo para XPath 2.0 y XQuery .

Estás usando .NET. . NET en esta fecha no implementa XPath 2.0 , XSLT 2.0 o XQuery .

Uno puede construir fácilmente una expresión XPath 1.0, cuya evaluación produce el mismo resultado que la función ends-with() :

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

produce el mismo resultado booleano ( true() o false() ) como:

ends-with($str1, $str2)

En su caso concreto solo necesita sustituir las expresiones correctas por $str1 y $str2 . Son, en consecuencia, /myXml/data y 'World' .

Por lo tanto, la expresión XPath 1.0 que se usará, que es equivalente a la expresión XPath 2.0 ends-with(/myXml/data, 'World') es :

 'World' = substring(/myXml/data, string-length(/myXml/data) - string-length('World') +1 )