¿Cómo usar XPath con XElement o LINQ?

Considere el siguiente XML:

 200 OK  http://bit.ly/b47LVi b47LVi 9EJa3m http://www.tumblr.com/docs/en/api#api_write 0   

Estoy buscando una manera realmente corta de obtener solo el valor del elemento . Lo intenté:

 var hash = xml.Element("hash").Value; 

Pero eso no está funcionando. ¿Es posible proporcionar una consulta XPath a un XElement ? Puedo hacerlo con el viejo framework System.Xml , haciendo algo como:

 xml.Node("/response/data/hash").Value 

¿Hay algo así en un espacio de nombres LINQ?


ACTUALIZAR:

Después de molestarme con esto un poco más, encontré una manera de hacer lo que estoy tratando de hacer:

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

Todavía estaría interesado en ver si alguien tiene una mejor solución.

Para usar XPath con LINQ to XML, agregue una statement using para System.Xml.XPath , esto traerá los métodos de extensión de System.Xml.XPath.Extensions al scope.

En tu ejemplo:

 var value = (string)xml.XPathEvaluate("/response/data/hash"); 

Otros han sugerido razonablemente cómo usar LINQ “nativo” a consultas XML para hacer lo que desee.

Sin embargo, para proporcionar muchas alternativas, considere XPathSelectElement , XPathSelectElements y XPathEvaluate para evaluar expresiones XPath contra un XNode (todos son métodos de extensión en XNode ). También puede usar CreateNavigator para crear un XPathNavigator para un XNode .

Personalmente, soy un gran fan de usar LINQ to XML API directamente, ya que soy un gran fanático de LINQ, pero si te sientes más cómodo con XPath, lo anterior puede ayudarte.

Mira, cuando se trata de LINQ a XML, ¿por qué no usas LINQ para obtener el objeto real?

Los descendientes encuentran cada elemento del XML completo y enumeran todos los objetos que coinciden con el nombre especificado. Entonces, en su caso, hash es el nombre que encuentra.

Entonces, en lugar de hacer

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

Me separaría como:

 var elements = xml.Descendants("hash"); var hash = elements.FirstOrDefault(); if(hash != null) hash.Value // as hash can be null when default. 

De esta forma, también puedes obtener atributos, elementos de nodos, etc.

Verifique este artículo para obtener una idea clara al respecto para que sea útil. http://www.codeproject.com/KB/linq/LINQtoXML.aspx Espero que esto te ayude.

Puede usar el método .Element () para encadenar los elementos y formar una estructura tipo XPath.

Para tu ejemplo:

 XElement xml = XElement.Parse(@"...your xml..."); XElement hash = xml.Element("data").Element("hash"); 

He intentado crear un marco LINQesq para generar xpath. Te permite describir xpath usando expresiones c # lambda

 var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr"); var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text); 

No estoy seguro si esto es útil en este contexto, pero puede encontrar documentación aquí:

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq