代码之家  ›  专栏  ›  技术社区  ›  user243901

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

  •  4
  • user243901  · 技术社区  · 14 年前

    我有以下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 回复  |  直到 12 年前
        1
  •  8
  •   Matt Ellen Bipin Vayalu    14 年前

    这很简单,当你知道怎么做的时候!

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

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

        2
  •  1
  •   adrianos    14 年前

    我不认为将两个同名节点包含在同一节点集中是个好主意。

    它可能有效,但我认为它会(更好?)这样两个不同的节点更简单:

    <smallImage></smallImage>

    <largeImage></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();
                    }
                }
    
    推荐文章