Linq to XML de la sélection d'un nœud sur la base d'une valeur d'attribut
J'ai un fichier xml qui retourne un ensemble d'éléments qui sont uniques par une valeur d'attribut. Cela pose un problème, que je ne peux pas sélectionner un nœud par son nom:
<doc>
<float name="score">1.2873721</float>
<arr name="2_category">
<long>3021</long>
</arr>
<arr name="ATR_FamilyName">
<str>Some Cookbook </str>
</arr>
<arr name="ATR_IsFamily">
<str>0</str>
</arr>
<arr name="ATR_SellPrice">
<str>49.95</str>
</arr>
<arr name="ATR_VendorId">
<str>ABC</str>
</arr>
<arr name="ATR_VendorName">
<str>WROX</str>
</arr>
</doc>
Je suis à l'aide de linq pour remplir un "Produit" de la classe. Je suis en mesure de sélectionner les éléments en position, cependant cela devient un problème si le nœud n'existe pas. Est-il un moyen pour sélectionner un nœud basée sur la valeur de ses attributs? Dans l'exemple ci-dessous, puis-je obtenir de l'arr nœud si l' @attribut name = "ATR_FamilyName"? Dans xpath:
doc/arr[@name = 'ATR_FamilyName']/str
voici ma requête linq to xml:
var query = from rt in results
where (String)rt.Descendants().ElementAt(5).Element("str").Value == "0"
select new Product.Product
{
FamilyName = (String)rt.Descendants().ElementAt(3).Value
//doc/arr[@name = 'ATR_FamilyName']/str - select Family Name is arr/@name 'ATR_FamilyName'
MorePropertiestoset....
};
OriginalL'auteur PhillyNJ | 2011-10-25
Vous devez vous connecter pour publier un commentaire.
COMME-CII réponse, mais sans l'aide de l'expression de la requête (à l'exception de celui de l'extérieur), et avec la fonte pour
XAttribute
, et en sélectionnant lastr
valeur de l'élément à l'intérieur d'un type anonyme:De noter que l'utilisation d'un moule pour le résultat de l'appel à
Attribute("name")
signifie que s'il y a des éléments qui ne pas ont l'attribut, le casting aura pour résultat une référence null (ce qui n'est pas égale à la chaîne de caractères littérale). Si vous utilisez leValue
de la propriété, vous aurez une exception. Parfois, une exception peut être mieux si cela indique que les données sont fondamentalement en panne et vous souhaitez trouver de sujet plutôt que de simplement ne pas correspondre à la valeur.(La même chose est vraie pour le casting de la
XElement
àstring
.)Merci pour l'explication sur le casting, Jon. J'ai été en cours d'exécution dans des situations où tous les nœuds eu l'attribut et il a été lancer une exception parce que j'ai utilisé .Valeur au lieu de la fonte; cette fidex.
OriginalL'auteur Jon Skeet
Avec LINQ, vous pouvez facilement sélectionner les nœuds qui ont un attribut spécifié, comme ceci:
OriginalL'auteur as-cii
Utilisation
XElement
comme ceci:Désolé pour le typage de téléphone cellulaire
OriginalL'auteur whoisthis