Re: Large data sets (Expat v2.0.0; compiled cygwin)

"Ben Keitch" <[email protected]>
Newsgroups gmane.text.xml.expat.general
Message-ID <[email protected]>
Brilliant, Lee, that would explain things. I did wonder if something like
that was going on.

I will do as you suggest and add chunks of text together.

Strangely I managed to have more success using Perl's wrapper around expat,
and perl. However, that takes 2 hours to run instead of 30 seconds!

Thanks again for you help,

Ben


On 15/05/07, Lee Passey <[email protected]> wrote:
>
> Ben Keitch wrote:
> > Can someone help me with this code. It is trying to convert an XML file
> of
> > book data to tab-deliminated. Should be simple, but it seems to mangle
> > about 200 of the 10000 records I give it. Supplying each record by
> itself,
> > it works fine. I don't understand why, but not being a C programmer, I
> > dare say I am mangling pointers, or there is a multithread issue I don't
> > understand.
> >
> > here is a typical error:
> > given lines 3380-3383 in a 917682 long XML file (it is well-formed
> > according to xmlwf):
> >
> > <record>
> > <ISBN10>0816044384</ISBN10>
> > <ISBN13>9780816044382</ISBN13>
> > <EAN>9780816044382</EAN>
> > ...
> > </record>
> >
> > the data given to the data handler (and printed to stderr) is:
> >
> > Data: 9780816   Data: 044382
> > Error : isbn10: 0816044384      isbn: 382       isbn13: 044382
> > Data:
> > Data: 9780816044382
> >
> > So in this case, ISBN10 was correct, but ISBN13 only got the last 6
> digits
> > on the first call, but managed to get all the data on the third call
> (the
> > second call gives a blank line! why?)
> >
> > If you give just this XML record to the program, it works fine.
> >
> > Any help greatly appreciated
>
> Be aware of two things: 1. in XML, whitespace /is/ significant, and 2.
> in Expat the character data handler may be called multiple times,
> sequentially, with partial data.
>
> In your case, you haven't indicated the definition of BUFSIZ. Let's
> assume that BUFSIZ is 256. If you read a file in 256-byte chunks, in all
> likelihood at some point you're going to split a chunk of CData. In this
> case, Expat will call the character data handler (or text handler) with
> the partial data, return to the main method to get more data, then call
> the handler with the remainder of the CData.
>
> Try this:
>
> Set a StartElement handler. When the handler is called, save the name of
> the element and set the start of the output buffer to zero. Now, every
> time the CharacterData handler is called, _and_ we are inside an element
> which can contain CData, /add/ the data to the output buffer. When the
> EndElement handler is called, check to make sure that it matches the
> start element (just in case the XML is badly formed) /then/ store the
> element name (or some translation thereof) and the output buffer you
> have accumulated.
>
> Of course, you may need to add code to deal with potential nested
> elements, but that is left as an exercise for the reader.
>
> --
> Nothing of significance below this line.
>
> _______________________________________________
> Expat-discuss mailing list
> [email protected]
> http://mail.libexpat.org/mailman/listinfo/expat-discuss
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.