What I still couldn't get to work was getting the data in Xml and converting it cleanly to Json.
Problem thus far are the child nodes and the fact that the conversion methods kept leaving escape slashes in the Json string, despite running it through Regex.Unescape.
And in truth, there may be no logical reason why I should need to do such a conversion, since my other 2 methods cleanly placed data from both formats into my webgrid's class.
My Xml method did it by first reading all the data into a dataset, from whence the data went into my class List feeding the webgrid.
I wanted another way of dealing with the Xml, for better, worse, or just for variety and learning sake.
Thanks to this great blog article by Saiful Alam, at http://asp-net-example.blogspot.com/2009/05/xmlreadersettings-how-to-use.html, I got my 2nd Xml to List method.
public List getDataX2()//for xml source xml to list direct - no middleman
{
List bi = new List();
string uri = baseUrix;
string em = "";
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.DtdProcessing = DtdProcessing.Parse;
int bc = 0;
bool runBiAdd = false;
try
{
using (XmlReader reader = XmlReader.Create(uri, settings))
{
//cannot use an instance of BusInfo inside reader - must use local variables
string btitle = "";
string burl = "";
string bdescription = "";
string bkeywords = "";
string bcategory = "";
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
runBiAdd = false;
switch (reader.Name)
{
case "title":
bc++;
btitle = reader.ReadString().ToString();
runBiAdd = true;
break;
case "url":
bc++;
burl = reader.ReadString().ToString();
runBiAdd = true;
break;
case "description":
bc++;
bdescription = reader.ReadString().ToString();
runBiAdd = true;
break;
case "keywords":
bc++;
bkeywords = reader.ReadString().ToString();
runBiAdd = true;
break;
case "category":
bc++;
bcategory = reader.ReadString().ToString();
runBiAdd = true;
break;
default:
break;
}
if (runBiAdd = true && bc == 5)
{
bi.Add(new BusInfo(btitle,burl,bdescription,bkeywords,bcategory));//see notes by constructor above
bc = 0;
}
}
}
}
}
catch (Exception ex)
{
em = "An Error Occured: " + ex.Message;
bi.Clear();
}
return bi;
}//end getDataX2
One issue I didn't consider while making this method, was the bugaboo when I attempted to keep reusing an instance of my BusInfo class, to add to my List during the reader's iterations.
As those of you who are already laughing at me already knew (however many "those-of-you"s there are), within the scope of this code, setting properties of a BusInfo instance for each iteration of the reader, in order to then add to the list, eg: BusInfoList.Add(BusInfoInstance), ends up changing all previous items in the list to the latest, and not so greatest, property values added to the newest item.
To fix this, I gave the class a constructor override with the 5 class properties as parameters, hence giving me the list.Add line "bi.Add(new BusInfo(btitle,burl,bdescription,bkeywords,bcategory));"
The constructors I added to the class:
public BusInfo()
: base()
{
}
public BusInfo(string t, string u, string d, string k, string c)
{
title = t;
url = u;
description = d;
keywords = k;
category = c;
}
{
List
string uri = baseUrix;
string em = "";
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.DtdProcessing = DtdProcessing.Parse;
int bc = 0;
bool runBiAdd = false;
try
{
using (XmlReader reader = XmlReader.Create(uri, settings))
{
//cannot use an instance of BusInfo inside reader - must use local variables
string btitle = "";
string burl = "";
string bdescription = "";
string bkeywords = "";
string bcategory = "";
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
runBiAdd = false;
switch (reader.Name)
{
case "title":
bc++;
btitle = reader.ReadString().ToString();
runBiAdd = true;
break;
case "url":
bc++;
burl = reader.ReadString().ToString();
runBiAdd = true;
break;
case "description":
bc++;
bdescription = reader.ReadString().ToString();
runBiAdd = true;
break;
case "keywords":
bc++;
bkeywords = reader.ReadString().ToString();
runBiAdd = true;
break;
case "category":
bc++;
bcategory = reader.ReadString().ToString();
runBiAdd = true;
break;
default:
break;
}
if (runBiAdd = true && bc == 5)
{
bi.Add(new BusInfo(btitle,burl,bdescription,bkeywords,bcategory));//see notes by constructor above
bc = 0;
}
}
}
}
}
catch (Exception ex)
{
em = "An Error Occured: " + ex.Message;
bi.Clear();
}
return bi;
}//end getDataX2
One issue I didn't consider while making this method, was the bugaboo when I attempted to keep reusing an instance of my BusInfo class, to add to my List
As those of you who are already laughing at me already knew (however many "those-of-you"s there are), within the scope of this code, setting properties of a BusInfo instance for each iteration of the reader, in order to then add to the list, eg: BusInfoList.Add(BusInfoInstance), ends up changing all previous items in the list to the latest, and not so greatest, property values added to the newest item.
To fix this, I gave the class a constructor override with the 5 class properties as parameters, hence giving me the list.Add line "bi.Add(new BusInfo(btitle,burl,bdescription,bkeywords,bcategory));"
The constructors I added to the class:
public BusInfo()
: base()
{
}
public BusInfo(string t, string u, string d, string k, string c)
{
title = t;
url = u;
description = d;
keywords = k;
category = c;
}
No comments:
Post a Comment