In my previous article I showed you how to add a web service reference in your ASP.NET application, call a webmethod and the display the values returned byt the web service to a Label. This time I'm going to show you how to transform that Xml string into a DataSet.
I suggest that you read the previous article before continuing in reading this post so you'll have a better insight on what we are trying to accomplish on this article.
Let's begin!
To start off this article let's look at how the application that we built for the previous article.

and the HTML code for the UI
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Keith Rull's Consuming Web Services Sample</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<strong>Symbol</strong><br />
<asp:TextBox ID="symbolTextBox"
runat="server" />
<asp:Button ID="executeButton"
runat="server"
Text="Execute"
OnClick="executeButton_Click" />
<br />
<br />
<strong>Result</strong>
<br />
<asp:Label ID="xmlResultLabel"
runat="server" />
</div>
</form>
</body>
</html>
and the underlying code for the click event of the "Execute" button
protected void executeButton_Click(object sender, EventArgs e)
{
//get the execution symbol entered in the TextBox
string executionSymbol = symbolTextBox.Text;
//get the stock quote information
string quoteInfo = GetStockQuoteInformation(executionSymbol);
//HtmlEncode the string to properly render it on the page
string htmlEncodedResult = System.Web.HttpUtility.HtmlEncode(quoteInfo);
//assign the HtmlEncoded string to our Label control
xmlResultLabel.Text = htmlEncodedResult;
}
As you can see the code above does the job of displaying the retuned xml from the webservice. It works. We can understand that XML because we are techie enough but imagine a normal user seeing a xml values on his screen? Yup. Not good. The best way to present data to a user is to show values in tabular form. A lot more pleasing to the eyes and much easier to understand. With that said let's start by replacing the Label control in the form with a DetailsView control. The new aspx page for our form should look like this:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Keith Rull's Consuming Web Services Sample</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<strong>Symbol</strong><br />
<asp:TextBox ID="symbolTextBox"
runat="server" />
<asp:Button ID="executeButton"
runat="server"
Text="Execute"
OnClick="executeButton_Click" />
<br />
<br />
<strong>Result</strong> <br />
<asp:DetailsView ID="stockQuoteInfoDetailsView" runat="server" Height="50px" Width="125px">
</asp:DetailsView>
</div>
</form>
</body>
</html>
As you can see in the old code for the Click event we are able to get the XML and display it on a Label. What we need to do now is to read that XML string and assign it to a our DetailsView but there is one problem... The XML string needs to be converted to an object that supports IList or IEnumerable first before it could be loaded to our DetailsView.
To solve this problem I've decided to create this method that accepts an XML string and converts it to a DataSet.
/// <summary>
/// A function that takes an XML string and converts it into a DataSet
/// </summary>
/// <param name="xmlString">The xml string to tranform into a DataSet</param>
/// <returns>The DataSet representing the values and schema from our xml string</returns>
private DataSet XmlString2DataSet(string xmlString)
{
//create a new DataSet that will hold our values
DataSet quoteDataSet = null;
//check if the xmlString is not blank
if (String.IsNullOrEmpty(xmlString)) {
//stop the processing
return quoteDataSet;
}
try{
//create a StringReader object to read our xml string
using (StringReader stringReader = new StringReader(xmlString))
{
//initialize our DataSet
quoteDataSet = new DataSet();
//load the StringReader to our DataSet
quoteDataSet.ReadXml(stringReader);
}
}
catch{
//return null
quoteDataSet = null;
}
//return the DataSet containing the stock information
return quoteDataSet;
}
Now we can modify our our executeButton_Click event
protected void executeButton_Click(object sender, EventArgs e)
{
//get the execution symbol entered in the TextBox
string executionSymbol = symbolTextBox.Text;
//get the stock quote information
string quoteInfo = GetStockQuoteInformation(executionSymbol);
//create our quote DataTable
DataSet quoteDataSet = XmlString2DataSet(quoteInfo);
//assign the quote information to our DetailsView
stockQuoteInfoDetailsView.DataSource = quoteDataSet;
stockQuoteInfoDetailsView.DataBind();
}
All we did was pass the xml string to the XmlString2DataSet function to retrieve a DataSet containing the stock quote information and then assigning that DataSet object to our DetailsView for display. Below is how the final form looks-like after our modification

Now that is more presentable! I hope I was able to share with you something useful. Next stop, we'll be building Master-Detail pages in ASP.NET ;)
Care for the code? Grab it here: KeithRull.ConsumingWebServices.Part2.zip (5.76 KB)