Проблема написания Linq2Xml Query - PullRequest
3 голосов
/ 16 апреля 2010

Я пытаюсь написать запрос Linq2XML для запроса следующего XML. Мне нужно, чтобы вернуть все фотографии для данного GalleryID.

<Albums>
<Album GalleryId="1" Cover="AlbumCover1.jpg" Title="Album 1">
    <Photos>
        <Photo Title="Image1" URL="img1.jpg" DateAdded="01/01/2010 09:20"/>
        <Photo Title="Image2" URL="img2.jpg" DateAdded="01/01/2010 09:20"/>
        <Photo Title="Image3" URL="img3.jpg" DateAdded="01/01/2010 09:20"/>
    </Photos>
</Album>
<Album GalleryId="2" Cover="AlbumCover1.jpg" Title="Album 2">
    <Photos>
        <Photo Title="Image1" URL="img1.jpg" DateAdded="01/01/2010 09:20"/>
        <Photo Title="Image2" URL="img2.jpg" DateAdded="01/01/2010 09:20"/>

    </Photos>
</Album>
</Albums>

Лучшее, что я придумал, это

 XDocument xmlDoc = XDocument.Load(GalleryFilePath);
                 var x = from c in xmlDoc.Descendants("Album")
                    where int.Parse(c.Attribute("GalleryId").Value) == GalleryId
                    orderby c.Attribute("Title").Value descending
                    select new
                    {
                        Title = c.Element("Photos").Element("Photo").Attribute("Title").Value,
                        URL = c.Element("Photos").Element("Photo").Attribute("URL").Value,
                        DateAdded = c.Element("Photos").Element("Photo").Attribute("DateAdded").Value
                    };

Это ничего не возвращает, я предполагаю, что это потому, что я говорю ему запросить элемент Album, а затем пытаюсь перебрать элементы фото. Какие-нибудь подсказки относительно того, как это должно быть сделано?

Спасибо

Редактировать: код обновлен с учетом ответов

1 Ответ

3 голосов
/ 16 апреля 2010

Распространенная ошибка - путать объект Attribute со значением. Вы должны использовать Attribute("x").Value, чтобы получить его значение.

Попробуйте этот исправленный код:

XDocument xmlDoc = XDocument.Load(GalleryFilePath);
var x = from c in xmlDoc.Descendants("Photo")
        where c.Parent.Parent.Attribute("GalleryId").Value.Equals(GalleryId)
        orderby c.Parent.Parent.Attribute("Title").Value descending
        select new
        {
            Title = c.Attribute("Title").Value,
            URL = c.Attribute("URL").Value,
            DateAdded = c.Attribute("DateAdded").Value
        };

[Обновить] Чтобы получить список фотографий, я установил элементы from и photo, а также местоположение альбома, которое на 2 уровня выше в предоставленном образце XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...