Recipe 17.1 Reading and Accessing XML Datain Document Order
Problem
You need to read in all the elements of
an XML document and obtain information about each element, such as
its name and attributes.
Solution
Create an
XMLTextReader and use its Read
method to process the document:
using System;
using System.Xml;
// ...
public static void Indent(int level)
{
for (int i = 0; i < level; i++)
Console.Write(" ");
}
public static void AccessXML( )
{
string xmlFragment = "<?xml version='1.0'?>" +
"<!-- My sample XML -->" +
"<?pi myProcessingInstruction?>" +
"<Root>" +
"<Node1 nodeId='1'>First Node</Node1>" +
"<Node2 nodeId='2'>Second Node</Node2>" +
"<Node3 nodeId='3'>Third Node</Node3>" +
"</Root>";
XmlTextReader reader = new XmlTextReader(xmlFragment,
XmlNodeType.Element, null);
int level = 0;
while (reader.Read( ))
{
switch (reader.NodeType)
{
case XmlNodeType.CDATA:
Indent(level);
Console.WriteLine("CDATA: {0}", reader.Value);
break;
case XmlNodeType.Comment :
Indent(level);
Console.WriteLine("COMMENT: {0}", reader.Value);
break;
case XmlNodeType.DocumentType :
Indent(level);
Console.WriteLine("DOCTYPE: {0}={1}",
reader.Name, reader.Value);
break;
case XmlNodeType.Element :
Indent(level);
Console.WriteLine("ELEMENT: {0}", reader.Name);
level++;
while(reader.MoveToNextAttribute( ))
{
Indent(level);
Console.WriteLine("ATTRIBUTE: {0}='{1}'",
reader.Name, reader.Value);
}
break;
case XmlNodeType.EndElement :
level--;
break;
case XmlNodeType.EntityReference :
Indent(level);
Console.WriteLine("ENTITY: {0}", reader.Name);
break;
case XmlNodeType.ProcessingInstruction :
Indent(level);
Console.WriteLine("INSTRUCTION: {0}={1}",
reader.Name, reader.Value);
break;
case XmlNodeType.Text :
Indent(level);
Console.WriteLine("TEXT: {0}", reader.Value);
break;
case XmlNodeType.XmlDeclaration :
Indent(level);
Console.WriteLine("DECLARATION: {0}={1}",
reader.Name, reader.Value);
break;
}
}
reader.Close( );
}
This code dumps the XML document in a hierarchical format:
DECLARATION: xml=version='1.0'
COMMENT: My sample XML
INSTRUCTION: pi=myProcessingInstruction
ELEMENT: Root
ELEMENT: Node1
ATTRIBUTE: nodeId='1'
TEXT: First Node
ELEMENT: Node2
ATTRIBUTE: nodeId='2'
TEXT: Second Node
ELEMENT: Node3
ATTRIBUTE: nodeId='3'
TEXT: Third Node
Discussion
Reading existing XML and identifying different node types is one of
the fundamental actions that you will need to perform when dealing
with XML. The code in the Solution shows how to create an
XmlTextReader from either a string or from a
stream, and then iterate over the nodes while recreating the
formatted XML for output to the console window.
See Also
See the "XmlTextReader Class,"
"XmlNodeType Enumeration," and
"StringReader Class" topics in the
MSDN documentation.
|