Home

Introduction to XML Elements

 

Elements Fundamentals

 

Introduction

An element in an XML document is an object that begins with a start-tag, may contain a value, and may terminate with an }-tag. Based on this, the combination of a start-tag, the value, and the end-tag is called an element. An element can be more than that but for now, we will consider that an element is primarily characterized by a name and possibly a value.

To support XML elements, the System.Xml namespace provides the XmlElement class. XmlElement is based on a class named XmlLinkedNode that itself is based on XmlNode. To access an XML element, you can declare a variable of type XmlElement but the main purpose of this class is to get an element from a DOM object. For this reason, the XmlElement class doesn't have a constructor you can use. Instead, and as we will learn, the other classes have methods that produce an XmlElement element you can manipulate as necessary.

In the previous lesson, we saw that every XML file must have a root and we mentioned that you could call the XmlDocument.DocumentElement property to access it. This property is of type XmlElement and, to access it, you can declare an XmlElement variable and assign it this property. Here is an example:

File: videos.xml
<?xml version="1.0" encoding="utf-8"?>
<videos>
    <video>
	<title>The Distinguished Gentleman</title>
	<director>Jonathan Lynn</director>
	<length>112 Minutes</length>
	<format>DVD</format>
	<rating>R</rating>
    </video>
    <video>
	<title>Her Alibi</title>
	<director>Bruce Beresford</director>
	<length>94 Mins</length>
	<format>DVD</format>
	<rating>PG-13</rating>
    </video>
    <video>
	<title>Chalte Chalte</title>
	<director>Aziz Mirza</director>
	<length>145 Mins</length>
	<format>DVD</format>
	<rating>N/R</rating>
    </video>
</videos>
Imports System.Xml
Imports System.IO

Public Class Exercise
    Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim strFilename As String = "videos.xml"
        Dim docVideo As XmlDocument = New XmlDocument

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
        Else
            MsgBox("The file " & strFilename & " was not found")
        End If
    End Sub
End Class

An XML element is represented in the XmlNodeType enumeration as the Element member. When using the Read() method of an XmlTextReader object, to find out if the item being read is an element, you can check whether the member of the current XmlNodeType is Element. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
    Dim docVideo As XmlDocument = New XmlDocument
    Dim strFilename As String = "videos.xml"

    If File.Exists(strFilename) Then
       Dim rdrVideos As XmlTextReader = New XmlTextReader(strFilename)

        Do
            Select Case rdrVideos.NodeType
                Case XmlNodeType.Element
            End Select
        Loop While rdrVideos.Read
    Else
        MsgBox("The file " & strFilename & " was not found")
    End If
End Sub

Practical LearningPractical Learning: Introducing XML Elements

  1. Start Microsoft Visual C# and create a Windows Forms Application named PropertyRental1
  2. On the main menu, click File -> New -> File...
  3. In the Templates list, click XML File and click Open
  4. Change the file as follows:
     
    <?xml version="1.0" encoding="utf-8"?>
    <PropertyCodes>
        <PropertyCode>724-795</PropertyCode>
        <PropertyCode>296-283</PropertyCode>
        <PropertyCode>402-364</PropertyCode>
        <PropertyCode>725-784</PropertyCode>
        <PropertyCode>836-903</PropertyCode>
        <PropertyCode>284-247</PropertyCode>
    </PropertyCodes>
  5. On the main menu, click File -> Save XMLFile1.xml As...
  6. Access the main folder of the current project and, inside of it, open a sub-folder of the same name. In the sub-folder of the same name, open the bin sub-folder followed by the Debug sub-folder
  7. Change the name to PropertyCodes
  8. Click Save

The Name of an Element

The name of an element is the string that represents the tag. For example, in <Director>, the word Director is the name of the element. An element must have at least a start-tag. All of the tags we have seen so far were created as elements. When creating your elements, remember to follow the rules we defined for names.

The XmlElement class is equipped with the Name property that can be used to identify an existing element. Here is an example of accessing it:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            MsgBox(elm.Name)
        Else
            MsgBox("The file " & strFilename & " was not found")
        End If
End Sub

This would produce:

Videos

Notice that videos is returned as the name of the root element of the document. If calling the Read() method of an XmlTextReader object to scan a file, when you get to an element, you can find out its Name identity by accessing it. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            Dim rdrVideos As XmlTextReader = New XmlTextReader(strFilename)

            Do
                Select Case rdrVideos.NodeType
                    Case XmlNodeType.Element
                        MsgBox(rdrVideos.Name)
                End Select
            Loop While rdrVideos.Read
        Else
            MsgBox("The file " & strFilename & " was not found")
        End If
End Sub

The Text or Value of an Element

The value of an element is the item displayed on the right side of the start-tag. It is also called the text of the element. In the case of <director>Jonathan Lynn</director>, the "Jonathan Lynn" string is the value of the director element. To support the text or value of an element, the XmlElement class is equipped with the Value property.

While the value of one element can be a number, the value of another element can be a date. Yet another element can use a regular string as its value. Consider the following example:

<?xml version="1.0" encoding="utf-8"?>
<videos>
    <video>
	<title>The Distinguished Gentleman</title>
	<director>Jonathan Lynn</director>
	<LengthInMinutes>112</LengthInMinutes>
	<format>DVD</format>
	<rating>R</rating>
	<price>14.95</price>
    </video>
    <video>
	<title>Her Alibi</title>
	<director>Bruce Beresford</director>
	<LengthInMinutes>94</LengthInMinutes>
	<format>VHS</format>
	<rating>PG-13</rating>
	<price>9.95</price>
    </video>
</videos>

Notice that the price elements contain numbers that look like currency values and the LengthInMinutes elements use an integer as value.

If you are using an XmlTextReader object to scan a file, when the Read() method gets to an element, you can find out what its value is by accessing this property. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            Dim rdrVideos As XmlTextReader = New XmlTextReader(strFilename)

            Do
                Select Case rdrVideos.NodeType
                    Case XmlNodeType.Text
                        MsgBox(rdrVideos.Value)
                End Select
            Loop While rdrVideos.Read
        Else
            MsgBox("The file " & strFilename & " was not found")
        End If
End Sub

The value or text of an element is an object of type XmlText.

Practical Learning Practical Learning: Getting the Text of an Element

  1. In the Solution Explorer, right-click Form1.vb and click Rename
  2. Type SolasPropertyRental.vb and press Enter twice to display the form
  3. Design the form as follows:
     
    Altair Realtors - Properties Listing
     
    Control Text Name Other Properties
    Label Label Solas Property Rental   Font: Times New Roman, 21.75pt, style=Bold
    ForeColor: MediumBlue
    Label Label Properties Listing   Font: Times New Roman, 21.75pt, style=Bold
    ForeColor: Blue
    ListView List View   lvwProperties  
    Columns  
    (Name) Text TextAlign Width
    colPropertyCode Prop #   65
    colPropertyType Property Type   85
    colBedrooms Bedrooms Right 65
    colBathrooms Bathrooms Right 65
    colMonthlyRent Monthly Rent Right 75
    colStatus Status   70
  4. Right-click the form and click View Code
  5. Type the following:
     
    Imports System.IO
    Imports System.Xml
    
    Public Class SolasPropertyRental
    
    End Class
  6. In the Class Name combo box, select (Solas ProertyRenal Events)
  7. In the Method Name combo box, select Load and implement the event as follows::
     
    Private Sub SolasPropertyRental_Load(ByVal sender As Object, _
                                         ByVal e As System.EventArgs) _
                                         Handles Me.Load
        Dim fstPropertyCodes As FileStream = Nothing
        Dim strFilename As String = "PropertyCodes.xml"
        Dim docPropertyCodes As XmlDocument = New XmlDocument
    
        If File.Exists(strFilename) Then
                fstPropertyCodes = New FileStream(strFilename, _
                                                  FileMode.Open, _
                                                  FileAccess.Read)
        Dim rdrPropertyCodes As XmlTextReader = _
    	New XmlTextReader(fstPropertyCodes)
    
        Do
            Select Case rdrPropertyCodes.NodeType
                Case XmlNodeType.Text
                    Dim lviProperty As ListViewItem = _
    			New ListViewItem(rdrPropertyCodes.Value)
                    lvwProperties.Items.Add(lviProperty)
                End Select
            Loop While rdrPropertyCodes.Read()
        Else
            MsgBox("The " & strFilename & "  file was not found")
        End If
    End Sub
  8. Execute the application to see the result. This would produce
     
    Solas Property Rental - Properties Listing
  9. Close the form and return to your programming environment

Empty Elements

An element may not have a value but only a name. Consider the following example:

<?xml version="1.0" encoding="utf-8"?>
<videos>
  <video>
    <title>The Distinguished Gentleman</title>
    <director>Jonathan Lynn</director>
  </video>
</videos>

In this case, the video element doesn't have a value. It is called an empty element. When a tag is empty, the Value property of its XmlElement object would return an empty value.

Character Entities in an Element Value

Besides the obvious types of values, you may want to display special characters as values of elements. Consider the following example:

<?xml version="1.0" encoding="utf-8" ?>
<Employees>
    <Employee>
	<FullName>Sylvie <Bellie> Aronson</FullName>
	<Salary>25.64</Salary>
	<DepartmentID>1</DepartmentID>
    </Employee>
    <Employee>
	<FullName>Bertrand Yamaguchi</FullName>
	<Salary>16.38</Salary>
	<DepartmentID>4</DepartmentID>
    </Employee>
</Employees>

If you try using this XML document, for example, if you try displaying it in a browser, you would, receive an error:

Preview

The reason is that when the parser reaches the <FullName>Sylvie <Bellie> Aronson</FullName> line, it thinks that <Bellie> is a tag but then <Bellie> is not closed. The parser concludes that the document is not well-formed, that there is an error. For this reason, to display a special symbol as part of a value, you can use its character code. For example, the < (less than) character is represented with &lt and the > (greater than) symbol can be used with &gt;. Therefore, the above code can be corrected as follows:

<?xml version="1.0" encoding="utf-8" ?>
<Employees>
    <Employee>
	<FullName>Sylvie &lt;Bellie&gt; Aronson</FullName>
	<Salary>25.64</Salary>
	<DepartmentID>1</DepartmentID>
    </Employee>
    <Employee>
	<FullName>Bertrand Yamaguchi</FullName>
	<Salary>16.38</Salary>
	<DepartmentID>4</DepartmentID>
    </Employee>
</Employees>

This would produce:

Here is a list of other codes you can use for special characters:

Code Symbol Code Symbol Code Symbol Code Symbol Code Symbol
&apos; ' &#067; C &#106; j &#179; &#218;
&lt; < &#068; D &#107; k &#180; &#219;
&gt; > &#069; E &#108; l &#181; &#220;
&amp; & &#070; F &#109; m &#182; &#221;
&quot; " &#071; G &#110; n &#183; &#222;
&#033; ! &#072; H &#111; o &#184; &#223;
&#034; " &#073; I &#112; p &#185; &#224;
&#035; # &#074; J &#113; q &#186; &#225;
&#036; $ &#075; K &#114; r &#187; &#226;
&#037; % &#076; L &#115; s &#188; &#227;
&#038; & &#077; M &#116; t &#189; &#228;
&#039; ' &#078; N &#117; u &#190; &#229;
&#040; ( &#079; O &#118; v &#191; &#230;
&#041; ) &#080; P &#119; w &#192; &#231;
&#042; * &#081; Q &#120; x &#193; &#232;
&#043; + &#082; R &#121; y &#194; &#233;
&#044; , &#083; S &#122; z &#195; &#234;
&#045; - &#084; T &#123; { &#196; &#235;
&#046; . &#085; U &#125; } &#197; &#236;
&#047; / &#086; V &#126; ~ &#198; &#237;
&#048; 0 &#087; W &#160; empty &#199; &#238;
&#049; 1 &#088; X &#161; &#200; &#239;
&#050; 2 &#089; Y &#162; &#201; &#240;
&#051; 3 &#090; Z &#163; &#202; &#241;
&#052; 4 &#091; [ &#164; &#203; &#242;
&#053; 5 &#092; \ &#165; &#204; &#243;
&#054; 6 &#093; ] &#166; &#205; &#244;
&#055; 7 &#094; ^ &#167; &#206; &#245;
&#056; 8 &#095; _ &#168; &#207; &#246;
&#057; 9 &#096; ` &#169; &#208; &#247;
&#058; : &#097; a &#170; &#209; &#248;
&#059; ; &#098; b &#171; &#210; &#249;
&#060; < &#099; c &#172; &#211; &#250;
&#061; = &#100; d &#173; &#212; &#251;
&#062; > &#101; e &#174; &#213; &#252;
&#063; ? &#102; f &#175; &#214; &#253;
&#064; @ &#103; g &#176; &#215; &#254;
&#065; A &#104; h &#177; &#216; &#255;
&#066; B &#105; i &#178; &#217; &#256; A

There are still other codes to include special characters in an XML file.

Identifying the Markup of a Node

 

The Inner Text of a node

In the previous sections, we have seen how to create a tag to produce a node. We also saw that a node could be placed inside of another node. The combined text of the values of the children of a node is available through its XmlNode.InnerText property which is declared as follows:

Public Overridable Property InnerText As String

This property concatenates the values of the children of the node that called them but doesn't include their markups. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            rchDocument.Text = elm.InnerText
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

This would produce:

Videos

Notice that this property produces all values of the children of a node in one block. We already saw how to access each value of the children of a node by calling the XmlTextReader.Read() method and get its Text.

The Outer XML Code of a node

If you want to get a node, its markup, its child(ren) and its(their) markup(s), you can access its XmlNode.OuterXml property which is declared as follows:

Public Overridable ReadOnly Property OuterXml As String

Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
    Dim docVideo As XmlDocument = New XmlDocument
    Dim strFilename As String = "videos.xml"

    If File.Exists(strFilename) Then
        docVideo.Load(strFilename)
        Dim elm As XmlElement = docVideo.DocumentElement
        rchDocument.Text = elm.OuterXml
    Else
        MsgBox("The file " & strFilename & "  was not found")
    End If
End Sub

This would produce:

Videos

The Inner XML Code of a node

If you want only the markup(s) of the child(ren) excluding the parent, access its XmlNode.InnerXml property which is declared as follows:

Public Overridable Property InnerXml As String

Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            rchDocument.Text = elm.InnerXml
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

This would produce:

Videos

The  Child Nodes of  a Node

 

Introduction

As mentioned already, one node can be nested inside of another. A nested node is called a child of the nesting node. This also implies that a node can have as many children as necessary, making them child nodes of the parent node. Once again, consider our videos.xml example:

<?xml version="1.0" encoding="utf-8"?>
<videos>
    <video>
	<title>The Distinguished Gentleman</title>
	<director>Jonathan Lynn</director>
	<length>112 Minutes</length>
	<format>DVD</format>
	<rating>R</rating>
    </video>
    <video>
	<title>Her Alibi</title>
	<director>Bruce Beresford</director>
	<length>94 Mins</length>
	<format>DVD</format>
	<rating>PG-13</rating>
    </video>
    <video>
	<title>Chalte Chalte</title>
	<director>Aziz Mirza</director>
	<length>145 Mins</length>
	<format>DVD</format>
	<rating>N/R</rating>
    </video>
</videos>

The title and the director nodes are children of the video node. The video node is the parent of both the title and the director nodes.

Practical Learning Practical Learning: Using Child Nodes

  1. On the main menu, click File -> New -> File
  2. Select XML File and click Open
  3. Complete the file as follows:
     
    <?xml version="1.0" encoding="utf-8"?>
    <Properties>
        <Property>
    	<PropertyCode>724-795</PropertyCode>
    	<PropertyType>Apartment</PropertyType>
    	<Bedrooms>1</Bedrooms>
    	<Bathrooms>1</Bathrooms>
    	<MonthlyRent>925</MonthlyRent>
    	<Status>Occupied</Status>
        </Property>
        <Property>
    	<PropertyCode>296-283</PropertyCode>
    	<PropertyType>Apartment</PropertyType>
    	<Bedrooms>2</Bedrooms>
    	<Bathrooms>1</Bathrooms>
    	<MonthlyRent>1150.50</MonthlyRent>
    	<Status>Available</Status>
    	</Property>
        <Property>
    	<PropertyCode>402-364</PropertyCode>
    	<PropertyType>Single Family</PropertyType>
    	<Bedrooms>3</Bedrooms>
    	<Bathrooms>2.5</Bathrooms>
    	<MonthlyRent>1750</MonthlyRent>
    	<Status>Occupied</Status>
        </Property>
        <Property>
    	<PropertyCode>725-784</PropertyCode>
    	<PropertyType>Townhouse</PropertyType>
    	<Bedrooms>4</Bedrooms>
    	<Bathrooms>2.5</Bathrooms>
    	<MonthlyRent>1920.50</MonthlyRent>
    	<Status>Available</Status>
        </Property>
        <Property>
    	<PropertyCode>836-903</PropertyCode>
    	<PropertyType>Townhouse</PropertyType>
    	<Bedrooms>4</Bedrooms>
    	<Bathrooms>2.5</Bathrooms>
    	<MonthlyRent>2140.50</MonthlyRent>
    	<Status>Needs Repair</Status>
        </Property>
        <Property>
    	<PropertyCode>284-247</PropertyCode>
    	<PropertyType>Single Family</PropertyType>
    	<Bedrooms>5</Bedrooms>
    	<Bathrooms>3.5</Bathrooms>
    	<MonthlyRent>2250.85</MonthlyRent>
    	<Status>Occupied</Status>
        </Property>
        <Property>
    	<PropertyCode>509-485</PropertyCode>
    	<PropertyType>Apartment</PropertyType>
    	<Bedrooms>3</Bedrooms>
    	<Bathrooms>2</Bathrooms>
    	<MonthlyRent>1250.25</MonthlyRent>
    	<Status>Available</Status>
        </Property>
        <Property>
    	<PropertyCode>740-958</PropertyCode>
    	<PropertyType>Townhouse</PropertyType>
    	<Bedrooms>3</Bedrooms>
    	<Bathrooms>1.5</Bathrooms>
    	<MonthlyRent>1650.50</MonthlyRent>
    	<Status>Occupied</Status>
        </Property>
    </Properties>
  4. To save it, on the main menu, click File -> Save XMLFile2.xml As...
  5. Select the bin\Debug folder of the current project
  6. Change the file name to properties and click Save

A Collection of Child Nodes

To support the child nodes of a particular node, the XmlNode class is equipped with a property named ChildNodes. To identify the collection of child nodes of a node, the .NET Framework provides the XmlNodeList class. Therefore, the ChildNodes property of an XmlNode object is of type XmlNodeList. This property is declared as follows:

Public Overridable ReadOnly Property ChildNodes As XmlNodeList

When this property is used, it produces an XmlNodeList list, which is a collection of all nodes that share the same parent. Each item in the collection is of type XmlNode. To give you the number of nodes on an XmlNodeList collection, the class is equipped with a property named Count. Here is an example of using it:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            Dim lstVideos As XmlNodeList = elm.ChildNodes

            MsgBox("The root element contains " & _
                            lstVideos.Count & "  nodes")
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

This would produce:

You can also use the Count property in a loop to visit the members of the collection.

Accessing a Node in a Collection

The children of a node, that is, the members of a ChildNodes property, or the members of an XmlNodeList collection, can be located each by an index. The first node has an index of 0, the second has an index of 1, an so on. To give you access to a node of the collection, the XmlNodeList class is equipped with an indexed property and a method named Item. Both produce the same result. For example, if a node has three children, to access the third, you can apply an index of 2 to its indexed property. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            Dim lstVideos As XmlNodeList = elm.ChildNodes

            MsgBox(lstVideos(2).InnerText)
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

Videos

You can also use the Item() method to get the same result. Using a For loop, you can access each node and display the values of its children as follows:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim i As Integer
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            Dim lstVideos As XmlNodeList = elm.ChildNodes

            For i = 0 To lstVideos.Count - 1
                MsgBox(lstVideos(i).InnerText)
            Next
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

Videos

Videos

Videos

Instead of using the indexed property, the XmlNodeList class implements the IEnumerable interface. This allows you to use a For Each loop to visit each node of the collection. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim i As Integer
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            Dim lstVideos As XmlNodeList = elm.ChildNodes

            For Each node As XmlNode In lstVideos
                MsgBox(node.InnerText)
            Next
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

To better manage and manipulate the nodes of a collection of nodes, you must be able to access the desired node. The XmlNode class combined with the XmlNodeList class provide various means of getting to a node and taking the appropriate actions.

The Parent of a Node

Not all nodes have children, obviously. For example, the title node of our videos.xml file does not have children. To find out whether a node has children, check its HasChildNodes Boolean property that is declared as follows:

Public Overridable ReadOnly Property HasChildNodes As Boolean

If a node is a child, to get its parent, you can access its ParentNode property.

The First Child Node

The children of a nesting node are also recognized by their sequence. For our videos.xml file, the first line is called the first child of the DOM. This would be:

<?xml version="1.0" encoding="utf-8"?>

After identifying or locating a node, the first node that immediately follows it is referred to as its first child. In our videos.xml file, the first child of the first video node is the <title>The Distinguished Gentleman</title> element. The first child of the second <video> node is <title>Her Alibi</title>.

In the .NET Framework, the first child of a node can be retrieved by accessing the XmlNode.FirstChild property declared as follows:

Public Overridable ReadOnly Property FirstChild As XmlNode

In the following example, every time the parser gets to a video node, it displays the value of it first child:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
        Dim docVideo As XmlDocument = New XmlDocument
        Dim strFilename As String = "videos.xml"

        If File.Exists(strFilename) Then
            docVideo.Load(strFilename)
            Dim elm As XmlElement = docVideo.DocumentElement
            Dim lstVideos As XmlNodeList = elm.ChildNodes

            For Each node As XmlNode In lstVideos
                lbxVideos.Items.Add(node.FirstChild.InnerText)
            Next
        Else
            MsgBox("The file " & strFilename & "  was not found")
        End If
End Sub

This would produce:

Videos

In this example, we started our parsing on the root node of the document. At times, you will need to consider only a particular node, such as the first child of a node. For example, you may want to use only the first child of the root. To get it, you can access the FirstChild property of the DocumentElement object of the DOM. Once you get that node, you can then do what you judge necessary. In the following example, only the values of the child nodes of the first child of the root are displayed:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
    Dim docVideo As XmlDocument = New XmlDocument
    Dim strFilename As String = "videos.xml"

    If File.Exists(strFilename) Then
        docVideo.Load(strFilename)
        Dim Node As XmlNode = docVideo.DocumentElement.FirstChild
        Dim lstVideos As XmlNodeList = node.ChildNodes

        For Each Child As XmlNode In Node.ChildNodes
            lbxVideos.Items.Add(Child.InnerText)
        Next
    Else
        MsgBox("The file " & strFilename & "  was not found")
    End If
End Sub

This would produce:

Videos

Consider the following modification of the Videos.xml file:

<?xml version="1.0" encoding="utf-8" ?>
<Videos>
    <Video>
	<Title>The Distinguished Gentleman</Title>
	<Director>Jonathan Lynn</Director>
	<CastMembers>
	    <Actor>Eddie Murphy</Actor>
	    <Actor>Lane Smith</Actor>
	    <Actor>Sheryl Lee Ralph</Actor>
	    <Actor>Joe Don Baker</Actor>
	    <Actor>Victoria Rowell</Actor>
	</CastMembers>
	<Length>112 Minutes</Length>
	<Format>DVD</Format>
	<Rating>R</Rating>
    </Video>
    <Video>
	<Title>Her Alibi</Title>
	<Director>Bruce Beresford</Director>
	<Length>94 Mins</Length>
	<Format>DVD</Format>
	<Rating>PG-13</Rating>
    </Video>
    <Video>
	<Title>Chalte Chalte</Title>
	<Director>Aziz Mirza</Director>
	<Length>145 Mins</Length>
	<Format>DVD</Format>
	<Rating>N/R</Rating>
    </Video>
</Videos>

Remember that when using a For or a For Each loops applied to an XmlNodeList collection, each node that you access is a complete XmlNode object and may have children. This means that you can further get the ChildNodes node of any node. Here is an example that primarily scans the nodes but looks for one whose name is CastMembers:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
    Dim i As Integer
    Dim j As Integer
    Dim strFilename As String = "videos.xml"
    Dim docVideo As XmlDocument = New XmlDocument

    If File.Exists(strFilename) Then
        docVideo.Load(strFilename)
        REM Locate the root node and 
        REM get a reference to its first child
        Dim Node As XmlNode = docVideo.DocumentElement.FirstChild
        REM Create a list of the child nodes of 
        REM the first node under the root
        Dim lstVideos As XmlNodeList = Node.ChildNodes

        REM Visit each node
        For i = 0 To lstVideos.Count - 1
            REM Look for a node named CastMembers

            If lstVideos(i).Name = "CastMembers" Then
                REM Once/if you find it,
                REM 1. Access its first child
                REM 2. Create a list of its child nodes
                Dim lstActors As XmlNodeList = lstVideos(i).ChildNodes()
                REM Display the values of the nodes
                For j = 0 To lstActors.Count - 1
                    lbxVideos.Items.Add(lstActors(j).InnerText)
                Next
            End If
        Next
    End If
End Sub

This would produce:

Videos

As we have learned that a node or a group of nodes can be nested inside of another node. When you get to a node, you may know or find out that it has children. You may then want to consider only the first child. Here is an example:

Private Sub btnDocument_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnDocument.Click
    Dim i As Integer
    Dim J As Integer
    Dim strFilename As String = "videos.xml"
    Dim docVideo As XmlDocument = New XmlDocument

    If File.Exists(strFilename) Then
        docVideo.Load(strFilename)
        REM Locate the root node and 
        REM get a reference to its first child
        Dim Node As XmlNode = docVideo.DocumentElement.FirstChild
        REM Create a list of the child nodes of 
        REM the first node under the root
        Dim lstVideos As XmlNodeList = node.ChildNodes

        REM Visit each node
        For i = 0 To lstVideos.Count - 1
            REM Look for a node named CastMembers
            If lstVideos(i).Name = "CastMembers" Then
                REM Once/if you find it,
                REM 1. Access its first child
                REM 2. Create a list of its child nodes
                Dim lstActors As XmlNodeList = lstVideos(i).FirstChild.ChildNodes
                REM Display the value of its first child node
                For J = 0 To lstActors.Count - 1
                    lbxVideos.Items.Add(lstActors(J).InnerText)
                Next
            End If
        Next
    Else
        MsgBox("The file " & strFilename & "  was not found")
    End If
End Sub

This would produce:

Videos

The Last Child Node

As opposed to the first child, the child node that immediately precedes the end-tag of the parent node is called the last child. To get the last child of a node, you can access its XmlNode.LastChild property that is declared as follows:

Public Overridable ReadOnly Property LastChild As XmlNode

The Siblings of a Node

The child nodes that are nested in a parent node and share the same level are referred to as siblings. Consider the above file: Director, CastMembers, and Length are child nodes of the Video node but the Actor node is not a child of the Video node. Consequently, Director, Actors, and Length are siblings. Obviously, to get a sibling, you must first have a node.

To access the sibling of a node, you can use its XmlNode.NextSibling property, which is declared as follows:

Public Overridable ReadOnly Property NextSibling As XmlNode

Practical Learning Practical Learning: Using The Sibling of Child Nodes

  1. Access the Load event and change it as follows:
     
    Private Sub SolasPropertyRental_Load(ByVal sender As Object, _
                                         ByVal e As System.EventArgs) _
                                         Handles Me.Load
        Dim strFilename As String = "Properties.xml"
        Dim docProperties As XmlDocument = New XmlDocument
    
        If File.Exists(strFilename) Then
            docProperties.Load(strFilename)
            Dim elmProperty As XmlElement = docProperties.DocumentElement
            Dim lstProperties As XmlNodeList = elmProperty.ChildNodes
    
            For Each Node As XmlNode In lstProperties
                Dim lviProperty As ListViewItem = New ListViewItem(Node.FirstChild.InnerText) REM Property code
    
                lviProperty.SubItems.Add(Node.FirstChild.NextSibling.InnerText) REM Property Type
                lviProperty.SubItems.Add(Node.FirstChild.NextSibling.NextSibling.InnerText) REM Bedrooms
                lviProperty.SubItems.Add(Node.FirstChild.NextSibling.NextSibling.NextSibling.InnerText) REM Bathrooms
                lviProperty.SubItems.Add(Node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.InnerText) REM Monthly Rent
                lviProperty.SubItems.Add(Node.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText) REM Status
                lvwProperties.Items.Add(lviProperty)
            Next
        Else
            MsgBox("The " & strFilename & "  file was not found")
        End If
    End Sub
  2. Execute the application to see the result
     
    Solas Property Rental - Rental Properties
  3. Close the form and return to your programming environment

Previous Copyright © 2008-2012 FunctionX Next