Helper Routines
Building and reading XML files is straightforward, but several operations require more than one step. To add a new node to an XML document, you need to create the node in the document, add it to its parent node, and then set its value. The MakeXmlNode routine shown in Listing 2 does all this in a nice package.
The program calls MakeXmlNode, passing it the node that should be the parent of the new node, the new node's name, and the new node's value. MakeXmlNode uses the parent node's OwnerDocument property to get a reference to the XmlDocument object that contains the parent node. If OwnerDocument returns Nothing, the parent node is actually the XmlDocument object itself.
MakeXmlNode then uses the document's CreateElement method to make a new node. It adds the node to the parent's collection of children with the AppendChild method. If the node's desired value is something other than Nothing, the routine saves it as the new node's value.
The ChildNodeValue function returns the value of a node's child. For example, consider this small XML file:
<MainForm> <X>291</X> <Y>16</Y> <Width>714</Width> <Height>508</Height> </MainForm>
To get the X value, the program passes ChildNodeValue the parent node containing the MainForm tag. The function uses the parent's Item collection to select the child nodein this example, the node named X. If it does not find a child with the desired name, ChildNodeValue returns a default value. Otherwise, the function returns the child node's InnerText value. In this example, that value is 291.
Listing 2. These Routines Make Reading and Writing XML Data Easier
' Make and return a new XML node. Public Function MakeXmlNode(ByVal parent As XmlNode, ByVal new_name As String, _ Optional ByVal new_value As String = Nothing) As XmlNode Dim doc As XmlDocument Dim new_node As XmlNode ' Get the parent document. doc = parent.OwnerDocument If doc Is Nothing Then doc = parent new_node = doc.CreateElement(new_name) parent.AppendChild(new_node) If Not (new_value Is Nothing) Then new_node.InnerXml = new_value Return new_node End Function ' Return this node's child value. Public Function ChildNodeValue(ByVal parent As XmlNode, ByVal value_name As String, _ ByVal default_value As String) As String Dim child_node As XmlNode child_node = parent.Item(value_name) If child_node Is Nothing Then Return default_value Else Return child_node.InnerText End If End Function