0

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() を呼び出すたびに、新しい結果セットがカレンダーファイルから直接返される気がしますが、Remove() を呼び出すと、Save() を呼び出すまでファイルから要素が削除されず、呼び出さない場合各 Remove() の直後に Save() を実行すると、次に Last() を呼び出すと、以前と同じ結果セットが返されますが、削除された要素はまだ含まれています。

誰かがこれがどのように機能するか教えてください。Last() から最新のものを取得するために、毎回 Remove() の後に Save() を呼び出す必要がありますか?

4

1 に答える 1

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 変数は列挙可能を保持しますが、これは単なるクエリの定義です。そこからクエリを開始するたびに、クエリが再起動されるため、最新の結果が得られます。しかし、あなたは子供からやり直さなければなりません。

変更をコミットする必要はありません。変更はすぐに適用されます。変更したドキュメントをファイルに書き戻したい場合にのみ、ドキュメントに対して Save を呼び出す必要があります。

于 2012-07-07T06:53:49.457 に答える