Como usar a função XPath em uma instância de XPathExpression programaticamente?

votos
9

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

Publicado 31/12/2008 em 04:12
fonte usuário
Em outras línguas...                            


1 respostas

votos
32

A função não é definida por XPath 1.0 , mas somente para o XPath 2.0 e Xquery .ends-with()

Você está usando .NET. . NET nesta data não implementar XPath 2.0 , XSLT 2.0 ou XQuery .

Pode-se construir facilmente uma expressão XPath 1.0, a avaliação de que produz o mesmo resultado que a função ends-with():

$str2 = substring($str1, string-length($str1)- string-length($str2) +1)

produz o mesmo resultado booleano ( true()ou false()) como:

ends-with($str1, $str2)

No seu caso concreto, você só precisa substituir as expressões certas para $str1e $str2. Eles são, em conformidade, /myXml/datae 'World'.

Assim, a expressão XPath 1,0 a usar, que é equivalente ao XPath 2.0 expressão ends-with(/myXml/data, 'World')é :

'World' = 
   substring(/myXml/data,
             string-length(/myXml/data) - string-length('World') +1
             )
Respondeu 31/12/2008 em 06:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more