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 end-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>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;

namespace VideoCollection1
{
    public partial class Exercise : Form
    {
        public Exercise()
        {
            InitializeComponent();
        }

        private void btnDocument_Click(object sender, EventArgs e)
        {
            XmlDocument docVideo = new XmlDocument();
            string strFilename = "videos.xml";

            if (File.Exists(strFilename))
            {
                docVideo.Load(strFilename);
                XmlElement elm = docVideo.DocumentElement;
            }
            else
                MessageBox.Show("The file " + strFilename + " was not found");
        }
    }
}

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 void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        XmlTextReader rdrVideos = new XmlTextReader(strFilename);

        do
        {
            switch (rdrVideos.NodeType)
            {
                case XmlNodeType.Element:
                    break;
            }
        } while (rdrVideos.Read());
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

Practical Learning Practical Learning: Introducing XML Elements

  1. Start Microsoft Visual C# and create a Console Application named SolasPropertyRental3
  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 PropertyTypes.xml As...
  6. Access the main folder of the current project and, inside of it, open a sub-folder of the same name (it should be opened already). In the sub-folder of the same name, open the bin sub-folder followed by the Release 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 void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        docVideo.Load(strFilename);
        XmlElement elm = docVideo.DocumentElement;
        MessageBox.Show(elm.Name);
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

This would produce:

Notice that videos is returned as the name of the root element of the file. 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 void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        XmlTextReader rdrVideos = new XmlTextReader(strFilename);

        do
        {
            switch (rdrVideos.NodeType)
            {
                case XmlNodeType.Element:
                    MessageBox.Show(rdrVideos.Name);
                    break;
            }
        } while (rdrVideos.Read());
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

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 void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        XmlTextReader rdrVideos = new XmlTextReader(strFilename);

        do
        {
            switch (rdrVideos.NodeType)
            {
                case XmlNodeType.Text:
                    MessageBox.Show(rdrVideos.Value);
                    break;
            }
        } while (rdrVideos.Read());
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

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.cs and click Rename
  2. Type SolasPropertyRental.cs and press Enter twice to display the form
  3. Design the form as follows:
     
    Altair Realtors - Properties Listing
    Control Text Name Other Properties
    Label Solas Property Rental   Font: Times New Roman, 21.75pt, style=Bold
    ForeColor: MediumBlue
    Label Properties Listing   Font: Times New Roman, 21.75pt, style=Bold
    ForeColor: Blue
    ListView   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. In the combo box on top of the Properties window, select Central and click the Events button
  5. In the Events section, double-click Load and implement the event as follows::
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Xml;
    
    namespace SolasPropertyRental3
    {
        public partial class SolasPropertyRental : Form
        {
            public SolasPropertyRental()
            {
                InitializeComponent();
            }
    
            private void SolasPropertyRental_Load(object sender, EventArgs e)
            {
                FileStream fstPropertyCodes = null;
                string strFilename = "PropertyCodes.xml";
                XmlDocument docPropertyCodes = new XmlDocument();
    
                if (File.Exists(strFilename))
                {
                    fstPropertyCodes = new FileStream(strFilename,
                                                      FileMode.Open,
                                                      FileAccess.Read);
                    XmlTextReader rdrPropertyCodes =
                new XmlTextReader(fstPropertyCodes);
    
                    do
                    {
                        switch (rdrPropertyCodes.NodeType)
                        {
                            case XmlNodeType.Text:
                                ListViewItem lviProperty =
                    new ListViewItem(rdrPropertyCodes.Value);
                                lvwProperties.Items.Add(lviProperty);
                                break;
                        }
                    } while (rdrPropertyCodes.Read());
                }
                else
                    MessageBox.Show("The " + strFilename + " file was not found");
            }
        }
    }
  6. Execute the application to see the result. This would produce
     
    Solas Property Rental - Properties Listing
  7. Close the forms 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>
    <vitle>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:

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 virtual string InnerText{get; set};

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 void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        docVideo.Load(strFilename);
        XmlElement elm = docVideo.DocumentElement;
        rchDocument.Text = elm.InnerText;
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

This would produce:

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 virtual string OuterXml{get};

Here is an example:

private void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        docVideo.Load(strFilename);
        XmlElement elm = docVideo.DocumentElement;
        rchDocument.Text = elm.OuterXml;
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

This would produce:

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 virtual string InnerXml{get};

Here is an example:

private void btnDocument_Click(object sender, EventArgs e)
{
    XmlDocument docVideo = new XmlDocument();
    string strFilename = "videos.xml";

    if (File.Exists(strFilename))
    {
        docVideo.Load(strFilename);
        XmlElement elm = docVideo.DocumentElement;
        rchDocument.Text = elm.InnerXml;
    }
    else
        MessageBox.Show("The file " + strFilename + " was not found");
}

This would produce:

 

Previous Copyright © 2007 FunctionX, Inc. Next