Home

The Attributes of an XML Element

 

Introduction

So far, we have used only one attribute per element. Fortunately, you can create as many attributes as you judge necessary in an element. To do this, type the name of each attribute, assign it a double-quoted element and separate the attribute from the next with an empty space. Here is an example of an element with different attributes:

<Video ISBN="0-7888-1623-3" ScreenRatio="Standard" SoundtrackAvailable="True" />

As mentioned already and as you must always remember, attributes belong to an element. To support them, the attributes of an element are stored in the XmlElement.Attributes property and held by a class called XmlAttributeCollection. The XmlAttributeCollection class is based on the XmlNamedNodeMap class. This class lays a foundation to access attributes using their names or index in the collection. To know the number of attributes in an element, you can use the XmlNamedNodeMap.Count property.

 

Practical Learning Practical Learning: Adding Attributes

  1. Start Notepad and type the following:
     
    <?xml version="1.0" encoding="utf-8" ?>
    <World Area="510,072,000,000" Population="6,379,157,361">
        <Continent Name="Africa" Area="30,065,000" Population="807,419,000">
            <Country CountryName="Burundi" Area="27,830" Population="6,231,221" Capital="Bujumbura" Code="bi" />
        </Continent>
        <Continent Name="Europe" Area="9,938,000" Population="730,916,000">
            <Country CountryName="Italy" Area="301,230" Population="58,057,477" Capital="Rome" Code="it" />
        </Continent>
    </World>
  2. To save the file, on the main menu, click File -> New
  3. Locate your VBasic folder and display it in the Save In combo box
  4. Click the Create New Folder button and type Countries2
  5. Display the new Countries1 folder in the Save In combo box
  6. Change the Files of Type to All Files
  7. Change the file name to Countries.xml
  8. Click Save
  9. In the empty document, type the following:
     
    Imports System
    Imports System.xml
    
    Module Exercise
       
        Public Sub Main()
           
        End Sub
    
    End Module
  10. Save the file as Exercise.vb in your Countries2 folder 

Access to an Attribute

To access an attribute by its position in the collection, you can use the XmlNamedNodeMap.Item() method.

The XmlAttributeCollection class is equipped with an ItemOf indexed property. This property is overloaded in three versions. The first version has the following syntax:

Overloads Public Overridable Default ReadOnly Property ItemOf( _
   ByVal i As Integer) As XmlAttribute

This property allows you to access an attribute by considering that the attributes are stored in an array. The first or most left attribute has an index of 0; the second attribute from left (of course without counting the name of the element) has an index of 1, and so on.

It can be difficult and sometimes unpredictable in some scenarios if you try accessing an attribute by their indices because you must know exactly where each attribute is positioned. Consider the following version of our Videos.xml XML file:

<?xml version="1.0" encoding="utf-8" ?>
<Videos FileDesc="Personal Video Collection">
    <Video ISBN="0-7888-1623-3" ScreenRatio="Standard" SoundtrackAvailable="True">
        <Title StoryBy="Marty Kaplan and Jonathan Reynold" Screenplay="Marty Kaplan">The Distinguished Gentleman</Title>
        <Director>Jonathan Lynn</Director>
        <Actors></Actors>
        <Length>112 Minutes</Length>
        <Format>DVD</Format>
        <Rating>R</Rating>
    </Video>
    <Video ISBN="0-7907-3900-3">
        <Title Screenplay="Charlie Peter">Her Alibi</Title>
        <Director>Bruce Beresford</Director>
        <Length>94 Mins</Length>
        <Format>DVD</Format>
        <Rating>PG-13</Rating>
    </Video>
</Videos>

In the first video, the name of the screenplay writer is stored at index 1. In the second video, the name of the screenplay writer is stored at index 0. In this case, it may not be a good item to use the index to locate an attribute. Fortunately, the second version of the overloaded XmlAttributeCollection.ItemOf[] property has the following syntax:

Overloads Public Overridable Default ReadOnly Property ItemOf( _
   ByVal name As String) As XmlAttribute

With this version, you can explicitly specify the name of the attribute that you want.

Practical Learning Practical Learning: Accessing an Attribute

  1. To display the continents, change the code as follows:
     
    Imports System
    Imports System.xml
    
    Module Exercise
        Private Sub ShowContinents()
            ' Open the XML file
            Dim xmlDocContinents As XmlDocument = New XmlDocument
            xmlDocContinents.Load("Countries.xml")
    
            ' Get a list of elements whose names are Continent
            Dim lstContinents As XmlNodeList = xmlDocContinents.GetElementsByTagName("Continent")
    
    
            ' Show the statistics on the continents
            Console.WriteLine(" =-= Continents =-=")
            Console.WriteLine("Name -=- Area -=- Population")
            For Each Continent As XmlNode In lstContinents
                Console.WriteLine("{0} -=- {1} -=- {2}", _
                              Continent.Attributes("Name").InnerText, _
                              Continent.Attributes("Area").InnerText, _
                              Continent.Attributes("Population").InnerText)
            Next
        End Sub
    
        Public Sub Main()
            ShowContinents()
        End Sub
    
    End Module
  2. Save the file
  3. Open  the Command Prompt and Change to the Directory that contains the above file, Countries2
  4. To compile the exercise, type csc Exercise.cs and press Enter
  5. To execute the application, type Exercise and press Enter
     
    =-= Continents =-=
    Name    Area            Population
    Africa  30,065,000      807,419,000
    Europe  9,938,000       730,916,000
  6. Return to Notepad

Attribute Addition

Whether using its index or name, after accessing an attribute, you can manipulate it as you see fit. For example, you can change or delete it using the same techniques we saw to perform on an individual attribute.

As mentioned already, the attributes are stored as a list. Because you have complete access to this list and the positions of its attributes, when creating or adding a new attribute, you can specify the position the new attribute should have in the collection. To create an attribute as the first in an element, you can call the XmlAttributeCollection.Prepend() method. Its syntax is:

Public Overridable Function Prepend( _
   ByVal node As XmlAttribute) As XmlAttribute

Another technique you can use consists of locating an attribute first. Once you have one, to create a new attribute before it, you can call the XmlAttributeCollection.InsertBefore() method. Its syntax is:

Public Overridable Function InsertBefore(ByVal newNode As XmlAttribute, _
   					 ByVal refNode As XmlAttribute _
					) As XmlAttribute

To add a new attribute after the current one, you can call the XmlAttributeCollection.InsertAfter() method. Its syntax is:

Public Overridable Function InsertAfter(ByVal newNode As XmlAttribute, _
   					ByVal refNode As XmlAttribute _
					) As XmlAttribute

To add an attribute at the end of the list of attributes of an element, you can call the XmlAttributeCollection.Append() method. Its syntax is:

Public Overridable Function Append(ByVal node As XmlAttribute) As XmlAttribute

 

 

Practical Learning Practical Learning: Creating Attributes

  1. To allow the user to create a new continent, change the program as follows:
     
    Imports System
    Imports System.xml
    
    Module Exercise
        Private Sub ShowContinents()
            ' Open the XML file
            Dim xmlDocContinents As XmlDocument = New XmlDocument
            xmlDocContinents.Load("Countries.xml")
    
            ' Get a list of elements whose names are Continent
            Dim lstContinents As XmlNodeList = _
               xmlDocContinents.GetElementsByTagName("Continent")
    
            ' Show the statistics on the continents
            Console.WriteLine(" =-= Continents =-=")
            Console.WriteLine("Name -=- Area -=- Population")
            For Each Continent As XmlNode In lstContinents
                Console.WriteLine("{0} -=- {1} -=- {2}", _
                              Continent.Attributes("Name").InnerText, _
                              Continent.Attributes("Area").InnerText, _
                              Continent.Attributes("Population").InnerText)
            Next
        End Sub
    
        Private Sub CreateNewContinent()
            Dim strContinent As String = Nothing
            Dim strArea As String = Nothing
            Dim strPopulation As String = Nothing
    
            ' Open the XML file
            Dim xmlDocContinents As XmlDocument = New XmlDocument
            xmlDocContinents.Load("Countries.xml")
    
            ' Create a Continent element that the new attribute will be added to
            Dim xmlNewContinent As XmlElement = xmlDocContinents.CreateElement("Continent")
    
            ' Present the current list of continents to the user
            ShowContinents()
    
            ' Request the name of a continent from the user
            Console.Write("Enter a new continent: ")
            strContinent = Console.ReadLine()
    
            ' Create a Name attribute using the continent that the user entered
            xmlNewContinent.SetAttribute("Name", strContinent)
    
            ' Request the continent's area from the user
            Console.Write("Enter the area of the continent: ")
            strArea = Console.ReadLine()
    
            ' Create the Area attribute
            xmlNewContinent.SetAttribute("Area", strArea)
    
            ' Request the population of the continent from the user
            Console.Write("Enter the population of the continent: ")
            strPopulation = Console.ReadLine()
    
            ' Create the Population attribute
            xmlNewContinent.SetAttribute("Population", strPopulation)
    
            ' Add the element and its attribute to the document
            xmlDocContinents.DocumentElement.AppendChild(xmlNewContinent)
    
            ' Save the XML file
            xmlDocContinents.Save("Countries.xml")
        End Sub
    
        Public Sub Main()
            Dim choice As Integer = 0
    
            Console.WriteLine(" =-= Main Menu =-=")
            Console.WriteLine("0 - Quit")
            Console.WriteLine("1 - Display Continents")
            Console.WriteLine("2 - Create New Continent")
            Console.Write("Your Choice? ")
            choice = CInt(Console.ReadLine())
    
            Select Case choice
                Case 1
                    ShowContinents()
                Case 2
                    CreateNewContinent()
            End Select
        End Sub
    
    End Module
  2. Save the file and switch to the Command Prompt
  3. Compile and execute the application to test it
  4. Return to Notepad
  5. To allow the user to create a new country, change the file as follows:
     
    Imports System
    Imports System.xml
    
    Module Exercise
        Private Sub ShowContinents()
            ' Open the XML file
            Dim xmlDocContinents As XmlDocument = New XmlDocument
            xmlDocContinents.Load("Countries.xml")
    
            ' Get a list of elements whose names are Continent
            Dim lstContinents As XmlNodeList = _
               xmlDocContinents.GetElementsByTagName("Continent")
    
            ' Show the statistics on the continents
            Console.WriteLine(" =-= Continents =-=")
            Console.WriteLine("Name -=- Area -=- Population")
            For Each Continent As XmlNode In lstContinents
                Console.WriteLine("{0} -=- {1} -=- {2}", _
                              Continent.Attributes("Name").InnerText, _
                              Continent.Attributes("Area").InnerText, _
                              Continent.Attributes("Population").InnerText)
            Next
        End Sub
    
        Private Sub CreateNewContinent()
            Dim strContinent As String = Nothing
            Dim strArea As String = Nothing
            Dim strPopulation As String = Nothing
    
            ' Open the XML file
            Dim xmlDocContinents As XmlDocument = New XmlDocument
            xmlDocContinents.Load("Countries.xml")
    
            ' Create a Continent element that the new attribute will be added to
            Dim xmlNewContinent As XmlElement = xmlDocContinents.CreateElement("Continent")
    
            ' Present the current list of continents to the user
            ShowContinents()
    
            ' Request the name of a continent from the user
            Console.Write("Enter a new continent: ")
            strContinent = Console.ReadLine()
    
            ' Create a Name attribute using the continent that the user entered
            xmlNewContinent.SetAttribute("Name", strContinent)
    
            ' Request the continent's area from the user
            Console.Write("Enter the area of the continent: ")
            strArea = Console.ReadLine()
    
            ' Create the Area attribute
            xmlNewContinent.SetAttribute("Area", strArea)
    
            ' Request the population of the continent from the user
            Console.Write("Enter the population of the continent: ")
            strPopulation = Console.ReadLine()
    
            ' Create the Population attribute
            xmlNewContinent.SetAttribute("Population", strPopulation)
    
            ' Add the element and its attribute to the document
            xmlDocContinents.DocumentElement.AppendChild(xmlNewContinent)
    
            ' Save the XML file
            xmlDocContinents.Save("Countries.xml")
        End Sub
    
        Private Sub AddCountry()
            Dim strContinent As String = Nothing
            Dim strCountry As String = Nothing
            Dim strArea As String = Nothing
            Dim strPopulation As String = Nothing
            Dim strCapital As String = Nothing
            Dim strCode As String = Nothing
    
            ' Open the XML file
            Dim xmlDocContinents As XmlDocument = New XmlDocument
            xmlDocContinents.Load("Countries.xml")
    
            ' Display the list of continents to the user
            Console.WriteLine("Here is a list of the created continents")
            ShowContinents()
    
            ' Request a continent from the user
            Console.Write("Enter the desired continent: ")
            strContinent = Console.ReadLine()
    
            ' Get a list of elements whose names are Continent
            Dim lstContinents As XmlNodeList = xmlDocContinents.GetElementsByTagName("Continent")
    
            ' Visit each Continent element
            For Each Continent As XmlNode In lstContinents
                ' Get a list of the attributes of the current element
                Dim curAttributes As XmlAttributeCollection = Continent.Attributes
    
                ' Check each attribute, looking for the continent that the user entered
                For Each attr As XmlAttribute In curAttributes
                    ' Check if the current continent is the same that the user selected
                    If curAttributes("Name").InnerText = strContinent Then
                        ' Once you find one, get its XmlElement reference
                        Dim elmNewCountry As XmlElement = xmlDocContinents.CreateElement("Country")
    
                        ' Request the name of a country from the user
                        Console.Write("Enter the name of the country: ")
                        strCountry = Console.ReadLine()
                        ' Create the country specified by the user
                        elmNewCountry.SetAttribute("CountryName", strCountry)
    
                        ' Request the area of the country from the user
                        Console.Write("Enter the area of the country: ")
                        strArea = Console.ReadLine()
                        ' Create the Area specified by the user
                        elmNewCountry.SetAttribute("Area", strArea)
    
                        ' Request the population of the country from the user
                        Console.Write("Enter the area of the country: ")
                        strPopulation = Console.ReadLine()
                        ' Create the Population attribute
                        elmNewCountry.SetAttribute("Population", strPopulation)
    
                        ' Request the Capital of the country from the user
                        Console.Write("Enter the area of the country: ")
                        strCapital = Console.ReadLine()
                        ' Create the Capital attribute
                        elmNewCountry.SetAttribute("Capital", strCapital)
    
                        ' Request the Internet Code of the country from the user
                        Console.Write("Enter the population of the country: ")
                        strCode = Console.ReadLine()
                        ' Create the Internet Code attribute
                        elmNewCountry.SetAttribute("Code", strCode)
    
                        ' Add the element (and its attribute) as a child of the current Continent
                        Continent.AppendChild(elmNewCountry)
    
                        ' Save the XML file
                        xmlDocContinents.Save("Countries.xml")
                    End If
                Next
            Next
        End Sub
    
        Public Sub Main()
            Dim choice As Integer = 0
    
            Console.WriteLine(" =-= Main Menu =-=")
            Console.WriteLine("0 - Quit")
            Console.WriteLine("1 - Display Continents")
            Console.WriteLine("2 - Create New Continent")
            Console.WriteLine("3 - Create New Country")
            Console.Write("Your Choice? ")
            choice = CInt(Console.ReadLine())
    
            Select Case choice
                Case 1
                    ShowContinents()
                Case 2
                    CreateNewContinent()
                Case 3
                    AddCountry()
            End Select
        End Sub
    	
    End Module
  6. Save the file and switch to the Command Prompt 
  7. Compile and execute the application to test it
  8. Create some continents and add some countries to them
  9. Type Exit and press Enter to close the Command Prompt
  10. Close Notepad to end the lesson

The Parent of an Attribute

Once an attribute has been created, to identify the element it belongs to, you can access its XmlAttribute.OwnerElement property. This property produces an XmlElement value.

Attribute Removal

If you find out that an element has one or more undesired attributes, you can delete them and you have various options to perform this operation.

Since the attributes are stored in a collection, you can locate the undesired attribute by its index and then delete it. To do this, you can call the XmlAttributeCollection.RemoveAt() method. Its syntax is:

Public Overridable Function RemoveAt(ByVal i As Integer) As XmlAttribute

This method expects the index of the attribute that needs to be removed. As mentioned for the XmlAttributeCollection.ItemOf indexed property, to efficiently use this RemoveAt() method, you should know the exact index of the attribute, otherwise, you may access and therefore delete the wrong attribute. An alternative is to explicitly identify the attribute you want to delete. To do this, you can call the XmlAttributeCollection.Remove() method. Its syntax is:

Public Overridable Function Remove(ByVal node As XmlAttribute) As XmlAttribute

This method takes as attribute the XmlAttribute identification of the attribute you want to remove.

To delete all attributes of an element, you can call the XmlAttributeCollection.RemoveAll() method. Its syntax is:

Public Overridable Sub RemoveAll()

This method would simply remove all attributes that belong to an XmlElement object.

 
 

Previous Copyright © 2005-2012 FunctionX Next