Linq to xml for循环早期和意外终止

时间:2012-10-16 13:13:27

标签: c# .net xml linq linq-to-xml

我的linq到xml foreach循环正在提前和意外终止。没有例外。发生了什么事?


var doc = XDocument.Parse("<a><b>one</b><b>two</b></a>");

foreach(var element in doc.Root.Elements("b"))
{
 element.ReplaceWith(XElement.Parse("<c>fixed</c>"));
}

doc.Dump();

给我

<a>
  <c>fixed</c>
  <b>two</b>
</a>

当我预料到

<a>
  <c>fixed</c>
  <c>fixed</c>
</a>

1 个答案:

答案 0 :(得分:6)

  

我的linq到xml foreach循环正在提前和意外终止。发生了什么事?

当您在同一文档上迭代一个延迟评估的查询时,修改文档通常是个坏主意。在某些情况下它可能有效,但很难预测,我不知道这种行为是否有记录。 (想象一下,如果评估持有“当前”元素,并且每次都要求它的下一个兄弟元素 - 当从文档中删除元素时将不再有任何结果!)

如果您首先实现查询,它可以正常工作:

foreach(var element in doc.Root.Elements("b").ToList())
{
    // Removed the pointless XElement.Parse call; it's cleaner just to create
    // an element with the data you want.
    element.ReplaceWith(new XElement("c", "fixed"));
}