使用 linq to xml 选择具有给定属性的元素

发布于 2024-09-26 10:08:40 字数 507 浏览 1 评论 0原文

我有以下 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 };

如何在上面的查询中指定所需的图像属性(size=big)?

I've got following XML structure:

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

I need to select name and image with given attribute (size = big).

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

how can I specify needed image attribute(size=big) in query above?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

琴流音 2024-10-03 10:08:40

当您知道如何时,这非常简单!

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

这将返回所有艺术家的所有姓名和大图像。

It's quite simple when you know how!

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

This will return all the names and big images for all the artists.

可是我不能没有你 2024-10-03 10:08:40

我认为将两个具有相同名称的节点包含在同一节点集中并不是一个好主意。

它可能会有效,但我认为拥有两个不同的节点会(更好?)更简单,如下所示:

...

< ;/largeImage>

...

我能想到的最好的方法是使用 xsl 修改 xml,或者...

编辑 - 危险!丑陋的黑客 - 危险!

您可以使用循环修改节点名称。我敢打赌有一种更优雅的方法可以使用 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();
                }
            }

I don't think it is a good idea to have two nodes with the same name, contained within the same nodeset.

It might validate, but I think it would be (better?) simpler to have two distinct nodes like so:

...

<smallImage></smallImage>

<largeImage></largeImage>

...

The best I can think of is to modify the xml using xsl, or...

EDIT - DANGER! UGLY HACK - DANGER!

You could modify the node names using a loop. I bet there is a much more elegant way to do this using Linq-to-xml - but I couldn't quite manage it:

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();
                }
            }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文