LINQ

2012-06-11 8 views
9
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 ?? ""); 

ile belli özellik ad ve değer ile bir XElement bulun ama eleman özniteliği ile "görüntü" "size = large" değerini istiyorum, ben bütün gece arıyordum ve bu en yakın olan Ben geldim: XML yanıtı kısmınınLINQ

comm.Parameters.AddWithValue("LargeImage", 
    elm.Descendants("image") 
     .FirstOrDefault(i => (string)i.Attribute("size") == "large").Value); 

Örnek:

<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> 
+0

Yani, sorun ne kullanabiliriz? Bu iyi görünüyor, ama elm'in ne olduğuna bağlı. (XDocument'den elm'e nasıl geldiğini göstermiyorsun). – HackedByChinese

+0

Bu özniteliğe sahip öğe bulunamadığında "NullReferenceException" alırsınız. Somereason için – MarcinJuraszek

cevap

25

deneyin

XElement result = elm.Descendants("image") 
    .FirstOrDefault(el => el.Attribute("size") != null && 
         el.Attribute("size").Value == "large"); 
if (result != null) { 
    process result.Value ... 
} 
C# 6.0 (VS 2015) ile başlayan

yazabilirsiniz:

XElement result = elm.Descendants("image") 
    .FirstOrDefault(el => el.Attribute("size")?.Value == "large"); 
if (result != null) { 
    process result.Value ... 
} 

olmayan bir bariz bir alternatif (@RandRandom belirttiği gibi) olduğu string için Özellik döküm için:

XElement result = elm.Descendants("image") 
    .FirstOrDefault(el => (string)el.Attribute("size") == "large"); 
if (result != null) { 
    process result.Value ... 
} 

Bu, çünkü XAttribute Explicit Conversion (XAttribute to String) nedeniyle çalışır.

+0

ilk başta çalışmıyordu, şimdi harika çalışıyor! –

+1

? .Value veya .Value yerine şu şekilde yazabilirsiniz: (string) el.Attribute ("size") == "büyük" (tüm sürümlerde çalışır) –

11

Eğer XPathSelectElement extension method

var node = elm.XPathSelectElement("descendant::image[@size='large']"); 
if (node!=null) 
{ 
    var path = node.Value; 
} 
+1

+1. Basit bir çözüm. –

+1

Harika cevap !. Test edilmiş ve .NET Core/.NET Standard 1.6 için de çalışıyor! –