Reading and Writing XML Documents

One of the most basic tasks that you can perform with XML is manipulating the contents of an XML document. This includes traversing the list of nodes in the document, setting and querying attribute values, and manipulating the tree itself by creating and inserting new nodes.

This section shows you how to read XML documents using the Document Object Model (DOM) ) modeled by the XmlDocument class in the System.Xml namespace. The DOM is recursive, meaning that each node has the same properties and methods as every other node in the document. Tables 8.1 and 8.2 provide a brief overview of many of the properties and methods of the XmlNode class before getting into the code sample. The XML node is the most basic unit of abstraction within a DOM-modeled document.

Table 8.1. Commonly Used XmlNode Properties




The attributes of the node (XmlAttributeCollection).


The list of child nodes of the current node (XmlNodeList).


Returns the first child of the XML node (first being first in document order).


A Boolean that indicates whether the node has child nodes.


Gets or sets the text inside the node.


Gets or sets the XML within the node.


Returns the last child (document order relative) of the node.


The name of the node.


Indicates the type of the node. This can be several things, including (but not limited to): Document, DocumentFragment, Element, EndElement, Entity, Notation, Text, Whitespace, or XmlDeclaration.


The XML representing the current node and all its child nodes.


The document to which the current node belongs.


The parent node of the current node, if any.


Gets the node immediately preceding the current node in document order.


Gets or sets the value of the current node.

Table 8.2. Commonly Used XmlNode Methods




Adds a child node to the end of the current list of child nodes


Creates a duplicate of the node


Creates an XPathNavigator for this node


Inserts the given node immediately after the current node


Inserts the given node immediately before the current node


Adds the given child node at the beginning of the child node list


Removes all child nodes


Removes the given child from the current node


Selects a list of nodes matching the XPath expression (discussed in the following section)


Selects a single node that matches the XPath expression

The XmlDocument class, which deals with the entire document, is also itself an XmlNode. If you look at the documentation for the XmlDocument class, you'll see that it inherits from XmlNode. This fits with the DOM pattern in that the document is a node that can have child nodes. The methods in Table 8.3 show some of the additional methods available to the XmlDocument that aren't part of a standard node class.

Table 8.3. XmlDocument Class Methods




Creates an XmlAttribute with the given name


Creates a CData section with the given data


Creates an XmlComment


Creates a document fragment


Creates an XmlElement, an XmlNode with element-specific functionality


Creates an XmlNode


Creates an XmlText node


Creates whitespace for insertion into the document


Imports a node from another document


Loads the XML from the given file


Loads the XML from the given XML string


Saves the XML document


Validates the XML document against a schema

To show off the code for manipulating an XML document, we need a document. For the rest of this chapter, we will be working with a document called items.xml, which contains a list of items from a fictitious role-playing game and the various aspects of those items. The contents of this file are shown in Listing 8.1.

Listing 8.1. Items.xml

<?xml version="1.0" encoding="utf-8"?> <items>   <item  name="Flaming Sword of Doom"         description= "This sword will vanquish all of your foes with a single swipe">     <attribute name="attack" value="10"/>     <attribute name="weight" value="21" />   </item>   <item  name="Bag of Really Big Stuff"         description="This bag can hold a lot of stuff.">     <attribute name="weight" value="1" />     <attribute name="capacity" value="80" />   </item>   <item  name="Broach of Bug Smashing"         description="This broach will kill any bug. Instantly.">     <attribute name="weight" value="1" />     <attribute name="attack" value="11" />     <specials>       <special name="killbug" description="This thing kills any bug instantly."/>     </specials>   </item>   <item  name="Wand of Traffic Vanquish"         description= "A single wave of this wand will part the highway before you.">     <attribute name="weight" value="5" />     <attribute name="attack" value="20" />     <specials>       <special name="parttraffic" description="All nearby vehicles move out of your way." />     </specials>   </item> </items> 

Although XML allows you to freely mix freeform text with markup, for the purposes of the code in this chapter, the examples use XML documents as pure data storage.

The code in Listing 8.2 shows the use of the XmlNode class and its associated properties and methods for traversing an XML document and displaying its contents to the console.

Listing 8.2. XML Document Display Sample

using System; using System.Xml; using System.Collections.Generic; using System.Text; namespace ReadWriteXml { class Program { static void Main(string[] args) { XmlDocument itemDoc = new XmlDocument(); itemDoc.Load(@"..\..\..\..\items.xml"); Console.WriteLine("DocumentElement has {0} children.",     itemDoc.DocumentElement.ChildNodes.Count); // iterate through top-level elements foreach (XmlNode itemNode in itemDoc.DocumentElement.ChildNodes) {     // because we know that the node is an element, we can do this:     XmlElement itemElement = (XmlElement)itemNode;     Console.WriteLine("\n[Item]: {0}\n{1}", itemElement.Attributes["name"].Value,         itemElement.Attributes["description"].Value);     if (itemNode.ChildNodes.Count == 0)         Console.WriteLine("(No additional Information)\n");     else     {         foreach (XmlNode childNode in itemNode.ChildNodes)         {             if (childNode.Name.ToUpper() == "ATTRIBUTE")             {                 Console.WriteLine("{0} : {1}",                     childNode.Attributes["name"].Value,                     childNode.Attributes["value"].Value);             }             else if (childNode.Name.ToUpper() == "SPECIALS")             {                 foreach (XmlNode specialNode in childNode.ChildNodes)                 {                     Console.WriteLine("*{0}:{1}",                        specialNode.Attributes["name"].Value,                        specialNode.Attributes["description"].Value);                 }             }         }     } } Console.ReadLine(); } } } 

Microsoft Visual C# 2005 Unleashed
Microsoft Visual C# 2005 Unleashed
ISBN: 0672327767
EAN: 2147483647
Year: 2004
Pages: 298 © 2008-2017.
If you may any questions please contact us: