我的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>
答案 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"));
}