Trouver un XElement avec un certain nom de l'attribut et la valeur avec LINQ
XDocument xDocument = XDocument.Load("...");
IEnumerable<XElement> elements = xDocument
.Element("lfm")
.Element("events")
.Elements("event");
try
{
foreach (XElement elm in elements)
{
comm.Parameters.AddWithValue("extID", elm.Element("id").Value ?? "");
comm.Parameters.AddWithValue("Title", elm.Element("title").Value ?? "");
comm.Parameters.AddWithValue("HeadlineArtist",
elm.Element("artists").Element("headliner").Value ?? "");
mais je veux que la valeur de l'élément "image" avec l'attribut "taille=grand", j'ai cherché toute la nuit, et c'est le plus proche que je suis venu:
comm.Parameters.AddWithValue("LargeImage",
elm.Descendants("image")
.FirstOrDefault(i => (string)i.Attribute("size") == "large").Value);
Échantillon de la partie de la réponse XML:
<lfm status="ok">
<events xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
location="Chicago, United States" page="1" perPage="1"
totalPages="341" total="341" festivalsonly="0" tag="">
<event xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<id>3264699</id>
<title>Iron And Wine</title>
<artists>
<artist>Iron And Wine</artist>
<artist>Dr. John</artist>
<headliner>Iron And Wine</headliner>
</artists>
<venue>
<id>8915382</id>
<name>Ravinia Festival</name>
<location>
<city>Highland Park</city>
<country>United States</country>
<street>200 Ravinia Park Rd</street>
<postalcode>60035</postalcode>
<geo:point>
<geo:lat>42.15831</geo:lat>
<geo:long>-87.778409</geo:long>
</geo:point>
</location>
<url>http://www.last.fm/venue/8915382+Ravinia+Festival</url>
<website>http://www.ravinia.org/</website>
<phonenumber>847.266.5100</phonenumber>
<image size="small">http://userserve-ak.last.fm/serve/34/63026487.jpg</image>
<image size="medium">http://userserve-ak.last.fm/serve/64/63026487.jpg</image>
<image size="large">http://userserve-ak.last.fm/serve/126/63026487.jpg</image>
<image size="extralarge">http://userserve-ak.last.fm/serve/252/63026487.jpg</image>
Alors, quel est le problème? Qui semble très bien, mais cela dépend de ce
Vous obtiendrez
elm
est (vous n'avez pas à vous montrer comment obtenu à partir de xDocument de l'orme).Vous obtiendrez
NullReferenceException
lorsque aucun élément avec l'attribut correspondant est trouvé.OriginalL'auteur Scott Selby | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
Essayer
À partir de C#6.0 (VS 2015), vous pouvez écrire:
Une non-solution évidente (comme @RandRandom souligné), c'est placer l'Attribut
string
:Cela fonctionne, parce que parce que de XAttribute Conversion Explicite (XAttribute à la Chaîne).
Au lieu de ?.Valeur ou .Valeur pour commencer, vous pouvez l'écrire comme ceci: (string)el.Attribut("taille") == "gros" (fonctionne dans toutes les Versions)
OriginalL'auteur Olivier Jacot-Descombes
vous pouvez utiliser XPathSelectElement méthode d'extension
Incroyable de réponse!. Testé et fonctionne pour .NET/de Base.NET Standard 1.6 trop!
OriginalL'auteur Damith