You are on page 1of 18

~'-:~\~ :;:I I ~dJ

Chapter'12
;..,,1.,0ltt ·"'

UnitV
C:vrXML
r-~ I

Chapter Outline
12.1 Introduction: XML: Extensible Markup Language
12.2 XML Basics
12.3 The XML Classes
12.4 XML Validation
12.5 XML Display and Transforms
12.6 Questions

~,-
L::~ ~l J~~~!_!J:._~~J/t:_ )
= It is a very widely used format for exchanging data, mainly because it's easy readable for
both humans and machines.
= XML is designed as an all-purpose format for organizing data.
= A markup language is used to provide information about a document.
= Tags are added to the document to provide the extra information.
= HTML tags tell a browser how to display the document.
= XML tags give a reader some idea what some of the data means.
_;_- ~- >~~.t ,,r ,~ - . -. :/Sffl· .
---__,;::;...;;:....,;.;.£..,;:=~............-..;......._...:,.
When creating your own XML document, you need to remember only a few rules:
= XML documents must start with an XML declaration like <?xml version=" 1.0"?>.
= XML elements are composed of a start tag (like <Name>) and an end tag (like </Name>).
= Content is placed between the start and end tags. If you include a start tag, you must also
include a corresponding end tag.
= Whitespace between elements is ignored.
You can use only valid characters in the content for an element. You can't enter special
characters, such as the angle brackets (< >) and the ampersand (&), as content.
XML elements are case sensitive, so <ID> and <id> are completely different elements.
XML 317

:> All elements must be nested in a root element


:> Every element must be fully enclosed. In other words, when you open a subelement, you
need to close it before you can close the parent.

Example
<?xml version="1.0" encoding="utf-S" ?>
<address>
<name>
<first>Haider</first>
<last>Zaidi</last>
</name>
<email>haiderzaidi20@gmail.com</email>
<phone>8898253962</phone>
<birthday>
<year>1988</year>
<month>04</month>
<day>03</day>
</birthday>
</address>

XML File Tree

year /
day
"--

:> .NET provides a rich set of classes for XML manipulation in several namespaces that start
with System.Xml.
:> NET provides seven namespace:
using System.Xml;
using System.Xml.Scherna;
using System.Xml.Linq;
318 1n 9

using System.Xml.Resolvers;
,, using System.Xml.Serialization;
using System.Xml.XPath;
using System.Xml.Xsl;
The SystemXml namespace contains major XML classes. This namespace contai·ns tnan
classes to read and write XML documents. Y

) 12.3.1 The XML TextWriter


One of the simplest ways to create or read any XML document is to use the ba .
XmITextWriter and XmlTextReader classes. sic
) These classes work like their StreamWriter and StreamReader relatives, except th t th
write and read XML documents instead of ordinary text files. . a ey
Example: The following code creates an xmI file with the name Employee.

using System;
using System.Text;
using System.Xml;
namespace ConsoleApplication3
{
class Program

static void Main(stringO args)


{
XmlWriter xmlWriter = XmlWriter.Create("Employee.xml");
xmlWriter. WriteStartDocument();
xmlWriter.WriteStartElement("Employees");
xmlWriter.WriteStartElement("Employee");
xmlWriter.WriteAttributeString("age", "29");
xmlWriter.WriteString("Haider Zaidi");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("Employee");
xmlWriter.WriteAttributeString("age", "48");
xmlWriter.WriteString("Arif Patel");
xmlWriter.WriteEndDocument();
..,
l
)(r/lL 319

lJl)IWriter.WriteStartElement: Writes out a start tag with the specified local name.
xmtWriter.WriteElementString: Writes an element containing a string value.
lllllWriter.WriteEndDocument: Closes any open elements or attributes and puts the writer
. the Start state.
back I0
lJl)IWriter.WriteAttributeString: This method writes out the attribute with a user defined
space prefix and associates it with the given namespace.
naJJle

12.3.2 XMLTextReader
:> With Xm!TextReader we parse XML data. This type acts upon a string containing XML
markup. We use the XmlTextReader constructor and develop a custom parser for XML data.
This is an efficient approach to XML parsing.
:> The Xm!Reader class is an abstract bases classes and contains methods and properties to
read a document. The Read method reads a node in the stream.
:> I'm using books.xml to read and display its data through XmlTextReader. This file comes
with VS.NET samples (https://msdn.microsoftcom/en-
us/Iibrary/ms762271(v=vs.85).aspx ).

Example
using System;
using System.Text;
using System.Xml;

namespace ConsoleApplication 1

class Program

static void args)


{// Create an isntance of XmlTextReader and call Read method to read the file
XmlTextReader textReader = new XmlTextReader("C:\\books.xml");
textReader.Read();
// If the node has value
while (textReader.Read())
{
II Move to fist element
textReader.MoveTo Element();
Console.WriteLine("XmlTextReader Properties Test");
Console.WriteLine("===- =======");
// Read this element's properties and display them on console
Console.WriteLine("Name:" + textReader.Name);
Console.WriteLine("Base URI:" + textReader.BaseURI);
Console.WriteLine("Local Name:•+ textReader.LocalName);
N@\1i%i@NAl+®'1 1111D
Console.Writeline("Attribute Count:" + textReader.AttributeCount.ToString());
Console.Writeline("Depth:" + textReader.Depth.ToString());
Console.Writeline("Line Number:"+ textReader.LineNumber.ToString());
Console.Writeline("Node Type:" + textReader.NodeType.ToString());
Console.Writeline("Attribute Count:" + textReader.Value.ToString());
Console.Read();

•11un1111
--------=====------
ame:9enre ·
Base URI:file:///C:/books.xml
Local Name:genre
Attribute Count:0
i•(·
file:.///C:/USffl/N203TX/App0atall.ocal/Temporary ProJects/Consoli!Application 1/bin:'Debu~ConsoleAppliotion 1.EXE

Depth:2
Line Number:6

-
Node Type:EndElement
Attribute Count:
XmlTextReader. Properties Test
-------------------
Name:
Base URI:file:///C:/books.xml
ocal Name:
Attribute Count:0
Depth:2
Line Number:6
Node Type:Whitespace
Attribute Count:

12.2.3 Reading an XML Document


The XDocurnent makes it easy to read and navigate XML content. You can use the static
XDocurnent.Load() method to read XML documents from a file, URI, or stream, and you can use the
static XDocurnent.Parse() method to load XML content from a string.
Useful Methods for XElement and XDocurnent.
Method Description
Attributes() Gets the collection ofXAttribute objects for this element.
Attribute() Gets the XAttribute with the specific name.
Elements() Gets the collection of XElement objects that are contained by this element. (This
is the top level only-these elements may in tum contain more elements.)
Optionally, you can specify an element name, and only those elements will be
retrieved. -
Element() Gets the single XElement contained by this element that has a specific name (or
null if there's no match). If there is more than one matching element, this method
gets just the first one. -
• ru
Descendants() Gets the collection ofXElement objects that are contained by this element and
(optionally) have the name you specify. Unlike the Elements() method, this
method goes through all the layers of the document and finds elements at any
level of the hierarchy.
Nodes() Gets all the XNode objects contained by this element. This includes elements and
other content, such as comments. However, unlike the XmlTextReader class, the
XDocument does not consider attributes to be nodes.
~cendantNodes() Gets all the XNode object contained by this element. This method is like
Descendants() in that it drills down through all the layers of nested elements.
These methods give you added flexibility to filter out just the elements that interest you.
Example
Employee.xml
':'?xml version="1 .0" encoding="utf-8" ?>
<Employees>
<Employee>
<FirstName>ZAIDl</FirstName>
<Age>30</Age>
<Dept>Computer Science</Dept>
</Employee>
<Employee>
<FirstName>SAIF</FirstName>
<Age>30</Age>
<Dept>lnformation Technology</Dept>
</Employee>
<Employee>
<FirstName>ARIF</FirstName>
<Age>48</Age>
<Dept>Engineering</Dept>
</Employee>
<Employee>
<FirstName>SOHRABH</FirstName>
<Age>30</Age>
<Dept>M.Sc - IT</Dept>
</Employee>
</Employees>
Default.aspx :
--- dvanced Web Programming

322

_.,,. ,.- - __ . . . ., .. ,,-

~ c tDat~
.

DatabOund .. ~~tabound D•~! bound


DatabOund Databound Databound
Databound Databound 'Databound·
. : -· : ~~. ~-·~-· ~·
DatabOund '•DatabOund .,,. ' Databound
--~-
i: .•._,. . -~....... :: . ,..
-'""'·.,. - ,- · - .- '
DatabOund i-..:~;..·--""~
Databou~d ,.,_~
, ,----
Databound
"=' -.
, ' .J._• ~:.,_

Default.aspx code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" lnherits="_Def;;

%>
<html xmlns="http://wWW.w3.org/1999/xhtml">
<head runat="server">
</head>
<body>
<form id="form1" rimat="server">
<div>
<table ciass="sty1e1 ">
<td class="sty1e3">
<asp:GridView ID="GridView1 • runat="server" BackColor="White" BorderColor="Whtte'
BorderWidth="2px" Ce11Padding="3" Gridlines="None" AutoGenerateColumns="False"
BorderStyle="Ridge" Height='281px" Width="538px"
onselectedindexchanged="GridView1 _SelectedlndexChanged" CellSpacing=' 1"
Font-Bold='True" Font-Names="Arial Black' Font-Size='X-Large'>
<FooterStyle BackColor="#C6C3C6" ForeColor="Black"></FooterStyle>
<HeaderStyle BackColor="#4A3CBC" Font-Bold='True" ForeColor="#E7E7FF"></HeaderStyle>
<PagerStyle HorizontalAlign="Right" BackColor="#C6C3C6" ForeColor="Black">
</PagerStyle>
<RowStyle BackColor="#DEDFDE" ForeColor="Black" />
ForeColor="White" Font•
<SelectedRowStyle BackColor-"#9471DE'
Bold="True"></SelectedRowStyle>
<Columns>
<asp:BoundField DataField="FirstName· HeaderText="First Name' ReadOnly="true· />
~L ill

~asp:BoundField DataField="Age" HeaderText="Age" ReadOnly="true" />


<asp:BoundField DataField="Dept" HeaderText="Department" ReadOnly="true" />
</Columns>
<SortedAscendingCellStyle BackColor="#F1F 1F1 • />
<SortedAscendingHeaderStyle BackColor="#594B9C" />
<SortedDescendingCellStyle BackColor="#CAC9C9" />
<SortedDescendingHeaderStyle BackColor="#33276A• />
</asp:GridView></td>
</tr>
</table>
</div>
</form>
</body>
</html>

oefault.aspx.cs code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
XDocument document = XDocument.Load(@"F:\ASP.NET Rizvi\Unit 6\LINQ
PROG\EMPLOYEE.xml");
var query = from r in document.Descendants("Employee")
select new

FirstName = r.Element("FirstName").Value,
Age= r.Element("Age").Value,
Dept= r.Element("Dept").Value
MiiMHMGAi+®ni41l
d
};
GridView1 .DataSource = query;
GridView1 .DataBind();
l
l

© ioc>"'°'t1S952JUNQ10XMI/DmUit.asp,

Select Data I

ZAIDI

SAIF nformation Technol~gyj

ARIF

~ .-~fr,
-'-_.,,,...,;.~~
ilf11r;~.-,~~·",
-~- ; - - ~

XML bas a rich set of supporting standards, many of which are far beyond the scope of this book.
One of the most useful in this family of standards is XML Schema. XML Schema defmes the rules to
which a specific XML document should conform, such as the allowable elements and attributes, the
order of elements, and the data type of each element. You define these requirements in an XML
Schema document (XSD).

Validating an XML Document


The following example shows you how to validate an XML document against a schema, using an
XmlReader that has validation features built in.

XML Schema (XSD)


The XML Schema language is also referred to as XML Schema Definition (XSD). An XML
Schema describes the structure of an XML document.
XSD is a schema language; you use it to define the possible structure and contents of an XML
format A validating parser can then check whether an XML instance document conforms to an XSD
"lJ8 or a set of schemas.

L t::__
XML 325

Example
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
lnherits="XmlValidalion" %>
<html xmlns="http://www.w3.org/1999/xhtm1" >
<head runat="server">
<title>Xml Validation</title>
</head>
<body>
<form id="form1 • runat="server">
<div class="Box">
<asp:RadioButton id="optValid"
runat="server"
Text="Use Data.xml"
Checked="True"
GroupName="Valid">
</asp:RadioButton>
<asp:button id="crndValidate"
runat="server''
Text="Validate XML"
OnClick="cmdValidate_Click">
</asp:button>
</div>
<div>
<asp:Label id="lblStatus" runat="server" EnableViewState="False"></asp:Label>
</div>
</form>
</body>
</html>

File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.LIi;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
32 ng

using System.Web.UI.HtmlControls;
using System.Xml.Schema;
using System.IC;
using System.Xml;

public partial class XmlValidation : System.Web.UI.Page

{
protected void crndVal'date_Click(object sender, EventArgs e)

{
string filePath = "Data.xml";
lblStatus.Text = "";

XmlReaderSettings settings = new XmlReaderSettings();


settings.Schemas.Add("yourURI" ,Request. PhysicalApplicationPath + "Data.xsd");
settings.ValidationType= ValidationType.Schema;
settings.ValidationEventHandler += new ValidationEventHandler(ValidateHandler);

FileStream fs = new FileStream(filePath, FileMode.Open);

XmlReader r = XmlReader.Create(fs, settings);

while (r.Read())
{
l
ls.Close();

lblStatus.Text += "<br />Complete.";


}

public void ValidateHandler(Object sender, ValidationEventArgs e)


{
lblStatus.Text +="Error:"+ a.Message + "<br />';
}
}

File: Data.xml
<?xml version='1.0' encoding='utf-8' ?>
<EmployeeDetails>
<FirstName>ZAIDl</FirstName>
)(ML 327

.:MiddleName>ZARl</MiddleName>
<LastName>HAIDER~/LastName>
<Emai11d>haid~rzaidi20@gmail.com</Emailld>
.:Mobile>8898253962</Mobile>
-=:Address>B/503, Jogeshwari , Mumbai</Address>
<Blke>Yamaha FZS</Bike>
</EmployeeDetails>

File: Oata.xsd
Open the existing XML.
Go to XML menu.
·Select "Create schema"- option.
Your XSD will be created automatically.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema. attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="EmployeeDetails">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:string" />
<xs:element name="MiddleName" type="xs:string" />
<xs:element name="LastName" type="xs:string" />
<xs:element name="Emailld" type="xs:string" />
<xs:element name="Mobile" type="xs:unsignedLong"/>
<xs:element name="Address" type="xs:string" />
<xs:element name="Bike" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

t)l:s·xMl,Display and :rrahsf-9~1'\'.lS


Another standard associated with XML is XSL Transformations (XSL'I). XSLT allows you to
create style sheets that can extract a portion of a large XML document or transform an XML document
into another type of XML document. An even more popular use of XSLT is to convert an XML
document into an HTML document that can be displayed in a browser.
XSLT is easy to use from the point of view of the .NET class library. All you need to understand
is how to create an XslCompiledTransform object (found in the Sys'tem.Xml.Xsl namespace). You use
£ M%iiHMGPi+ wuuJiq
its Load() method to specify a style sheet and its Transfonn() method to output the result to a fit
srreant e or
There are two main components in XSLT that helps transformations, XSLT Proces~o nd
formatter. First, the XSLT processor takes two inputs, a XML document and a XSLT sty! r ~ XSL
XSLT processor starts from the root node and then it goes for the root node's children. Th:s ;et. lbe
searches the stylesheet element to see if any template element and other XSLT elements p ocessor
As per the defined XSLT rules it fetches .data from the XML document and generates a resu are!tsdefined.
tr .
XML formal The XML formatter takes mput as a result tree and generates the final end ee 111
HTML. text other XML format. products as

The XML Web Control


The XML control is used to display an XML document or the results of an XSL Trans tionn
Note: At least one of the XML Document properties must be set or no XML document ··
displayed. ts
You can also specify an XSLT document that will fonnat the. XML document beoreit'
ti 18
written to the output. You can format the XML document with the Transfonn pro e
the TransfonnSource property. P rty or

Example
XML File: XMLFiJe.xml
<?xml version='1.0" encoding='utf-8' ?>
<breakfast_meru>
<food>
<name>Biriyani</name>
<price>$10.60</price>
<description>Rice with chicken</description>
<calories>650</calories>
</food>
<food>
<name>Juice</name>
<price>$4.20</price>
<description>Frult juices like mango, banana, apple</description>
<calories>200</calories>
</food>
</breakfast menu>
XML 329

XSLTFile
XSLTFile.xslt
1 ....
'°:?xml version="1.0" encoding="iso-8859-1"?> ' t 11;,

<html xsl:version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:for-each select="breakfast_menu/food"> r.

<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold">
<xsl:value-of select="name"/>
</span>
- <xsl:value-of select="price"/>
</div>
<div style="margin-left:20px;margin-bottom:1em;font-size:1 Opt">
<xsl :value-of select="description"/>
- ,e,•
<span style="font-style:italic">
<xsl:value-of select="calories"/> -(calories per serving)
</span>
</div>
</xsl:for-each>
</body>
</html>

Without XML Control


_,,• -·.r, • :,-..
.... Xmn I LaHI "Xlxxl
.., Use this <OfltnH to perfonn XSl trlmfonns.
· •
... . ..'.'./'!,'./
{'

Webforml.aspx source code


<%@ Page Language="C#" AutoEventWlreup="true" CodeFile="Webform 1.aspx.cs"
lnherits="Webform1" %>
--- dvancad Wab Prograrnrn1ng

<html xmlns="http:/Jwww.w3.org/1999/xhtml">
<head n1nat='server">
<ti11e></title>
</head>
<bOdy>
<form ld='form1' n1nat=·server">
<div>

<table class='style1 '>


<td class='style3'>
<asp:Button ID='Button1' n1nat="server" Font-Bold="True" Font-Size="Larger"
ForeColor-"#003366' Height="33px" onclick="Button1_Click"
styte='font-weight: 700" Text="XML Display" />
<ltd>
<td>
<asp:Button ID="Button2" n1nat="server" Font-Bold="True" Font-Size="Larger"
ForeColor-"#003366" Height="33px" onclick="Button2_(?1ick'
styte='font-weight: 700" Text='Without XML Control "/>
<ltd>
</tr>
<td class='style6">
<asp:Xml ID="Xml1" runat="server"></asp:Xml>
<ltd>
<td class='style5">
<asp:Label ID="Label1" runat='server" Font-Bold="True" Font-Size="Large" I
Text='Label"></asp:Label>
<ltd>
</tr>
</table>

</div>
</form>
</body>
</html>
)(ML
331
+
C' 1,) ©"'

[ XML Display I [ Without XML Control ]

Label

Webforml.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IQ;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.Web.UI;
using System.Text;
using System.Web.UI.WebControls;

public partial class Webform1 : System.Web.UI.Page


{

protected void Page_Load(object sender, EventArgs e)


{

protected void Button1_Click(object sender, EventArgs e)


{
XmI1.Visible = true;
Label1 .Visible = false;

// This is being read from the same folder as this page is in.(only for demo purpose)
// In real applications this xml might be coming from some external source or database.
string xmlString = File.ReadAIIText(Server.MapPath("XMLFile.xml"));

II Define the contents of the XML control


Xm11.DocumentContent = xmlString;

II Specify the XSL file to be used for transformation.


&l¼i,H+MW?i+Wi,,hm!
DD
Xml1 .TransformSource = Server.MapPath("XSLTFile.xslt");

}
protected void Button2_Click(object sender, EventArgs e)
{
Xml1.Visible = false;
Label1.Visible = true;

JI Getting file path


string strXSLTFile = Server.MapPath("XSLTFile.xslt");
string strXMLFile = Server.MapPath("XMLFile.xml");

II Creating XSLCompiled object


XslCompiledTransform objXSLTransform = new XslCompiledTransform();
objXSLTransform.Load(strXSLTFile);

II Creating StringBuilder object to hold html data and creates TextWriter object to hold data f
XslCompiled.Transform method rom
StringBuilder htrnlOu1put = new StringBuilder();
TextWriter htrnlWriter = new StringWriter(htmlOutput);

II Creating XmlReader object to read XML content


XmlReader reader= XmlReader.Create(strXMLFile);

II Call Transform() method to create html string and write in TextWriter object.
objXSLTransform.Transform(reader, null, htmlWriter);
Label1 .Text = htmlOutput.ToString();

// Closing xmlreader object


reader.Close();

,
XML
333
1oe.n,o,t:614Z/Wtblorm1/Weblorn X +

®
l~ <:! Q
~r.l""'.~;. - .m•,.,.-__ . .. .
¼ ~\,..,-i;:.· .
©
-_
IOCalnost:t, l '1

. '""'- ~
..,,. -
t;.... -....-- -.,. - - .,_,," _ ...
1
• ·• '" [!<ML Display I , [ Without_XML Control \

Biriyani - $10.60
Rice with chicken650 (calories per serving)

Juice - $4.20
Frurt juices like mango, banana, apple200 (calories per serving)
i1
loc,lloldlW#mforfflVWcllfo.-,· )(

I~.: C! 0 ~ - ll!l@ -

f. XMl.;J}i~play

Biriyani - $10.60
Rlct with _151),_ ,,.,-inw
Juice - $4.20
FrultjulCIO 11<,-. bo111111, oppllm/-por-'"11/

·:i . '-:e;-z~-:~ : .~: -~- ~ ~~:.t~\:f1~~~#~:@-:ii~~>r -:~/-.,;-~-~\·: _


J ·:}J~~fflffY~-:~·-·: ·
I. Explain xml with example.
2. Explain XML TextWriter with example.
3. Explain XML TextReader with example.
4. How to Reading an XML Document? Explain with example.
5. Explain XML Validation with proper example.
6. Explain XML Display and Transforms in asp.net with example.

You might also like