LINQ to XML-Ereignisse (C#)

Mit LINQ to XML-Ereignissen können Sie sich benachrichtigen lassen, wenn eine XML-Struktur geändert wird.

Sie können Ereignisse zu einer Instanz von jedem XObject hinzufügen. Der Ereignishandler empfängt dann Ereignisse für Änderungen an diesem XObject und dessen Nachfolgern. So können Sie z. B. dem Stamm der Struktur einen Ereignishandler hinzufügen und alle Änderungen an der Struktur von diesem Ereignishandler behandeln lassen.

Beispiele für LINQ to XML-Ereignisse finden Sie unter Changing und Changed.

Typen und Ereignisse

Beim Arbeiten mit Ereignissen stehen Ihnen die folgenden Typen zur Verfügung:

Typ Beschreibung
XObjectChange Gibt den Ereignistyp an, wenn ein Ereignis für ein XObject ausgelöst wird.
XObjectChangeEventArgs Stellt Daten für die Ereignisse Changing und Changed bereit.

Die folgenden Ereignisse werden ausgelöst, wenn Sie eine XML-Struktur ändern:

Ereignis Beschreibung
Changing Tritt ein, kurz bevor sich XObject oder eines seiner Nachfolger ändert.
Changed Tritt ein, wenn sich ein XObject oder eines seiner Nachfolger geändert hat.

Beispiel

Beschreibung

Ereignisse erweisen sich als nützlich, wenn aggregierte Informationen in einer XML-Struktur bereitgestellt werden sollen. So können Sie auf diese Weise z. B. einen Rechnungsgesamtbetrag bereitstellen, der sich aus der Summe der Einzelpositionen der Rechnung ergibt. Dieses Beispiel verwendet Ereignisse, um den Gesamtbetrag aller untergeordneten Elemente des komplexen Elements Items bereitzustellen:

Code

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();  
            break;  
        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();  
            break;  
    }  
    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);  
Console.WriteLine(root);  

Kommentare

Dieser Code erzeugt die folgende Ausgabe:

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  
Total:308  
<Root>  
  <Total>308</Total>  
  <Items>  
    <Item2>75</Item2>  
    <Item3>133</Item3>  
    <Item4>100</Item4>  
  </Items>  
</Root>  

Siehe auch

Advanced LINQ to XML Programming (C#) (Erweiterte LINQ to XML-Programmierung (C#))