Meu programa atual precisa usar programaticamente criar uma instância de XPathExpression para aplicar a XmlDocument. O XPath precisa usar algumas funções XPath como termina-com. No entanto, não consigo encontrar uma maneira de usar fins-de-com em XPath. Eu
Ele exceção lance como abaixo
Exceção não tratada: System.Xml.XPath.XPathException: Namespace Manager ou XsltC ONTEXTO necessário. Esta consulta tem um, variável, ou a função definida pelo utilizador prefixo.
em MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree () em System.Xml.XPath.XPathNavigator.Evaluate (expr XPathExpression, XPathNodeIt contexto Erator)
em System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr)
O código é assim:
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);
Tentei mudar o código para inserir XmlNamespaceManager ao compilar a expressão, como abaixo
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);
Ele falha em XPathExpression.Compile invocação:
Exceção não tratada: System.Xml.XPath.XPathException: XsltContext é necessária para esta consulta por causa de uma função desconhecida. em MS.Internal.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti no (cadeia de prefixo, nome da corda, XPathResultType [] ArgTypes) em MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext (contexto XsltContext) em MS.Internal.Xml. XPath.CompiledXpathExpr.SetContext (XmlNamespaceManager NSM anager) em System.Xml.XPath.XPathExpression.Compile (string XPath, IXmlNamespaceResolv er nsResolver)
Alguém sabe o truque para usar funções XPath off-the-shelf com XPathExpression.Compile? obrigado













