Come utilizzare la funzione XPath in un'istanza XPathExpression a livello di codice?
-
03-07-2019 - |
Domanda
Il mio programma attuale deve utilizzare per creare in modo programmatico un'istanza XPathExpression da applicare a XmlDocument. L'xpath deve usare alcune funzioni XPath come " termina con " ;. Tuttavia, non riesco a trovare un modo per utilizzare " termina con " in XPath. I
Genera eccezioni come di seguito
Eccezione non gestita: System.Xml.XPath.XPathException: Namespace Manager o XsltC ontext necessario. Questa query ha un prefisso, variabile o funzione definita dall'utente.
a MS.Internal.Xml.XPath.CompiledXpathExpr.get_QueryTree () a System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression expr, contesto XPathNodeIt erator)
a System.Xml.XPath.XPathNavigator.Evaluate (XPathExpression espressione)
Il codice è così:
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);
Ho provato a cambiare il codice per inserire XmlNamespaceManager durante la compilazione dell'espressione, come di seguito
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);
Errore nell'invocazione di XPathExpression.Compile:
Eccezione non gestita: System.Xml.XPath.XPathException: XsltContext è necessario per questa query a causa di una funzione sconosciuta. a MS.Internal.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti on (prefisso stringa, nome stringa, XPathResultType [] ArgTypes) a MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext (XsltContext contesto) a MS.Internal.Xml.XPath.CompiledXpathExpr.SetContext (XmlNamespaceManager nsM anager) a System.Xml.XPath.XPathExpression.Compile (String xpath, IXmlNamespaceResolv er nsResolver)
Qualcuno conosce il trucco per usare le funzioni XPath standardizzate con XPathExpression.Compile? Grazie
Soluzione
La funzione < codice> termina con () non è definito per XPath 1.0 ma solo per XPath 2.0 e XQuery .
Stai utilizzando .NET. . NET a questa data non implementa XPath 2.0 , XSLT 2.0 o XQuery .
Si può facilmente costruire un'espressione XPath 1.0, la cui valutazione produce lo stesso risultato della funzione ends-with()
:
$ str2 = sottostringa ($ str1, lunghezza stringa ($ str1) - lunghezza stringa ($ str2) +1)
produce lo stesso risultato booleano ( true ()
o false ()
) di:
termina con ($ str1, $ str2)
Nel tuo caso concreto devi solo sostituire le espressioni giuste con $str1
e $str2
. Di conseguenza, sono /myXml/data
e 'World'
.
Quindi, l'espressione XPath 1.0 da usare, equivalente all'espressione XPath 2.0 termina con (/ myXml / data, 'World')
è :
'World' =
substring(/myXml/data,
string-length(/myXml/data) - string-length('World') +1
)