Comment utiliser XPath avec XElement ou LINQ?
-
30-09-2019 - |
Question
Considérez le code XML suivant:
<response>
<status_code>200</status_code>
<status_txt>OK</status_txt>
<data>
<url>http://bit.ly/b47LVi</url>
<hash>b47LVi</hash>
<global_hash>9EJa3m</global_hash>
<long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
<new_hash>0</new_hash>
</data>
</response>
Je suis à la recherche d'un moyen très court pour obtenir juste la valeur de l'élément <hash>
. J'ai essayé:
var hash = xml.Element("hash").Value;
Mais qui ne fonctionne pas. Est-il possible de fournir une requête XPath à un XElement
? Je peux le faire avec le cadre de System.Xml
plus, faire quelque chose comme:
xml.Node("/response/data/hash").Value
Y at-il quelque chose comme ceci dans un espace de noms LINQ?
Mise à jour:
Après monkeying autour de ce peu plus j'ai trouvé un moyen de faire ce que je suis en train de faire:
var hash = xml.Descendants("hash").FirstOrDefault().Value;
Je reste curieux de voir si quelqu'un a une meilleure solution?
La solution
Pour utiliser XPath avec LINQ to XML ajouter une déclaration à l'aide pour System.Xml.XPath
, cela apportera les méthodes d'extension de System.Xml.XPath.Extensions
dans le périmètre.
Dans votre exemple:
var value = (string)xml.XPathEvaluate("/response/data/hash");
Autres conseils
D'autres ont tout à fait raisonnablement suggéré comment utiliser LINQ « natif » aux requêtes XML pour faire ce que vous voulez.
Cependant, dans l'intérêt de fournir beaucoup d'alternatives, pensez XPathSelectElement
, XPathSelectElements
et XPathEvaluate
pour évaluer les expressions XPath contre un XNode
(ils sont toutes les 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 d'utiliser l'API LINQ XML directement, comme je suis un grand fan de LINQ, mais si vous êtes plus à l'aise avec XPath, ce qui précède peut vous aider.
Voir, en traitant avec LINQ to XML pourquoi ne pas utiliser LINQ pour obtenir l'objet réel.
Les descendants trouvent chaque élément du XML entier et énumère tous les objets qui correspond au nom spécifié. Donc, dans votre hachage de cas est le nom qu'elle trouve.
Alors, plutôt que de faire
var hash = xml.Descendants("hash").FirstOrDefault().Value;
Je se briserait 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 attributs, des nœuds éléments, etc.
Vérifiez cet article pour obtenir une idée claire à ce sujet afin qu'il aide. http://www.codeproject.com/KB/linq/LINQtoXML.aspx J'espère que cela t'aidera.
On peut utiliser la méthode .Elément () pour les éléments de chaîne pour former la structure de type XPath.
Pour votre exemple:
XElement xml = XElement.Parse(@"...your xml...");
XElement hash = xml.Element("data").Element("hash");
J'ai essayé de trouver un cadre de LINQesq pour générer XPath. Il vous permet de décrire XPath en utilisant des 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);
Je ne sais pas si cela est utile dans ce contexte, mais vous pouvez trouver de la documentation ici:
http://www.syntaxsuccess.com/viewarticle/ comment à créer XPath utilisant-LINQ