Я знаю, как сделать 1-ю часть (я предполагаю, что вы можете использовать LINQ (т.е. иметь .NET 3.5 или выше), это просто вопрос использования некоторого XLINQ и связывания 2 событий Изменено / Изменено, как показано ниже.:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Collections.ObjectModel;
using System.Reactive.Linq;
namespace ConsoleApplication1
{
class Program
{
public static XDocument doc;
static void Main(string[] args)
{
doc = XDocument.Parse("<books><book>Gone with the wind</book></books>");
doc.Changed += Doc_Changed;
doc.Changing += Doc_Changing;
PrintResults();
XElement newElement = new XElement("book", "Treasure Island");
doc.Elements().First().Add(newElement);
newElement.Remove(); //remove this noe from parent
Console.ReadLine();
}
static void Doc_Changing(object sender, XObjectChangeEventArgs e)
{
PrintChangeResults(e);
}
static void Doc_Changed(object sender, XObjectChangeEventArgs e)
{
PrintChangeResults(e);
}
public static void PrintChangeResults(XObjectChangeEventArgs e)
{
Console.WriteLine(string.Format("Change was {0}, Document now has {1} elements",
e.ObjectChange, doc.Elements().First().Elements().Count()));
}
public static void PrintResults()
{
Console.WriteLine(string.Format("Document now has {0} elements",
doc.Elements().First().Elements().Count()));
}
}
}
, что приведет к чему-то вроде следующего вывода
В документе теперь есть 1 элемент. Изменение было добавлено, в документе теперь 1 элемент. Изменение было добавлено, в документе теперь есть 2 элемента. Изменение былоУдалить, у документа теперь есть 2 элемента. Изменения были удалены. У документа теперь есть 1 элемент
. Таким образом, вы получите 1/2 пути (при условии, что вы можете использовать LINQ)