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