Comment utiliser XPath avec XElement ou LINQ?

Considérons le code XML suivant:

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

Je cherche un moyen très court pour obtenir juste la valeur de l’élément . J’ai essayé:

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

Mais ça ne marche pas. Est-il possible de fournir une requête XPath à un XElement ? Je peux le faire avec l’ancien framework System.Xml , en faisant quelque chose comme:

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

Y a-t-il quelque chose comme ça dans un espace de noms LINQ?


METTRE À JOUR:

Après m’être amusé un peu plus, j’ai trouvé un moyen de faire ce que j’essayais de faire:

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

Je serais toujours intéressé de voir si quelqu’un a une meilleure solution?

    Pour utiliser XPath avec LINQ to XML, ajoutez une déclaration using pour System.Xml.XPath , cela étendra les méthodes d’extension de System.Xml.XPath.Extensions .

    Dans votre exemple:

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

    D’autres ont tout à fait raisonnablement suggéré comment utiliser les requêtes LINQ to XML “natives” pour faire ce que vous voulez.

    Toutefois, pour offrir de nombreuses alternatives, considérez XPathSelectElement , XPathSelectElements et XPathEvaluate pour évaluer les expressions XPath par rapport à un XNode (ce sont toutes des méthodes d’extension sur XNode ). Vous pouvez également utiliser CreateNavigator pour créer un XPathNavigator pour un XNode .

    Personnellement, je suis un grand fan de l’utilisation directe de l’API LINQ to XML, car je suis un grand fan LINQ, mais si vous êtes plus à l’aise avec XPath, ce qui précède peut vous aider.

    Voir, en ce qui concerne LINQ to XML, pourquoi ne pas utiliser LINQ pour obtenir l’object réel.

    Les descendants trouvent chaque élément du XML complet et répertorie tous les objects correspondant au nom spécifié. Donc, dans votre cas, le hash est le nom qu’il trouve.

    Donc, plutôt que de faire

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

    Je me séparerais comme:

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

    De cette façon, vous pouvez également obtenir des atsortingbuts, des éléments de nœuds, etc.

    Consultez cet article pour en avoir une idée claire afin que cela aide. http://www.codeproject.com/KB/linq/LINQtoXML.aspx J’espère que cela vous aidera.

    Vous pouvez utiliser la méthode .Element () pour enchaîner les éléments afin de former une structure de type XPath.

    Pour votre exemple:

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

    J’ai essayé de créer un framework LINQesq pour générer xpath. Il vous permet de décrire xpath en utilisant les expressions 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); 

    Vous ne savez pas si cela est utile dans ce contexte, mais vous pouvez trouver de la documentation ici:

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