LINQ to XML Events

LINQ to XML events enable you to be notified when an XML tree is altered.

You can add events to an instance of any XObject. The event handler will then receive events for modifications to that XObject and any of its descendants. For example, you can add an event handler to the root of the tree, and handle all modifications to the tree from that event handler.

For examples of LINQ to XML events, see Changing and Changed

Types and Events

You use the following types when working with events:


Type Description


Specifies the event type when an event is raised for an XObject.


Provides data for the Changing and Changed events.

The following events are raised when you modify an XML tree:


Event Description


Occurs just before this XObject or any of its descendants is going to change.


Occurs when an XObject has changed or any of its descendants have changed.



Events are useful when you want to maintain some aggregate information in an XML tree. For example, you may want maintain an invoice total that is the sum of the line items of the invoice. This example uses events to maintain the total of all of the child elements under the complex element Items.


XElement root = new XElement("Root",
    new XElement("Total", "0"),
    new XElement("Items")
XElement total = root.Element("Total");
XElement items = root.Element("Items");
items.Changed += (object sender, XObjectChangeEventArgs cea) =>
    switch (cea.ObjectChange)
        case XObjectChange.Add:
            if (sender is XElement)
                total.Value = ((int)total + (int)(XElement)sender).ToString();
            if (sender is XText)
                total.Value = ((int)total + (int)((XText)sender).Parent).ToString();
        case XObjectChange.Remove:
            if (sender is XElement)
                total.Value = ((int)total - (int)(XElement)sender).ToString();
            if (sender is XText)
                total.Value = ((int)total - Int32.Parse(((XText)sender).Value)).ToString();
    Console.WriteLine("Changed {0} {1}",
      sender.GetType().ToString(), cea.ObjectChange.ToString());
items.SetElementValue("Item1", 25);
items.SetElementValue("Item2", 50);
items.SetElementValue("Item2", 75);
items.SetElementValue("Item3", 133);
items.SetElementValue("Item1", null);
items.SetElementValue("Item4", 100);
Console.WriteLine("Total:{0}", (int)total);


This code produces the following output:

Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XText Remove
Changed System.Xml.Linq.XText Add
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XElement Remove
Changed System.Xml.Linq.XElement Add

See Also

Build Date: