|
Thanx a lot for the response.
I have checked SystemException it does not gives the line no throwing exception.
and the Environment.StackTrace gives result in the debug build but doesnt work for the release build.
Is there any other way ?? plz let me know
NOthignhere
|
|
|
|
|
Environment.StackTrace works fine in release mode. What makes it doesn't work for you? Another alternative is to use Trace class to make your own trace calls.
Regards
|
|
|
|
|
I have a program that cycles through an XML file and outputs to another file every 1000 records. Thyis works fine until the end of the XML file is reached, when it fails saying my 'root' tag is not closed - although it does for the previous files. It seems to be having issues with recognising the end of the XML file, so can someone please confirm how this is done? Currently I have a while loop to do this, with a for loop inside to cycle through the records, ie:
while (XmlReader.Read())
{
...
for (int i = 1; i <= 100; i++)
{
while (reads in a node here)
{
does the work
}
}
Close the XmlReader and XmlWriter
}
This works fine for the beginning, until the end of the file is reached; is my way of reading the XML file correct (I have also tried XmlReader != null), or is there a better way?
Many thanks.
|
|
|
|
|
Judging by your description of the error have you made sure that you close all the tags you open with XmlWriter?
<br />
<br />
xw.WriteStartDocument must be closed by xw.WriteEndDocument <code>
xw.WriteStartElement must be closed by xw.WriteEndElement (even for the root node)
Just Google it.
Failing that try phoning
|
|
|
|
|
Thanks for the reply.
I do ensure I have a 'closing' tag for every 'opening' one. This works fine for all files (say, 10 files of 100 records each), but on the last file, where the end of the original file is found, it fails. I believe my method to read it is fine, yet it fails (somehow!) when reading the end of the file. So I am really puzzled!
Oh, and I've googled lots to no joy!!!
|
|
|
|
|
When you hit the end-of-file do you make sure that all the nodes are closed in the output stream?
It'd be a help if you could copy & paste the details of the exception thrown as well, so that we can see if it's a reading or writing problem.
Just Google it.
Failing that try phoning
|
|
|
|
|
I do ensure all nodes are closed when the end of file is found - at least I think so, but I am sure it is something in that area that is causing the problem.
As for the exception, there isn't one; the program doesn't complete. The XML file's are created, but in the last one towards the end of the file, in the middle of a record is the message:
"XML page cannot be displayed
The following tags were not closed: message."
Where message is my root node. Yet it closes them in the other files (when the original XML file still has more records to read)...
|
|
|
|
|
Can you show the bits of code which are executed when the end-of file is reached?
Just Google it.
Failing that try phoning
|
|
|
|
|
Here is my code:
while (XmlReader.Read() && nodeCounter <= 1000)
{
// Create a file to write to
XmlTextWriter XmlWriter = new XmlTextWriter(directory + "\\Output" + x + " CIS_KASN.xml", null);
XmlWriter.Formatting = Formatting.Indented;
// Write the header details to the new file
XmlWriter.WriteProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'");
XmlWriter.WriteComment("This XML message contains CIS Key Accounts and Special Needs records for inserting/updating in the IAR");
XmlWriter.WriteStartElement("message");
XmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
XmlWriter.WriteAttributeString("xsi", "noNamespaceSchemaLocation", null, "CISKASN.xsd");
// Write each row to the file, until 1000 records have been written
for (int i = 1; i <= 1000; i++)
{
while (XmlReader.Name != "CISKASNRecord")
{
XmlReader.Read();
}
XmlWriter.WriteNode(XmlReader, true);
XmlWriter.Flush();
}
// Tidy up and close the file so that a new one can be opened
XmlWriter.Flush();
XmlWriter.Close();
nodeCounter++;
x++;
}
The program runs fine if I reduce my for-loop to 10 (thus not reading the end of file). At 1000 I get an XML error saying the 'message' tag is not closed and the program doesn't complete...
|
|
|
|
|
bigove wrote: for (int i = 1; i <= 1000; i++)
You need a condition here to test for the EOF me thinks. You're loop statements look a bit dodgy, might I suggest something like this:
private void Process(XmlReader xr)
{
int recordCount = 0;
int fileCount = 0;
XmlTextWriter xtw = OpenFile(fileCount++);
while (xr.Read())
{
<font face="Courier New"> </font><font face="Courier New">while xr != "CISKASNRecord")
xr.Read();
xtw.WriteNode(xr, true);</font>
<font face="Courier New"> xtw.Flush();</font>
recordCount++;
if (recordCount == 1000)
{
xtw.Close();
xtw.Flush();
xtw = null;
xtw = OpenFile(fileCount++);
}
}
if (xtw != null)
{
xtw.Close();
xtw.Dispose();
xtw = null;
}
}
private XmlTextWriter OpenFile(int index)
{
XmlTextWriter xtw = new XmlTextWriter(Path.Combine(directory, string.Format("Output{0}CIS_KASN.xml", index)), null);
xtw.Formatting = Formatting.Indented;
<font face="Courier New"> xtw.WriteProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'");
xtw.WriteComment("This XML message contains CIS Key Accounts and Special Needs records for inserting/updating in the IAR");
xtw.WriteStartElement("message");
xtw.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
xtw.WriteAttributeString("xsi", "noNamespaceSchemaLocation", null, "CISKASN.xsd");
return xtw;</font>
} The benefit of this solution is there is only one place where you check for the end-of-file condition and similarly one place where you check for the end-of-batch condition.
Just Google it.
Failing that try phoning
|
|
|
|
|
Thank you for the help.
Trying that code, the 'Dispose' method is inaccessible. But commetning that out, the code compiles...but nothing is output. Am I missing something obvious?!
|
|
|
|
|
bigove wrote: 'Dispose' method is inaccessible
Oops, my memory must be getting full
bigove wrote: Am I missing something obvious?!
No I probably am.
Give me a few minutes to check over the code.
Just Google it.
Failing that try phoning
|
|
|
|
|
The condition within the second while loops is incorrect, should be while (xr.Name != "...") . It's never ending so it scans through the whole file thus nothign is output (I think).
Just Google it.
Failing that try phoning
|
|
|
|
|
I'd already noticed that and added the 'Name' part to my code - but still do not get any output...
|
|
|
|
|
Have you tried stepping through the code in the debugger, or just write something to the console just so you can see what order things are being done in.
Just Google it.
Failing that try phoning
|
|
|
|
|
I have, things work in the right order. It looks to be a problem reading the end of the file, it's always the last file output that fails...
|
|
|
|
|
Did you notice anything different in it's operation when you were getting to the the end of the file? (While debugging).
Just Google it.
Failing that try phoning
|
|
|
|
|
No. It did seem to go through the for-loop a few too may times in a weird way, but still worked 'as expected' (at least until the end of file was reached). Which I didn't understand, I have to admit.
Trying a different plan, I have tried a switch statement rather than a for-loop; this seems to reach the end of the file OK, but has weird output. It creates 1000+ files of one record each, but doesn't begin writing nodes (only the header info) until record 23! The switch statement is (in place of the for-loop):
switch (XmlReader.Name)
{
case "CISKASNRecord":
XmlWriter.WriteNode(XmlReader, true);
break;
case "message":
XmlWriter.WriteFullEndElement();
break;
}
Does this make more sense?
|
|
|
|
|
Just noticed that in the snippets I provided I did not reset recordCount to 0 inside the if (recordCount == 0) . Have you done this?
Just Google it.
Failing that try phoning
|
|
|
|
|
THere is nor if (recordCount == 0); there is one that checks to see if it was 1000, but surely that should be the case?
|
|
|
|
|
Sorry, inside the check for 1000 records (where we close the file and open a new one) it should also set recordCount to 0 otherwise more files will not be created.
|
|
|
|
|
Still no joy - no files are output. The program runs and completes, but there are no files created.
|
|
|
|
|
Any chance of sending the Xml file?
|
|
|
|
|
Not really, as it's a work thing and I'd be fired if it went outside!
But the format is EXACTLY as follows:
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!--
This XML message contains CIS Key Accounts and Special Needs records for
inserting/updating in the IAR
-->
- <message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CISKASN.xsd">
- <messageHeader>
<batchID>1</batchID>
<records>1016</records>
<messageNo>20060918165555</messageNo>
</messageHeader>
- <CISKASNRecord>
<changeFlag>I</changeFlag>
<propertyNum>123456789</propertyNum>
<pointX>533935.3</pointX>
<pointY>189061.2</pointY>
<osAPR>AP70H9815GH56N2GHR</osAPR>
<keyActCode>F</keyActCode>
<dialysisCust>Y</dialysisCust>
<serviceCode>21</serviceCode>
<circumstanceCode>1</circumstanceCode>
<sicCode>999</sicCode>
<hospitalCode>CODEHERE</hospitalCode>
<hospitalName>Hospital Name</hospitalName>
<address1>Address Line 1</address1>
<address2>Address Line 2</address2>
<address3>Address Line 3</address3>
<address4>Town/City</address4>
<address5>County</address5>
<postcode>Postcode</postcode>
</CISKASNRecord>
- <CISKASNRecord>
Same again - for however many records
</CISKASNRecord>
</message>
|
|
|
|
|
Ok, thanks for that though, I'm afraid I can't do much for the next couple of hours as I'm going out to help someone, but after that I'll take a look.
|
|
|
|