XmlNodeReader Events
System.Xml
Class:
XmlNodeReader
Summary
The XmlNodeReader
class in the System.Xml
namespace provides a way to read an XML document as a sequence of XmlNodeType
nodes. While XmlNodeReader
itself does not expose events in the traditional sense (like event handlers you attach), its behavior is fundamentally event-driven, processing the XML structure node by node. Understanding its event-like traversal is key to its effective use.
Key Concepts & Event-Driven Nature
The "events" of XmlNodeReader
refer to the discrete states and transitions it undergoes as it navigates the XML document. Each call to methods like Read()
triggers a move to the next node, effectively firing a "node read" event. You then inspect the properties of the reader (e.g., NodeType
, Name
, Value
) to react to this event.
Consider the following implicit events and their corresponding reader properties:
Node Event Node Read
Triggered by: Calling the Read()
method.
Represents the transition to a new node in the XML document. After this event, you can inspect the current node's details.
bool Read();
Node Event Node Type Identified
Triggered by: After Read()
, the NodeType
property is populated.
Indicates the type of the current node (e.g., Element
, Attribute
, Text
, Comment
). This is the primary way to understand what kind of data you've encountered.
System.Xml.XmlNodeType NodeType { get; }
Node Event Node Name Available
Triggered by: After Read()
, for nodes that have names (elements, attributes, etc.).
Provides the qualified name of the current node. This is crucial for identifying specific elements or attributes.
string Name { get; }
Node Event Node Value Determined
Triggered by: After Read()
, for nodes that have values (text, attributes, comments, etc.).
Returns the value of the current node. For element nodes, this typically returns an empty string unless it contains mixed content.
string Value { get; }
Node Event Depth Change
Triggered by: Navigating into or out of element nodes.
Indicates the current depth within the XML document structure. The root is at depth 0.
int Depth { get; }
Example Usage (Simulating Event Handling)
The following C# code demonstrates how to process the XML document by treating each call to Read()
as an event and reacting to the node type:
using System;
using System.Xml;
public class XmlNodeReaderEventsExample
{
public static void ProcessXml(XmlNode node)
{
// Create an XmlNodeReader from an XmlNode
using (XmlNodeReader reader = new XmlNodeReader(node))
{
Console.WriteLine("Starting XML traversal...");
// Loop while there are more nodes to read
while (reader.Read())
{
// Simulate reacting to different node "events"
switch (reader.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine($"Event: Element '{reader.Name}' encountered at depth {reader.Depth}");
// If it's an element, check for attributes
if (reader.HasAttributes)
{
while (reader.MoveToNextAttribute())
{
Console.WriteLine($" - Attribute '{reader.Name}' = '{reader.Value}'");
}
// Move back to the element node
reader.MoveToElement();
}
break;
case XmlNodeType.Text:
Console.WriteLine($"Event: Text node found: '{reader.Value}'");
break;
case XmlNodeType.Attribute:
// This case is typically handled when iterating through HasAttributes
// but included for completeness if not using MoveToNextAttribute
Console.WriteLine($"Event: Attribute '{reader.Name}' = '{reader.Value}'");
break;
case XmlNodeType.Comment:
Console.WriteLine($"Event: Comment found: '{reader.Value}'");
break;
case XmlNodeType.XmlDeclaration:
Console.WriteLine($"Event: XML Declaration encountered.");
break;
case XmlNodeType.DocumentType:
Console.WriteLine($"Event: Document Type declaration found.");
break;
case XmlNodeType.EndElement:
Console.WriteLine($"Event: End of element '{reader.Name}' reached at depth {reader.Depth}");
break;
case XmlNodeType.None:
// Typically before the first read or after the last node
break;
default:
Console.WriteLine($"Event: Other node type '{reader.NodeType}' encountered.");
break;
}
}
Console.WriteLine("XML traversal complete.");
}
}
// Example of how to create an XmlNode and call the process method
public static void Main(string[] args)
{
string xmlString = @"
Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications with XML.
Ralls, Kim
Midnight Rain
Fantasy
5.95
2000-12-16
A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.
";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
ProcessXml(doc);
}
}