imfpalne
asked on
C# XmlTextReader gets: The thread XXXX has exited with code 259 (0x103).
Hi Experts,
I'm trying to learn ASP.net/C# and have run into an issue I'm not able to solve myself.
I'm trying to seed a list of Postal Codes into my own DB from a publicly available XML file - but when I try to run the seed, it is incredibly slow - and I randomly receive an "The thread XXXX has exited with code 259 (0x103)."
I've added some Debug statements to test if the data received is valid, and it is actually adding the data to my local DB.
What might be causing this performance issue? And what might be a better solution? (see code below)
Best regards
Ian
My code so far:
-------------------------- ---------- ---------- ---------- --------
public ActionResult Seed()
{
ApplicationDbContext db = new ApplicationDbContext();
var postalCodes = new List<PostalCode>();
String URLString = "http://geo.oiorest.dk/postnumre.xml";
XmlTextReader reader = new XmlTextReader(URLString);
int fra = 0;
int til = 0;
String navn = "";
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "postnummer")
{
reader.ReadToDescendant("f ra");
fra = reader.ReadElementContentA sInt();
reader.MoveToContent();
til = reader.ReadElementContentA sInt();
Debug.WriteLine("fra: " + fra + " til: " + til);
reader.MoveToContent();
navn = reader.ReadElementContentA sString();
Debug.WriteLine(navn);
if (til > fra)
{
for (int i = 0; i <= til - fra; i++)
{
String postnr = "" + (fra + i);
Debug.WriteLine(postnr);
postalCodes.Add(new PostalCode { City = navn, PostalCodeTxt = postnr });
}
}
else
{
postalCodes.Add(new PostalCode { City = navn, PostalCodeTxt = "" + fra });
}
foreach (var temp in postalCodes)
{
db.PostalCodes.Add(temp);
}
db.SaveChanges();
}
}
return RedirectToAction("Index");
}
I'm trying to learn ASP.net/C# and have run into an issue I'm not able to solve myself.
I'm trying to seed a list of Postal Codes into my own DB from a publicly available XML file - but when I try to run the seed, it is incredibly slow - and I randomly receive an "The thread XXXX has exited with code 259 (0x103)."
I've added some Debug statements to test if the data received is valid, and it is actually adding the data to my local DB.
What might be causing this performance issue? And what might be a better solution? (see code below)
Best regards
Ian
My code so far:
--------------------------
public ActionResult Seed()
{
ApplicationDbContext db = new ApplicationDbContext();
var postalCodes = new List<PostalCode>();
String URLString = "http://geo.oiorest.dk/postnumre.xml";
XmlTextReader reader = new XmlTextReader(URLString);
int fra = 0;
int til = 0;
String navn = "";
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "postnummer")
{
reader.ReadToDescendant("f
fra = reader.ReadElementContentA
reader.MoveToContent();
til = reader.ReadElementContentA
Debug.WriteLine("fra: " + fra + " til: " + til);
reader.MoveToContent();
navn = reader.ReadElementContentA
Debug.WriteLine(navn);
if (til > fra)
{
for (int i = 0; i <= til - fra; i++)
{
String postnr = "" + (fra + i);
Debug.WriteLine(postnr);
postalCodes.Add(new PostalCode { City = navn, PostalCodeTxt = postnr });
}
}
else
{
postalCodes.Add(new PostalCode { City = navn, PostalCodeTxt = "" + fra });
}
foreach (var temp in postalCodes)
{
db.PostalCodes.Add(temp);
}
db.SaveChanges();
}
}
return RedirectToAction("Index");
}
ASKER
Thank you for your reply ste5an, however I would prefer a solution that would allow me to update my own data from an API kind of XML feed - I know that there is rarely changes to a list of Postal Codes, however should that happen, I take it that your solution would require me to re-download and serialize the XML - am I correct?
Yes, you are. But it doesn't matters.
Cause your manual XML processing makes also assumptions to the XML file used. The only difference is that in this case it is sufficient to display it in a browser (download) and code the necessary steps (recreate postnumre.cs). So you're basically doing the same, just using different techniques.
But the solution would imho be the same, just download the entire file before processing it.
Cause your manual XML processing makes also assumptions to the XML file used. The only difference is that in this case it is sufficient to display it in a browser (download) and code the necessary steps (recreate postnumre.cs). So you're basically doing the same, just using different techniques.
But the solution would imho be the same, just download the entire file before processing it.
ASKER
Hi Ste5an, I've tried your solution - and it works. However, it's not the solution I'm after, let's say I was retrieving data from an XML source that was updated twice a week. With your method, I would have to manually download and prepare the XML file twice a week (assuming that I actually know the update cycle even..) - I need a way to dynamically call the XML whenever I choose to, check my "local" DB to see if there are any changes, and then update my local DB with the changes.
As I found out - the source also offers jSon data if that makes it any easier?
As I found out - the source also offers jSon data if that makes it any easier?
Maybe, when it solves your problem.
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
ASKER
The answer in this thread is exactly what I was looking for - it speeds up the proces by loading the entire XML to a String and then process the string with xmlreader.read(String)
1
Download the file to your development system. Store it e.g. under C:\Temp.2
Open the Developer Command Prompt for VS2013.3
In the prompt, goto C:\Temp (or where you saved your XML).4
Run xsd postnumre.xml5
Run xsd postnumre.xsd /classes6
Create a new project or open an existing one.7
Add the file created in step 5 to your solution.8
Use the built-in deserializer.Open in new window
When the error still occours, then download the file separatly, before feeding it into the deserialization.
And don't forget to add exception handling.