Recipe 17.1 Reading and Accessing XML Datain Document Order

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.



C# Cookbook
C# 3.0 Cookbook
ISBN: 059651610X
EAN: 2147483647
Year: 2003
Pages: 315

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net