Recipe 17.1 Reading and Accessing XML Datain Document OrderProblemYou need to read in all the elements of an XML document and obtain information about each element, such as its name and attributes. SolutionCreate 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 DiscussionReading 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 AlsoSee the "XmlTextReader Class," "XmlNodeType Enumeration," and "StringReader Class" topics in the MSDN documentation. |