Blue Theme Orange Theme Green Theme Red Theme
 
6 Months Free & No Setup Fees ASP.NET Hosting!
Home | Forums | Videos | Advertise | Certifications | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
6 Months Free & No Setup Fees ASP.NET Hosting!
Search :       Advanced Search »
Home » XML in C# » Reading and Wtiting XML Documents

Reading and Wtiting XML Documents

In this article you will see how to read and write XML documents using XML API available in .NET Framework class library.

Author Rank :
Page Views : 38703
Downloads : 0
Rating :
 Rate it
Level : Beginner
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
 
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor
Team Foundation Server Hosting
Become a Sponsor
 Tag Cloud
 Latest Jobs
More ... 
 Latest Interview Questions
More ... 

In this article you will see how to read and write XML documents in Microsoft .NET using C# language.  First I will discuss XML .NET Framework Library namespace and classes in brief. Then we will read and write XML documents. At the end of this article, I will show you how to take advantage of ADO.NET and XML .NET model to read and write XML documents from relational databases and vice versa.

Introduction to Microsoft .NET XML Namespaces and Classes

Before start working with XML document in .NET Framework, It is important to know about .NET namespace and classes provided by .NET Runtime Library. .NET provides five namespace - System.Xml, System.Xml.Schema, System.Xml.Serialization, System.Xml.XPath, and System.Xml.Xsl to support XML classes. 

The System.Xml namespace contains major XML classes. This namespace contains many classes to read and write XML documents. In this article, we are going to concentrate on reader and write class. These reader and writer classes are used to read and write XMl documents. These classes are - XmlReader, XmlTextReader, XmlValidatingReader, XmlNodeReader, XmlWriter, and XmlTextWriter. As you can see there are four reader and two writer classes. 

The XmlReader class is an abstract bases classes and contains methods and properties to read a document. The Read method reads a node in the stream. Besides reading functionality, this class also contains methods to navigate through a document nodes. Some of these methods are MoveToAttribute, MoveToFirstAttribute, MoveToContent, MoveToFirstContent, MoveToElement and  MoveToNextAttribute. ReadString, ReadInnerXml, ReadOuterXml, and ReadStartElement are more read methods. This class also has a method Skip to skip current node and move to next one. We'll see these methods in our sample example. 

The XmlTextReader, XmlNodeReader and XmlValidatingReader classes are derived from XmlReader class. As their name explains, they are used to read text, node, and schemas.

The XmlWrite class contains functionality to write data to XML documents. This class provides many write method to write XML document items. This class is base class for XmlTextWriter class, which we'll be using in our sample example. 

The XmlNode class plays an important role. Although, this class represents a single node of XML but that could be the root node of an XML document and could represent the entire file. This class is an abstract base class for many useful classes for inserting, removing, and replacing nodes, navigating through the document. It also contains properties to get a parent or child, name, last child, node type and more. Three major classes derived from XmlNode are XmlDocument, XmlDataDocument and XmlDocumentFragment. XmlDocument class represents an XML document and provides methods and properties to load and save a document. It also provides functionality to add XML items such as attributes, comments, spaces, elements, and new nodes. The Load and LoadXml methods can be used to load XML documents and Save method to save a document respectively. XmlDocumentFragment class represents a document fragment, which can be used to add to a document. The XmlDataDocument class provides methods and properties to work with ADO.NET data set objects.

In spite of above discussed classes, System.Xml namespace contains more classes. Few of them are XmlConvert, XmlLinkedNode, and XmlNodeList. 

Next namespace in Xml series is System.Xml.Schema. It classes  to work with XML schemas such XmlSchema, XmlSchemaAll, XmlSchemaXPath, XmlSchemaType. 

The System.Xml.Serialization namespace contains classes that are used to serialize objects into XML format documents or streams. 

The System.Xml.XPath Namespce contains XPath related classes to use XPath specifications. This namespace has following classes  - XPathDocument, XPathExression, XPathNavigator, and XPathNodeIterator. With the help of XpathDocument, XpathNavigator provides a fast navigation though XML documents. This class contains many Move methods to move through a document. 

The System.Xml.Xsl namespace contains classes to work with XSL/T transformations.

Reading XML Documents

In my sample application, I'm using books.xml to read and display its data through XmlTextReader. This file comes with VS.NET samples. You can search this on your machine and change the path of the file in the following line: 

XmlTextReader textReader  = new XmlTextReader("C:\\books.xml"); 

Or you can use any XML file. 

The XmlTextReader, XmlNodeReader and XmlValidatingReader classes are derived from XmlReader class. Besides XmlReader methods and properties, these classes also contain members to read text, node, and schemas respectively. I am using XmlTextReader class to read an XML file. You read a file by passing file name as a parameter in constructor. 

XmlTextReader textReader  = new XmlTextReader("C:\\books.xml"); 

After creating an instance of XmlTextReader, you call Read method to start reading the document. After read method is called, you can read all information and data stored in a document. XmlReader class has properties such as Name, BaseURI, Depth, LineNumber an so on.

List 1 reads a document and displays a node information using these properties.

 

About Sample Example 1

In this sample example, I read an XML file using XmlTextReader and call Read method to read its node one by one until end of file and display the contents to the console output. 

Sample Example 1.

using System;
using
System.Xml; 

namespace ReadXml1
{
   
class Class1
   
{
       
static void Main(string[] args)
       
{
            
// Create an isntance of XmlTextReader and call Read method to read the file
           
XmlTextReader textReader  = new XmlTextReader("C:\\books.xml");
           
textReader.Read();
            // If the node has value
           
while (textReader.Read()  )
           
{
               
// Move to fist element
               
textReader.MoveToElement();
               
Console.WriteLine("XmlTextReader Properties Test");
               
Console.WriteLine("==================="); 

                // Read this element's properties and display them on console
               
Console.WriteLine("Name:" + textReader.Name);
               
Console.WriteLine("Base URI:" + textReader.BaseURI);
               
Console.WriteLine("Local Name:" + textReader.LocalName);
               
Console.WriteLine("Attribute Count:" + textReader.AttributeCount.ToString());
               
Console.WriteLine("Depth:" + textReader.Depth.ToString());
               
Console.WriteLine("Line Number:" + textReader.LineNumber.ToString());
               
Console.WriteLine("Node Type:" + textReader.NodeType.ToString());
               
Console.WriteLine("Attribute Count:" + textReader.Value.ToString());
           
}
       
}
   
}
               

}

The NodeType property of XmlTextReader is important when you want to know the content type of a document. The XmlNodeType enumeration has a member for each type of XML item such as Attribute, CDATA, Element, Comment, Document, DocumentType, Entity, ProcessInstruction, WhiteSpace and so on.

List 2 code sample reads an XML document, finds a node type and writes information at the end with how many node types a document has. 

About Sample Example 2

In this sample example, I read an XML file using XmlTextReader and call Read method to read its node one by one until end of file. After reading a node, I check its NodeType property to find the node and write node contents to the console and keep track of number of particular type of nodes. At the end, I display total number of different types of nodes in the document.

Sample Example 2.

using System;
using
System.Xml; 

namespace ReadingXML2
{
   
class Class1
   
{
       
static void Main(string[] args)
       
{
            int ws = 0;
           
int pi = 0;
           
int dc = 0;
           
int cc = 0;
           
int ac = 0;
           
int et = 0;
           
int el = 0;
           
int xd = 0; 

            // Read a document
           
XmlTextReader textReader  = new XmlTextReader("C:\\books.xml");
 

            // Read until end of file
            
while (textReader.Read())
           
{
               
XmlNodeType nType = textReader.NodeType;

                // If node type us a declaration
               
if (nType == XmlNodeType.XmlDeclaration)
               
{
                   
Console.WriteLine("Declaration:" + textReader.Name.ToString());
                   
xd = xd + 1;
               
}
           

                // if node type is a comment
               
if( nType == XmlNodeType.Comment)
               
{
                  
 Console.WriteLine("Comment:" + textReader.Name.ToString());
                   
cc = cc + 1;
               
}
           

                // if node type us an attribute
               
if( nType == XmlNodeType.Attribute)
               
{
            
       Console.WriteLine("Attribute:" + textReader.Name.ToString());
                   
ac = ac + 1;
               

                // if node type is an element
               
if ( nType == XmlNodeType.Element)
               
{
                   
Console.WriteLine("Element:" + textReader.Name.ToString());
                   
el = el + 1;
               

                // if node type is an entity\
               
if ( nType == XmlNodeType.Entity )
               
{
                   
Console.WriteLine("Entity:" + textReader.Name.ToString());
                   
et = et + 1;
               
}
           

                // if node type is a Process Instruction
               
if( nType == XmlNodeType.Entity )
               
{
                
   Console.WriteLine("Entity:" + textReader.Name.ToString());

                    pi = pi + 1;
               
}
       

                // if node type a document
               
if( nType == XmlNodeType.DocumentType)
               
{
                 
  Console.WriteLine("Document:" + textReader.Name.ToString());
                   
dc = dc + 1;
               

                // if node type is white space
               
if ( nType == XmlNodeType.Whitespace )
               
{
                   
Console.WriteLine("WhiteSpace:" + textReader.Name.ToString());
                   
ws = ws + 1;
               
}
           

            // Write the summary
           
Console.WriteLine("Total Comments:" + cc.ToString());
           
Console.WriteLine("Total Attributes:" + ac.ToString());
           
Console.WriteLine("Total Elements:" + el.ToString());
           
Console.WriteLine("Total Entity:" + et.ToString());
           
Console.WriteLine("Total Process Instructions:" + pi.ToString());
            
Console.WriteLine("Total Declaration:" + xd.ToString());
           
Console.WriteLine("Total DocumentType:" + dc.ToString());
           
Console.WriteLine("Total WhiteSpaces:" + ws.ToString()); 

        }
   
}
}

 

Writing XML Documents

The XmlWriter class contains the functionality to write to XML documents. It is an abstract base class used through XmlTextWriter and XmlNodeWriter classes. It contains methods and properties to write to XML documents. This class has many Writexxx method to write every type of item of an XML document. For example, WriteNode, WriteString, WriteAttributes, WriteStartElement, and WriteEndElement are some of them. Some of these methods are used in a start and end pair. For example, to write an element, you need to call WriteStartElement then write a string followed by WriteEndElement.               

Besides many methods, this class has three properties. WriteState, XmlLang, and XmlSpace. The WriteState gets and sets the state of the XmlWriter class. 

Although it's not possible to describe all the Writexxx methods here, let's see some of them here.

First thing we need to do is create an instance of XmlTextWriter using its constructor. XmlTextWriter has three overloaded constructors, which can take a string, stream, or a TextWriter as an argument. We'll pass a string (file name) as an argument, which we're going to create. In my sample example, I create a file myXmlFile.xml in C:\\ dir. 

// Create a new file in C:\\ dir

XmlTextWriter textWriter = New XmlTextWriter("C:\\myXmFile.xml", null) ;

After creating an instance, first thing you call us WriterStartDocument. When you're done writing, you call WriteEndDocument and TextWriter's Close method.

 

 textWriter.WriteStartDocument();

 

.........

 

textWriter.WriteEndDocument();

textWriter.Close();

The WriteStartDocument and WriteEndDocument methods open and close a document for writing. You must have to open a document before start writing to it.  WriteComment method writes comment to a document. It takes only one string type of argument. WriteString method writes a string to a document. With the help of WriteString, WriteStartElement and WriteEndElement methods pair can be used to write an element to a document. The WriteStartAttribute and WriteEndAttribute pair writes an attribute.

WriteNode is more write method, which writes an XmlReader to a document as a node of the document. For example, you can use WriteProcessingInstruction and WriteDocType methods to write a ProcessingInstruction and DocType items of a document. 

//Write the ProcessingInstruction node

string PI= "type='text/xsl' href='book.xsl'"

textWriter.WriteProcessingInstruction("xml-stylesheet", PI);

//'Write the DocumentType node

textWriter.WriteDocType("book", Nothing, Nothing, "<!ENTITY h 'softcover'>"); 

The below sample example summarizes all these methods and creates a new xml document with some items in it such as elements, attributes, strings, comments and so on. See Listing 5-14. In this sample example, we create a new xml file c:\xmlWriterText.xml. In this sample example, We create a new xml file c:\xmlWriterTest.xml using XmlTextWriter: 

After that we add comments and elements to the document using Writexxx methods. After that we read our books.xml xml file using XmlTextReader and add its elements to xmlWriterTest.xml using XmlTextWriter.

About Sample Example 3 

In this sample example, I create a new file myxmlFile.xml using XmlTextWriter and use its various write methods to write XML items. 

Sample Example 3.

using System;
using
System.Xml; 

 

namespace ReadingXML2
{
   
class Class1
   
{
       
static void Main(string[] args)
       

            // Create a new file in C:\\ dir
           
XmlTextWriter textWriter = new XmlTextWriter("C:\\myXmFile.xml", null);
             // Opens the document 
           
textWriter.WriteStartDocument(); 

            // Write comments
           
textWriter.WriteComment("First Comment XmlTextWriter Sample Example");
           
textWriter.WriteComment("myXmlFile.xml in root dir"); 

            // Write first element
           
textWriter.WriteStartElement("Student");
           
textWriter.WriteStartElement("r", "RECORD", "urn:record"); 

            // Write next element
           
textWriter.WriteStartElement("Name", "");
           
textWriter.WriteString("Student");
           
textWriter.WriteEndElement(); 

            // Write one more element
           
textWriter.WriteStartElement("Address", "");
           
textWriter.WriteString("Colony");
           
textWriter.WriteEndElement(); 

             // WriteChars

            char [] ch = new char[3];
           
ch[0] = 'a';
           
ch[1] = 'r';
           
ch[2] = 'c';
           

            textWriter.WriteStartElement("Char");
           
textWriter.WriteChars(ch, 0, ch.Length);
           
textWriter.WriteEndElement(); 

            // Ends the document.
           
textWriter.WriteEndDocument();

            // close writer
           
textWriter.Close();

        }
   
}
}

Using XmlDocument

The XmlDocument class represents an XML document. This class provides similar methods and properties we've discussed earlier in this article. 

Load and LoadXml are two useful methods of this class. A Load method loads XML data from a string, stream, TextReader or XmlReader. LoadXml method loads XML document from a specified string. Another useful method of this class is Save. Using Save method you can write XML data to a string, stream, TextWriter or XmlWriter.

About Sample Example 4

This tiny sample example pretty easy to understand. We call LoadXml method of XmlDocument to load an XML fragment and call Save to save the fragment as an XML file. 

Sample Example 4. 

//Create the XmlDocument.
XmlDocument doc = new XmlDocument();
doc.LoadXml(("<Student type='regular' Section='B'><Name>Tommy Lex</Name></Student>")); 

//Save the document to a file.
doc.Save("C:\\std.xml");
 

You can also use Save method to display contents on console if you pass Console.Out as a parameter. For example: 

  doc.Save(Console.Out); 

About Sample Example 5 

Here is one example of how to load an XML document using XmlTextReader. In this sample example, we read books.xml file using XmlTextReader and call its Read method. After that we call XmlDocumetn's Load method to load XmlTextReader contents to XmlDocument and call Save method to save the document. Passing Console.Out as a Save method argument displays data on the console

Sample Example 5. 

XmlDocument doc = new XmlDocument();
//Load the the document with the last book node.

XmlTextReader reader = new XmlTextReader("c:\\books.xml");
reader.Read();
      

// load reader 
doc.Load(reader);

// Display contents on the console

doc.Save(Console.Out);
 

Writing Data from a database to an XML Document

Using XML and ADO.NET mode, reading a database and writing to an XML document and vice versa is not a big deal. In this section of this article, you will see how to read a database table's data and write the contents to an XML document. 

The DataSet class provides method to read a relational database table and write this table to an XML file. You use WriteXml method to write a dataset data to an XML file.  

In this sample example, I have used commonly used Northwind database comes with Office 2000 and later versions. You can use any database you want. Only thing you need to do is just chapter the connection string and SELECT SQ L query. 

About Sample Example 6 

 In this sample, I reate a data adapter object and selects all records of Customers table. After that I can fill method to fill a dataset from the data adapter. 

In this sample example, I have used OldDb data provides. You need to add reference to the Syste.Data.OldDb namespace to use OldDb data adapters in your program. As you can see from Sample Example 6, first I create a connection with northwind database using OldDbConnection. After that I create a data adapter object by passing a SELECT SQL query and connection. Once you have a data adapter, you can fill a dataset object using Fill method of the data adapter. Then you can WriteXml method of DataSet, which creates an XML document and write its contents to the XML document. In our sample, we read Customers table records and write DataSet contents to OutputXml.Xml file in C:\ dir. 

Sample Example 6. 

using System;
using
System.Xml;
using
System.Data;
using
System.Data.OleDb;

namespace ReadingXML2
{
   
class Class1
   
{
       
static void Main(string[] args)
       
{

            // create a connection 
           
OleDbConnection con = new OleDbConnection();
           
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Northwind.mdb";
           

            // create a data adapter
           
OleDbDataAdapter da = new OleDbDataAdapter("Select * from Customers", con);
           
// create a new dataset
           
DataSet ds = new DataSet();
           

            // fill dataset
           
da.Fill(ds, "Customers");
           
// write dataset contents to an xml file by calling WriteXml method
           
ds.WriteXml("C:\\OutputXML.xml");
                   

        }
   
}

Summary

.NET Framework Library provides a good support to work with XML documents. XmlReader, XmlWriter and their derived classes contains methods and properties to read and write XML documents. With the help of XmlDocument and XmlDataDocument, you can read entire document. The Load and Save method of XmlDocument loads a reader or a file and saves document respectively. ADO.NET provides functionality to read a database and write its contents to the XML document using data providers and a DataSet object.

Comment Request!
Thank you for reading this post. Please post your feedback, question, or comments about this post Here.
Login to add your contents and source code to this article
 [Top] Rate this article
 
 About the author
 
Mahesh Chand
Mahesh is the founder of C# Corner and Mindcracker Network, an author of several .NET programming books and a Microsoft MVP for 6 consecutive years. In his day to day work, Mahesh is a Senior Software Consultant with over 14 years of IT industry experience building systems for Financial and Banking, Engineering & Architectural, Imaging, Construction, Biological & Pharmaceuticals, Healthcare and Education industries. His expertise is Windows Forms, ASP.NET, Silverlight, WPF, WCF, Visual Studio 2010, SQL Server, and Oracle.  If you are looking for a Sharepoint, Windows Forms, ASP.NET, WPF, Silverlight, C#, VB.NET, Oracle, and SQL Server Consultant in Philadelphia area or remote location, drop me a line at MAHESH [AT] C-SHARPCORNER [DOT] COM.
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Discover the Top 5 .NET Memory Management Fundamentals
To write the best .NET code, you need to know exactly how the .NET framework really manages memory. Ricky Leeks presents the Top 5 fundamental facts of .NET memory management. Learn more.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
ASP.NET 4 Hosting
Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites – Click Here!
 
 Post a Feedback, Comment, or Question about this article
Subject:
Comment:
Discover the top 5 tips for understanding .NET Interop
Become a Sponsor
 Comments
DevExpress Free UI Controls
 © 2012  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.