操作/删除Linq到Xml结果集中的项目

时间:2012-07-06 19:28:57

标签: linq-to-xml

我有一个从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");

我有一种感觉,每当我调用Last()时,它会直接从CALENDAR FILE返回一个新的结果集,但是当我调用Remove()时,它不会从文件中删除元素,直到我调用Save()并且我不会在每次Remove()之后立即调用Save()然后下一次调用Last()将返回与之前相同的结果集,仍然包含已删除的元素。

有人可以告诉我这是如何运作的。我是否需要每次在Remove()之后调用Save()才能从Last()中获取最新信息?

1 个答案:

答案 0 :(得分: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变量包含可枚举,这只是查询的定义。每次从它开始查询时,它都会重新启动查询,从而为您提供最新的结果。但你从孩子们开始桅杆。

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