Linq查询根据属性值选择所有节点

时间:2012-09-11 08:59:15

标签: c# linq-to-xml

<Category id=1>
<MyLines>
      <Line GroupID="0" Cache="15" />
  <Rect GroupID="0" Cache="16"/>
  <Ellipse GroupID="0" Cache="16"/>
</MyLines>

我的XML文档包含许多类别标记。你能告诉我什么是获取MyLines的每个子元素的最佳方法,其中Cache = 16并删除它们。

我希望使用linq实现这一目标。

我正在尝试如下:

       var q = from node in doc.Descendants("MyLines")
                let attr = node.Attribute("Cache")
                where attr != null && Convert.ToInt32(attr.Value) == 16
                select node;
        q.ToList().ForEach(x => x.Remove());

1 个答案:

答案 0 :(得分:2)

我测试了以下代码:

string xml = 
@"<Category id=""1"">
<MyLines>
    <Line GroupID=""0"" Cache=""15"" />
<Rect GroupID=""0"" Cache=""16""/>
<Ellipse GroupID=""0"" Cache=""16""/>
</MyLines>
</Category>";

void Main()
{
    var doc = XDocument.Parse(xml);

    doc.Descendants("MyLines")
    .Elements()
    .Where(el => el.Attribute("Cache").Value == "16") 
    .ToList()
    .ForEach(el => el.Remove());

    doc.Root.ToString().Dump();
}

打印:

<Category id="1">
   <MyLines>
      <Line GroupID="0" Cache="15" />
   </MyLines>
</Category>

问题是您在Cache元素而不是MyLines元素'子元素上寻找MyLines属性。