2014-02-05 6 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> 

Мне нужно получить значение URL CoverArt и ARTIST_BIOGRAPHY URL, поэтому мне нужно получить значение URL-адреса элемента, где атрибут TYPE = «COVERART» и значение URL-адреса элемента, где атрибут TYPE = «ARTIST_BIOGRAPHY», и я не могу понять, как это сделать (хотя я уверен, что это простой ответ ;-)

Я попытался как:

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, но для bio я получаю {«Последовательность не содержит соответствующего элемента»} \t System.Exception {System.InvalidOperationException}, и я знаю, что на самом деле есть био в наборе результатов. –

+0

Я проверил это с небольшим фрагментом xml, который вы предоставили, и это сработало для меня. Можете ли вы дважды проверить, что вы разместили правильный xml? –

+0

Спасибо Дэвиду - проблема была на моем конце - это был xml, что я кормил веб-сервис, который был испорчен. Спасибо за вашу помощь по этому поводу. –

Смежные вопросы