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

È stato utile?

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
             )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top