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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top