如何按属性名称排除Xml属性的更新

时间:2013-07-19 17:38:36

标签: c# xml linq

如果我有一个xml结构:

 <TablixMembers>
      <TablixMember>
        <Group Name="Group1" />
      </TablixMember>
 </TablixMembers>
...
 <TablixMembers>
      <TablixMember>
        <Group Name="Group1" />
      </TablixMember>
 </TablixMembers>
...
 <TablixMembers>
      <TablixMember>
        <Group Name="Details" />
      </TablixMember>
 </TablixMembers>
...

椭圆只代表文档中的其他代码。我想选择所有Group节点,除了一个Attributed as Details,并将它们的值更改为一些随机guid。

我试过以下

var groupName = from gn in report.Descendants(ns + "Group")
                                 where gn.Name != "Details"
                                 select gn;

    foreach (var name in groupName)
    {
       string randomName = GenerateUniqueName("Group");
       name.SetAttributeValue("Name",randomName);
    }

但是,当我运行代码时,所有节点属性最终都会使用随机名称进行更新。期望节点<Group Name="Details" />将从循环中排除。

我在select语句中缺少什么来排除包含Name = "Deatils"

的组节点

-cheers

1 个答案:

答案 0 :(得分:2)

您当前正在寻找元素的名称 - 它始终是Group(在任何名称空间中)。这就是XNode.Name属性返回的内容。您想要提取Name属性的

var groupName = from gn in report.Descendants(ns + "Group")
                where (string) gn.Attribute("Name") != "Details"
                select gn;

我个人不会使用查询表达式。我会用:

var groupName = report.Descendants(ns + "Group")
                      .Where(gn => (string) gn.Attribute("Name") != "Details");