C# 有没有办法创建一个Linq XElement迭代器,该迭代器会随着树的修改而更新?

C# 有没有办法创建一个Linq XElement迭代器,该迭代器会随着树的修改而更新?,c#,xml,linq,C#,Xml,Linq,我对C和Linq都是新手。我试图使用Linq生成的元素集合来迭代和修改XDocument中的某些元素。我的理解是,当更新树时,枚举不会更新 例如,给定文档 <root xmlns:ns="http://dummy"> <ns:a/> <ns:b/> <c/> <ns:a><ns:a/></ns:a> </root> 代码呢 XDocument doc = XDocument.Load(@"test_

我对C和Linq都是新手。我试图使用Linq生成的元素集合来迭代和修改XDocument中的某些元素。我的理解是,当更新树时,枚举不会更新

例如,给定文档

<root xmlns:ns="http://dummy">
<ns:a/>
<ns:b/>
<c/>
<ns:a><ns:a/></ns:a>
</root>
代码呢

XDocument doc = XDocument.Load(@"test_input.xml", LoadOptions.PreserveWhitespace);
XNamespace ns = "http://dummy";

IEnumerable<XElement> elem_list = from elem in doc.Descendants()
                                  where elem.Name.Namespace == ns
                                  select elem;

foreach (XElement elem in elem_list) {
   if (elem.Name.LocalName == "a") {
      elem.Remove();
   }
}
给出一个错误,因为我认为嵌套的a元素已从树中删除,但仍存在于elem_列表中


我该如何解决这个问题,记住1我想做的实际操作涉及到比上面示例更复杂的操作,即在树上复制,2我正在处理带有大量空白的混合内容?其他.Net XML文档类中是否有一个可以随着树的更改而更新的迭代方法?

通常,当集合更改时,枚举器无法继续运行。但是,如果对它们使用ToArray或ToList,则整个结果集合将位于静态列表中。然后,您可以枚举列表,将它们从文档中删除,而不是从列表中删除也无所谓

XDocument doc = XDocument.Load(@"test_input.xml", LoadOptions.PreserveWhitespace);
XNamespace ns = "http://dummy";

IEnumerable<XElement> elem_list = from elem in doc.Descendants()
                                  where elem.Name.Namespace == ns
                                  select elem;

XElement[] elem_array = elem_list.ToArray();

foreach (XElement elem in elem_array) {
   if (elem.Name.LocalName == "a") {
      elem.Remove();
   }
}