read online leer examples example c# xml xpath namespaces

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



xpath xml (1)

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'' .

Entonces, la expresión XPath 1.0 para 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 )

Mi programa 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(@"<?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);

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

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

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