需要根据属性的值读取XDocument中的值

时间:2014-02-05 20:03:39

标签: xml c#-4.0 linq-to-xml

我有一个xml文档,如下所示:

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

我需要获取COVERART URL和ARTIST_BIOGRAPHY URL的值,因此我需要获取属性TYPE =“COVERART”的元素URL的值以及属性TYPE =“的元素URL的值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();

并没有给我我正在寻找的东西。有人可以帮帮我!?

1 个答案:

答案 0 :(得分: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上进行了扩展。