Eventi LINQ to XML
Gli eventi LINQ to XML consentono di ricevere una notifica quando una struttura ad albero XML viene modificata.
È possibile aggiungere eventi a un'istanza di qualsiasi oggetto XObject.Il gestore eventi riceverà quindi gli eventi relativi alle modifiche apportate a XObject e a tutti i relativi discendenti.Ad esempio, è possibile aggiungere un gestore eventi alla radice della struttura ad albero e gestire tutte le modifiche apportate alla struttura da tale gestore.
Per esempi di eventi LINQ to XML, vedere Changing e Changed.
Tipi ed eventi
Con gli eventi è possibile utilizzare i tipi seguenti:
Tipo |
Descrizione |
---|---|
Specifica il tipo di evento quando viene generato un evento per un oggetto XObject. |
|
Gli eventi seguenti vengono generati quando si modifica una struttura ad albero XML:
Evento |
Descrizione |
---|---|
Si verifica poco prima che l'oggetto XObject o uno qualsiasi dei relativi discendenti venga modificato. |
|
Si verifica quando un oggetto XObject o uno qualsiasi dei relativi discendenti viene modificato. |
Esempio
Descrizione
Gli eventi sono utili quando si desidera gestire alcune informazioni di aggregazione in una struttura ad albero XML.Ad esempio, si desidera gestire un totale di fattura che corrisponde alla somma delle voci della fattura.In questo esempio vengono utilizzati gli eventi per gestire il totale di tutti gli elementi figlio sotto l'elemento Items complesso.
Codice
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);
Module Module1
Dim WithEvents items As XElement = Nothing
Dim total As XElement = Nothing
Dim root As XElement = _
<Root>
<Total>0</Total>
<Items></Items>
</Root>
Private Sub XObjectChanged( _
ByVal sender As Object, _
ByVal cea As XObjectChangeEventArgs) _
Handles items.Changed
Select Case cea.ObjectChange
Case XObjectChange.Add
If sender.GetType() Is GetType(XElement) Then
total.Value = CStr(CInt(total.Value) + _
CInt((DirectCast(sender, XElement)).Value))
End If
If sender.GetType() Is GetType(XText) Then
total.Value = CStr(CInt(total.Value) + _
CInt((DirectCast(sender, XText)).Value))
End If
Case XObjectChange.Remove
If sender.GetType() Is GetType(XElement) Then
total.Value = CStr(CInt(total.Value) - _
CInt((DirectCast(sender, XElement)).Value))
End If
If sender.GetType() Is GetType(XText) Then
total.Value = CStr(CInt(total.Value) - _
CInt((DirectCast(sender, XText)).Value))
End If
End Select
Console.WriteLine("Changed {0} {1}", _
sender.GetType().ToString(), _
cea.ObjectChange.ToString())
End Sub
Sub Main()
total = root.<Total>(0)
items = root.<Items>(0)
items.SetElementValue("Item1", 25)
items.SetElementValue("Item2", 50)
items.SetElementValue("Item2", 75)
items.SetElementValue("Item3", 133)
items.SetElementValue("Item1", Nothing)
items.SetElementValue("Item4", 100)
Console.WriteLine("Total:{0}", CInt(total))
Console.WriteLine(root)
End Sub
End Module
Commenti
L'output del codice è il seguente:
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>