Recipe 17.5 Creating an XML Document Programmatically
Problem
You have data that you want
to put into a more structured form, such as an XML document.
Solution
Suppose you have the following information for an address book that
you want to turn into XML:
|
Tim
|
999-888-0000
|
Newman
|
666-666-6666
|
Harold
|
777-555-3333
|
Use the
XmlTextWriter to create XML for this table:
XmlTextWriter writer = new XmlTextWriter(Console.Out);
writer.Formatting = Formatting.Indented;
writer.WriteStartElement("AddressBook");
writer.WriteStartElement("Contact");
writer.WriteAttributeString("name", "Tim");
writer.WriteAttributeString("phone", "999-888-0000");
writer.WriteEndElement( );
writer.WriteStartElement("Contact");
writer.WriteAttributeString("name", "Newman");
writer.WriteAttributeString("phone", "666-666-6666");
writer.WriteEndElement( );
writer.WriteStartElement("Contact");
writer.WriteAttributeString("name", "Harold");
writer.WriteAttributeString("phone", "777-555-3333");
writer.WriteEndElement( );
writer.WriteEndElement( );
writer.Close( );
Or you can use the
XmlDocument class to programmatically construct
XML from other data:
public static void CreateXML( )
{
// Start by making an XmlDocument
XmlDocument xmlDoc = new XmlDocument( );
// create a root node for the document
XmlElement addrBook = xmlDoc.CreateElement("AddressBook");
xmlDoc.AppendChild(addrBook);
// create the Tim contact
XmlElement contact = xmlDoc.CreateElement("Contact");
contact.SetAttribute("name","Tim");
contact.SetAttribute("phone","999-888-0000");
addrBook.AppendChild(contact);
// create the Newman contact
contact = xmlDoc.CreateElement("Contact");
contact.SetAttribute("name","Newman");
contact.SetAttribute("phone","666-666-6666");
addrBook.AppendChild(contact);
// create the Harold contact
contact = xmlDoc.CreateElement("Contact");
contact.SetAttribute("name","Harold");
contact.SetAttribute("phone","777-555-3333");
addrBook.AppendChild(contact);
// Display XML
Console.WriteLine("Generated XML:\r\n{0}",addrBook.OuterXml);
Console.WriteLine( );
}
Both of these methods generate XML that looks like this:
<AddressBook>
<Contact name="Tim" phone="999-888-0000" />
<Contact name="Newman" phone="666-666-6666" />
<Contact name="Harold" phone="777-555-3333" />
</AddressBook>
Discussion
Now that you have seen two ways to do this, the question arises:
"Which one to use?"
The XMLDocument uses
the traditional DOM method of interacting with XML, while the
XmlTextReader/XmlTextWriter
combination deals with XML in a streaming format. If you are dealing
with larger documents, you are probably better off using the
XmlTextReader/XmlTextWriter
combination than the XmlDocument. The
XmlTextReader/XmlTextWriter
combination is the better-performing of the two when you do not need
the whole document in memory. If you need the power of being able to
traverse back over what you have written already, use
XmlDocument.
XmlDocument is the class that implements the
DOM model for XML
processing in the .NET Framework. The DOM holds all of the nodes in
the XML in memory at the same time, which enables tree traversal both
forward and backward. DOM also allows for a writable interface to the
whole XML document, which other XML classes do not provide in .NET.
XmlDocument allows you to manipulate any aspect of
the XML tree, is eligible to be used for XSLT transformations via the
XslTransform class through its support of the
IXPathNavigable interface, and allows you to run
XPath queries against the document without having
to create an XPathDocument first.
See Also
See the "XmlDocument Class,"
"XML Document Object Model (DOM),"
"XslTransform Class," and
"IXPathNavigable Interface" topics
in the MSDN documentation.
|