Professional Documents
Culture Documents
This article mainly focuses on reading XML documents in several ways using Visual Basic.NET
2005. Topics discussed include the XMLReader and XSLT, among others.
This article mainly focuses on reading XML documents in several ways using Visual Basic.NET
2005.
If you are new to designing XML Schemas, I suggest you to refer my following articles:
http://www.devarticles.com/c/a/XML/Designing-Your-own-XML-Schema-Learn-the-
Essentials/
http://www.devarticles.com/c/a/XML/Designing-Your-own-XML-Schema-
Constraining-with-Restrictions/
http://www.devarticles.com/c/a/XML/Designing-Your-own-XML-Schema-
Restrictions-and-User-Defined-Types/
http://www.devarticles.com/c/a/XML/Designing-Your-Own-XML-Schema-Indicators/
http://www.devarticles.com/c/a/XML/Introduction-to-Relations-in-XML-Schema/
http://www.devarticles.com/c/a/XML/OneOne-OneMany-and-ManyMany-Relations-
in-XML-Schema/
The entire source code for this article is available in the form of a downloadable zip file. The
solution was developed using Microsoft Visual Studio 2005 Professional Edition on Microsoft
Windows Server 2003 Enterprise Edition together. I didn’t really test the solution with any
other/previous editions. If you have any problems in executing the solution, please post in the
discussion area.
XML Schema and XML document
An XML document is simply a text file with some hierarchical and structural user-defined tags
(like HTML tags) containing user-provided data. The syntax, grammar, rules, structure,
hierarchy, constraints etc. of a particular XML document is defined using XML Schema (which
is also an XML document, but with the XSD extension).
To work with this article, I worked with the following XML document (Employee.xml):
<?xml version="1.0" encoding="utf-8"?>
<Employees xmlns="http://tempuri.org/Employee.xsd">
<Employee>
<Empno>1001</Empno>
<Ename>Jagadish</Ename>
<Sal>3400</Sal>
<Deptno>20</Deptno>
</Employee>
<Employee>
<Empno>1002</Empno>
<Ename>Chatarji</Ename>
<Sal>4500</Sal>
<Deptno>10</Deptno>
</Employee>
<Employee>
<Empno>1003</Empno>
<Ename>Winner</Ename>
<Sal>3700</Sal>
<Deptno>10</Deptno>
</Employee>
<Employee>
<Empno>1004</Empno>
<Ename>Dhanam</Ename>
<Sal>4300</Sal>
<Deptno>20</Deptno>
</Employee>
</Employees>
The XML Schema for the above XML document is defined as follows:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Employee" targetNamespace=
"http://tempuri.org/Employee.xsd" elementFormDefault=
"qualified" xmlns="http://tempuri.org/Employee.xsd"
xmlns:mstns="http://tempuri.org/Employee.xsd" xmlns:xs=
"http://www.w3.org/2001/XMLSchema">
<xs:element name="Employees">
<xs:complexType>
<xs:sequence>
<xs:element name="Employee" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
The following is the simplest code that can read and display all tags in an XML document:
PrivateSub btnShow_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnShow.Click
Me.TextBox1.Text = ""
Dim rd As XmlReader = XmlReader.Create(Application.ExecutablePath &
"......Employee.xml")
While rd.Read
If rd.NodeType = XmlNodeType.Element Then
Me.TextBox1.Text &= rd.Name & ControlChars.NewLine
End If
End While
rd.Close()
End Sub
In the above code, I used a class called “XMLReader” available in the “System.XML”
namespace. You should always use the “create” method existing in “XMLReader” class
whenever you want to create an object related to the “XMLReader.” When the above code gets
executed, you will receive the following output:
Employees
Employee
Empno
Ename
Sal
Deptno
.
.
.
Let us modify the above code in such a way that it gives the tags along with indentation. You can
perfectly indent the tags if and only if you know the depth of each node. The
following code retrieves the depth of each node and indents appropriately.
Private Sub btnShowIndentation_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles btnShowIndentation.Click
Me.TextBox1.Text = ""
Dim rd As XmlReader = XmlReader.Create(Application.ExecutablePath &
"......Employee.xml")
While rd.Read
If rd.NodeType = XmlNodeType.Element Then
Me.TextBox1.Text &= Space(rd.Depth * 4) & rd.Name &
ControlChars.NewLine
End If
End While
rd.Close()
End Sub
When the above code gets executed, you will receive the following kind of output:
Employees
Employee
Empno
Ename
Sal
Deptno
Employee
Empno
Ename
Sal
Deptno
.
.
.
Reading and Transforming XML Documents
using Visual Basic 2005 - Reading the values
(or text) of XML tags in an XML document
using XMLReader
(Page 3 of 6 )
In the previous section, we read only the tags available in an XML document. In this section, we
will read the values and also the related tags along with them. First of all, let us concentrate on
reading values. Consider the following code:
PrivateSub btnShowValues_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnShowValues.Click
Me.TextBox1.Text = ""
Dim rd As XmlReader = XmlReader.Create(Application.ExecutablePath &
"......Employee.xml")
While rd.Read
If rd.NodeType = XmlNodeType.Text Then
Me.TextBox1.Text &= rd.ReadString & ControlChars.NewLine
End If
End While
rd.Close()
End Sub
You can observe that I am comparing with the “text” type of SML node to retrieve the values
available in XML document. You can also observe that I am using the “ReadString” method to
read the value.
Finally, the following code retrieves each and every tag along with its name, text, and so forth:
PrivateSub btnShowXML_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnShowXML.Click
Me.TextBox1.Text = ""
Dim rd As XmlReader = XmlReader.Create(Application.ExecutablePath &
"......Employee.xml")
While rd.Read
Select Case rd.NodeType
Case XmlNodeType.Element
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("<{0}>", rd.Name) & ControlChars.NewLine
Case XmlNodeType.Text
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format(rd.Value) & ControlChars.NewLine
Case XmlNodeType.CDATA
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("<![CDATA[{0}]]>", rd.Value) & ControlChars.NewLine
Case XmlNodeType.ProcessingInstruction
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("<?{0} {1}?>", rd.Name, rd.Value) & ControlChars.NewLine
Case XmlNodeType.Comment
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("<!--{0}-->", rd.Value) & ControlChars.NewLine
Case XmlNodeType.XmlDeclaration
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("<?xml version='1.0'?>") & ControlChars.NewLine
Case XmlNodeType.Document
Case XmlNodeType.DocumentType
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("<!DOCTYPE {0} [{1}]", rd.Name, rd.Value) & ControlChars.NewLine
Case XmlNodeType.EntityReference
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format(rd.Name) & ControlChars.NewLine
Case XmlNodeType.EndElement
Me.TextBox1.Text &= Space(rd.Depth * 4) &
String.Format("</{0}>", rd.Name) & ControlChars.NewLine
End Select
End While
rd.Close()
End Sub
In all of the previous sections, we read XML documents using XMLReader. In this section, I
shall read a string which contains XML and display the node values (or text) on to the screen.
The following routine prepares the XML string using the “StringBuilder” available in
the “System.Text” namespace:
PrivateFunction getPreparedXML() As String
Dim xmlBuilder As New System.Text.StringBuilder
With xmlBuilder
.AppendLine("<?xml version=""1.0"" encoding=""utf-8""?>")
.AppendLine("<Employees>")
.AppendLine(" <Employee>")
.AppendLine(" <Empno>1001</Empno>")
.AppendLine(" <Ename>Jagadish</Ename>")
.AppendLine(" <Sal>3400</Sal>")
.AppendLine(" <Deptno>20</Deptno>")
.AppendLine(" </Employee>")
.AppendLine("</Employees>")
End With
Return xmlBuilder.ToString
End Function
The following code works with the above routine and displays the node information back to the
user:
Private Sub btnXMLString_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnXMLString.Click
Me.TextBox1.Text = ""
Dim strRdr As New System.IO.StringReader(getPreparedXML)
Dim rd As XmlReader = XmlReader.Create(strRdr)
While rd.Read
If rd.NodeType = XmlNodeType.Text Then
Me.TextBox1.Text &= rd.ReadString & ControlChars.NewLine
End If
End While
rd.Close()
strRdr.Close()
End Sub
If you wanted to go (parse) through the XML document tag by tag (including every start and end
element of every tag), you can modify the above code as follows:
Private Sub btnReadNodes_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnReadNodes.Click
Me.TextBox1.Text = ""
Dim strRdr As New System.IO.StringReader(getPreparedXML)
Dim rd As XmlReader = XmlReader.Create(strRdr)
rd.Read()
rd.ReadStartElement("Employees")
rd.ReadStartElement("Employee")
rd.ReadStartElement("Empno")
Me.TextBox1.Text &= rd.ReadString & ControlChars.NewLine
rd.ReadEndElement() 'end empno
rd.ReadStartElement("Ename")
Me.TextBox1.Text &= rd.ReadString & ControlChars.NewLine
rd.ReadEndElement() 'end ename
rd.ReadStartElement("Sal")
Me.TextBox1.Text &= rd.ReadString & ControlChars.NewLine
rd.ReadEndElement() 'end sal
rd.ReadStartElement("Deptno")
Me.TextBox1.Text &= rd.ReadString & ControlChars.NewLine
rd.ReadEndElement() 'end deptno
rd.ReadEndElement() 'end employee
rd.ReadEndElement() 'end employees
rd.Close()
strRdr.Close()
End Sub
XSL stands for eXtensible Stylesheet Language. It is a language used to design and apply style
sheets especially for XML documents. Originally the research was started to provide style sheet
technology to XML using XSL, but we finally ended up with three more divisions of XSL. So
XSL now consists of three parts, namely XSLT, XPath and XSL-FO.
XSLT is a language for transforming XML documents (even today, several programmers say
XSL when they really mean XSLT). XPath is a language to filter, search or sort information
available in XML documents. XSL-FO is a language for formatting XML documents. In this
article we mainly focus on XSLT, which stands for XSL Transformations.
XSLT can also be used to transform an XML document to another XML document (it need not
be used only for HTML documents). Another beauty of XSLT is that it internally works
using XPath language. We can even conclude that “The more we learn about XPath, the better
XSLT we can design.” Although the sections from this point forward mainly focus on XSL, I
suggest you go through the fundamentals of the XPath language for better understanding (but it's
not necessary for this article).
Before transforming an XML document, we need to define the XSLT which emits HTML based
on the structure of our existing XML document. The following is the XSLT needed to emit the
TABLE structure of HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>