Obsługa zdarzeń w dokumencie XML przy użyciu klasy XmlNodeChangedEventArgs
XmlNodeChangedEventArgs hermetyzuje argumenty przekazane do programów obsługi zdarzeń zarejestrowanych w obiekcie XmlDocument do obsługi zdarzeń. Zdarzenia i opis ich uruchomienia podano w poniższej tabeli.
Zdarzenie | Wyzwolono |
---|---|
NodeInserting | Gdy węzeł należący do bieżącego dokumentu ma zostać wstawiony do innego węzła. |
NodeInserted | Gdy węzeł należący do bieżącego dokumentu został wstawiony do innego węzła. |
NodeRemoving | Gdy węzeł należący do tego dokumentu zostanie usunięty z dokumentu. |
NodeRemoved | Gdy węzeł należący do tego dokumentu został usunięty z elementu nadrzędnego. |
NodeChanging | Gdy wartość węzła ma zostać zmieniona. |
NodeChanged | Gdy wartość węzła została zmieniona. |
Uwaga
Jeśli użycie pamięci XmlDataDocument jest w pełni zoptymalizowane pod kątem korzystania z magazynu DataSet, dokument XmlDataDocument może nie zgłaszać żadnego z zdarzeń wymienionych powyżej, gdy zmiany zostaną wprowadzone do bazowego zestawu danych. Jeśli potrzebujesz tych zdarzeń, musisz przejść przez cały element XmlDocument raz, aby użycie pamięci nie było w pełni zoptymalizowane.
Poniższy przykład kodu pokazuje, jak zdefiniować procedurę obsługi zdarzeń i jak dodać program obsługi zdarzeń do zdarzenia.
' Attach the event handler, NodeInsertedHandler, to the NodeInserted
' event.
Dim doc as XmlDocument = new XmlDocument()
Dim XmlNodeChgEHdlr as XmlNodeChangedEventHandler = new XmlNodeChangedEventHandler(addressof MyNodeChangedEvent)
AddHandler doc.NodeInserted, XmlNodeChgEHdlr
Dim n as XmlNode = doc.CreateElement( "element" )
Console.WriteLine( "Before Event Inserting" )
' This is the point where the new node is being inserted in the tree,
' and this is the point where the NodeInserted event is raised.
doc.AppendChild( n )
Console.WriteLine( "After Event Inserting" )
' Define the event handler that handles the NodeInserted event.
sub NodeInsertedHandler(src as Object, args as XmlNodeChangedEventArgs)
Console.WriteLine("Node " + args.Node.Name + " inserted!!")
end sub
// Attach the event handler, NodeInsertedHandler, to the NodeInserted
// event.
XmlDocument doc = new XmlDocument();
doc.NodeInserted += new XmlNodeChangedEventHandler(NodeInsertedHandler);
XmlNode n = doc.CreateElement( "element" );
Console.WriteLine( "Before Event Inserting" );
// This is the point where the new node is being inserted in the tree,
// and this is the point where the NodeInserted event is raised.
doc.AppendChild( n );
Console.WriteLine( "After Event Inserting" );
// Define the event handler that handles the NodeInserted event.
void NodeInsertedHandler(Object src, XmlNodeChangedEventArgs args)
{
Console.WriteLine("Node " + args.Node.Name + " inserted!!");
}
Niektóre operacje modelu DOM (XML Document Object Model) to złożone operacje, które mogą spowodować wyzwolenie wielu zdarzeń. Na przykład funkcja AppendChild może również wymagać usunięcia węzła dołączanego z poprzedniego elementu nadrzędnego. W takim przypadku najpierw zostanie wyzwolone zdarzenie NodeRemoved , a następnie zdarzenie NodeInserted . Operacje takie jak ustawienie InnerXml mogą powodować wiele zdarzeń.
Poniższy przykład kodu przedstawia tworzenie programu obsługi zdarzeń i obsługę zdarzenia NodeInserted .
Imports System
Imports System.IO
Imports System.Xml
Imports Microsoft.VisualBasic
Public Class Sample
Private Const filename As String = "books.xml"
Shared Sub Main()
Dim mySample As Sample = New Sample()
mySample.Run(filename)
End Sub
Public Sub Run(ByVal args As String)
' Create and load the XML document.
Console.WriteLine("Loading file 0 ...", args)
Dim doc As XmlDocument = New XmlDocument()
doc.Load(args)
' Create the event handlers.
Dim XmlNodeChgEHdlr As XmlNodeChangedEventHandler = New XmlNodeChangedEventHandler(AddressOf MyNodeChangedEvent)
Dim XmlNodeInsertEHdlr As XmlNodeChangedEventHandler = New XmlNodeChangedEventHandler(AddressOf MyNodeInsertedEvent)
AddHandler doc.NodeChanged, XmlNodeChgEHdlr
AddHandler doc.NodeInserted, XmlNodeInsertEHdlr
' Change the book price.
doc.DocumentElement.LastChild.InnerText = "5.95"
' Add a new element.
Dim newElem As XmlElement = doc.CreateElement("style")
newElem.InnerText = "hardcover"
doc.DocumentElement.AppendChild(newElem)
Console.WriteLine(Chr(13) + Chr(10) + "Display the modified XML...")
Console.WriteLine(doc.OuterXml)
End Sub
' Handle the NodeChanged event.
Public Sub MyNodeChangedEvent(ByVal src As Object, ByVal args As XmlNodeChangedEventArgs)
Console.Write("Node Changed Event: <0> changed", args.Node.Name)
If Not (args.Node.Value Is Nothing) Then
Console.WriteLine(" with value 0", args.Node.Value)
Else
Console.WriteLine("")
End If
End Sub
' Handle the NodeInserted event.
Public Sub MyNodeInsertedEvent(ByVal src As Object, ByVal args As XmlNodeChangedEventArgs)
Console.Write("Node Inserted Event: <0> inserted", args.Node.Name)
If Not (args.Node.Value Is Nothing) Then
Console.WriteLine(" with value 0", args.Node.Value)
Else
Console.WriteLine("")
End If
End Sub
End Class ' End class
using System;
using System.IO;
using System.Xml;
public class Sample
{
private const String filename = "books.xml";
public static void Main()
{
Sample mySample = new Sample();
mySample.Run(filename);
}
public void Run(String args)
{
// Create and load the XML document.
Console.WriteLine ("Loading file {0} ...", args);
XmlDocument doc = new XmlDocument();
doc.Load (args);
// Create the event handlers.
doc.NodeChanged += new XmlNodeChangedEventHandler(this.MyNodeChangedEvent);
doc.NodeInserted += new XmlNodeChangedEventHandler(this.MyNodeInsertedEvent);
// Change the book price.
doc.DocumentElement.LastChild.InnerText = "5.95";
// Add a new element.
XmlElement newElem = doc.CreateElement("style");
newElem.InnerText = "hardcover";
doc.DocumentElement.AppendChild(newElem);
Console.WriteLine("\r\nDisplay the modified XML...");
Console.WriteLine(doc.OuterXml);
}
// Handle the NodeChanged event.
public void MyNodeChangedEvent(Object src, XmlNodeChangedEventArgs args)
{
Console.Write("Node Changed Event: <{0}> changed", args.Node.Name);
if (args.Node.Value != null)
{
Console.WriteLine(" with value {0}", args.Node.Value);
}
else
Console.WriteLine("");
}
// Handle the NodeInserted event.
public void MyNodeInsertedEvent(Object src, XmlNodeChangedEventArgs args)
{
Console.Write("Node Inserted Event: <{0}> inserted", args.Node.Name);
if (args.Node.Value != null)
{
Console.WriteLine(" with value {0}", args.Node.Value);
}
else
Console.WriteLine("");
}
} // End class
Aby uzyskać więcej informacji, zobacz tematy XmlNodeChangedEventArgs oraz XmlNodeChangedEventHandler.