Выберите элемент с заданным атрибутом, используя linq to xml - PullRequest
4 голосов
/ 08 октября 2010

У меня следующая структура XML:

<artists>
    <artist> 
        <name></name> 
        <image size="small"></image> 
        <image size="big"></image> 
    </artist>
</artists>

Мне нужно выбрать имя и изображение с заданным атрибутом (размер = большой).

var q = from c in feed.Descendants("artist")
        select new { name = c.Element("name").Value, 
                     imgUrl = c.Element("image").Value };

как мне указать необходимыеатрибут изображения (размер = большой) в запросе выше?

Ответы [ 2 ]

8 голосов
/ 08 октября 2010

Это довольно просто, когда вы знаете, как!

var artistsAndImage = from a in feed.Descendants("artist")
                      from img in a.Elements("image")
                      where img.Attribute("size").Value == "big"
                      select new { Name = a.Element("Name").Value
                                 , Image = img.Value};

Это вернет все имена и большие изображения для всех художников.

1 голос
/ 08 октября 2010

Я не думаю, что это хорошая идея, чтобы два узла с одинаковым именем содержались в одном и том же наборе узлов.

Это может быть подтверждено, но я думаю, что было бы (лучше?) Проще иметь два разных узла, например:

...

<smallImage></smallImage>

<largeImage></largeImage>

...

Лучшее, что я могу придумать, - это изменить xml, используя xsl, или ...

РЕДАКТИРОВАТЬ - ОПАСНОСТЬ! Гадкий взлом - ОПАСНОСТЬ!

Вы можете изменить имена узлов, используя цикл. Могу поспорить, что есть намного более элегантный способ сделать это с помощью Linq-to-xml - но я не мог справиться с этим:

foreach(XElement xe in feed.Descendants("artist").Elements())
            {
                if(xe.Name.LocalName.Equals("image") && xe.Attribute("size").Value.Equals("small"))
                {
                    xe.Name="smallImage";
                    xe.Attributes("size").Remove();
                }

                if (xe.Name.LocalName.Equals("image") && xe.Attribute("size").Value.Equals("big"))
                {
                    xe.Name = "bigImage";
                    xe.Attributes("size").Remove();
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...