2014-02-05 87 views
1

我有一个XML文件,看起来像这样的价值在的XDocument读取值:需要基于属性

<RESPONSES> 
    <RESPONSE STATUS="OK"> 
     <ALBUM> 
      <URL TYPE="COVERART" SIZE="THUMBNAIL">http://akamai-b.cdn.cddbp.net/cds/2.0/cover/60AA/2DF9/B94B/72C8_thumbnail_front.jpg</URL> 
      <URL TYPE="ARTIST_BIOGRAPHY">http://web.content.cddbp.net/cds/2.0?id=6F64C8E01EA6253B&amp;client=10395648&amp;class=biography&amp;type=text/plain&amp;tag=02sq63myXqi8O9GLtyVrTB2Q0HTdtZEIU0LuGDlIoDRvQGTE2lkKnsdQ</URL> 
     </ALBUM> 
    </RESPONSE> 
<RESPONSES> 

我需要获得封面艺术网址和ARTIST_BIOGRAPHY URL的值,所以我需要获取属性TYPE =“COVERART”的元素URL的值和属性TYPE =“ARTIST_BIOGRAPHY”的元素URL的值,我无法弄清楚如何做到这一点(尽管我是相信这是一个简单的答案;-)

我都试过:

var albums = new List<Album>(); 
     try 
     { 
      albums = (from item in inputDoc.Descendants("ALBUM") 
       select new Album 
       { 
        Biography = (string)item.Element("URL").Attribute("TYPE"), 

    CoverArt = (string)item.Element("URL").Attribute("COVERART") 
       }).ToList(); 

也不给我什么我要找的。有人可以帮帮我吗!?

回答

0

您需要找到具有名为type的属性的元素,其值为“coverart”或“artist_biography”。你需要一个谓词此:

List<Album> albums = xDoc 
    .Root 
    .Descendants("ALBUM") 
    .Select(e => 
     new Album() 
     { 
      CoverArt = e 
       .Elements("URL") 
       .First(u => u.Attribute("TYPE").Value == "COVERART") 
       .Value 
       .ToString(), 
      ArtistBio = e 
       .Elements("URL") 
       .First(u => u.Attribute("TYPE").Value == "ARTIST_BIOGRAPHY") 
       .Value 
       .ToString() 
     } 
    ).ToList(); 

注意我通常都会有内声明在同一行,但在这里扩大了SO的可读性。

+0

谢谢大卫。这适用于coverart,但对于生物我得到{“序列不包含匹配的元素”} System.Exception {System.InvalidOperationException} {}}我知道结果集中实际上有一个生物。 –

+0

我用你提供的小型XML片段测试了它,它对我很有用。你可以仔细检查你张贴正确的XML? –

+0

感谢大卫 - 问题出在我的身上 - 这是我提供有缺陷的Web服务的XML。感谢您的帮助。 –