XmlNodeChangedEventArgs による XML ドキュメントのイベント処理
イベント処理のために XmlDocument オブジェクトに登録されたイベント ハンドラーでは、渡された引数が XmlNodeChangedEventArgs によってカプセル化されます。 各イベントとその発生するタイミングを次の表に示します。
event | 発生するタイミング |
---|---|
NodeInserting | 現在のドキュメントに属するノードが別のノードに挿入されるとき。 |
NodeInserted | 現在のドキュメントに属するノードが別のノードに挿入されたとき。 |
NodeRemoving | このドキュメントに属するノードがドキュメントから削除されるとき。 |
NodeRemoved | このドキュメントに属するノードがその親から削除されたとき。 |
NodeChanging | ノードの値が変更されるとき。 |
NodeChanged | ノードの値が変更されたとき。 |
Note
XmlDataDocument のメモリの用途が DataSet ストレージの利用に完全に最適化されている場合は、基になる DataSet が変更された場合でも、XmlDataDocument では上に示したどのイベントも発生しない場合があります。 これらのイベントが必要な場合は、XmlDocument 全体を 1 回走査して、メモリ使用の最適化が完全でない状態にします。
イベント ハンドラーを定義する方法、およびイベント ハンドラーをイベントに追加する方法を次のコード サンプルに示します。
' 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!!");
}
XML ドキュメント オブジェクト モデル (DOM) の操作の中には、複数のイベントが発生する複合操作があります。 たとえば AppendChild では、追加されるノードを以前の親から削除する必要が生じることがあります。 この場合は、最初に NodeRemoved イベントが発生し、次に NodeInserted イベントが発生します。 InnerXml を設定する操作なども、複数のイベントが発生する結果になります。
イベント ハンドラーを作成する方法および 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
詳細については、次のトピックを参照してください。 XmlNodeChangedEventArgs および XmlNodeChangedEventHandler
関連項目
.NET