2012-07-06 103 views
0

我有这样的结果集,我从XML文件操纵/从LINQ的删除项目以XML结果集

calendarDocument = XDocument.Load(@"C:\CalendarDB.xml"); 
IEnumerable<XElement> elements = from e in calendarDocument.Root.Elements("Session") select e; 

加载未让说,我需要从日历文件删除元素。这会工作吗?

elements.ToList().Remove(someElement); 
calendarDocument.Save(@"C:\CalendarDB.xml"); 

这是怎么回事?

elements.ToList().Remove(someElement); 
elements.Last().AddAfterSelf(anotherElement); 
elements.Last().AddAfterSelf(yetAnotherElement); 
element.ToList().Remove(anotherElement); 
calendarDocument.Save(@"C:\CalendarDB.xml"); 

我,每次我打电话的感觉上次(),它返回一个新的结果直接设置在日历文件,但是当我打电话删除(),直到我把它保存不会从文件中删除元素(),如果在每次Remove()后不立即调用Save(),则对Last()的下一次调用将返回与之前相同的结果集,但仍包含已删除的元素。

有人可以告诉我这是如何工作的请。每次都需要在Remove()后每次调用Save()以获取Last()中的最新内容?

回答

0

您不得调用ToList,它会创建结果集的副本,因此从中删除不会影响原始文档。要从文档中移除元素,只需在元素本身调用Remove。例如:

XDocument doc = XDocument.Parse("<root><child>a</child><child>b</child></root>"); 

IEnumerable<XElement> children = doc.Root.Elements("child"); 

XElement elementToRemove = children.Last(); 
elementToRemove.Remove(); 

XElement newLastElement = children.Last(); 
Console.WriteLine(newLastElement.Value); 

children变量保存enumerable,它只是一个查询的定义。每次从它开始查询时,它都会重新启动查询并获得最新的结果。但是你从小孩重新开始。

没有必要以任何方式提交更改,它们会立即应用。只有当您想要将修改后的文档写回文件时,您才需要在文档上调用Save。