Re: [xml] False document empty errors while doing SAX2 with ParseChunk
- From: Daniel Veillard <veillard redhat com>
- To: Joachim Zobel <jz-2006 heute-morgen de>
- Cc: xml gnome org
- Subject: Re: [xml] False document empty errors while doing SAX2 with ParseChunk
- Date: Mon, 2 Apr 2007 15:07:08 -0400
On Mon, Apr 02, 2007 at 07:41:07PM +0200, Joachim Zobel wrote:
Hi.
I set up a parser context rather straightforward
memset(&fctx->handler, 0, sizeof(xmlSAXHandler));
//xmlSAX2InitDefaultSAXHandler(&fctx->handler, 0);
/*
* Set handlers
*/
#define CALLBACK(fn,hdl) fctx->handler.fn = hdl
CALLBACK(startDocument, xml2_bucket_create_xml_decl);
CALLBACK(comment, xml2_bucket_create_comment);
CALLBACK(startElementNs, xml2_bucket_create_start);
CALLBACK(endElementNs, xml2_bucket_create_end);
CALLBACK(ignorableWhitespace, xml2_bucket_create_white);
CALLBACK(cdataBlock, xml2_bucket_create_cdata);
CALLBACK(characters, xml2_bucket_create_character);
CALLBACK(processingInstruction, xml2_bucket_create_proc_instr);
CALLBACK(warning, xml2_sax_warning);
CALLBACK(error, xml2_sax_error);
// mark as SAX2
fctx->handler.initialized = XML_SAX2_MAGIC;
/* set up the parser */
fctx->sz_parsed = 0;
xmlParserCtxt *parser = xmlCreatePushParserCtxt(&fctx->handler,
fctx,NULL,0,NULL);
with fctx of type
typedef struct
{
xmlParserCtxt parser;
....
When I then do
xmlParserErrors err = xmlParseChunk(&fctx->parser, buf, len, 0);
the first call succeeds and the sax events are generated.
The second call however gives me an error 4 - Document is empty. I know
from the trace log this is not true.
Any hints what is going wrong (or shall I simply continue searching for
memory corruption)?
1/ do NOT use SAX unless you really know what you are doing and/or
want to shave microseconds. Use the reader instead
http://xmlsoft.org/xmlreader.html
2/ the code is incomplete, no way I can guess what's going on
e.g. where is fctx->parser initialized ?
3/ I suggest to follow the guidelines
http://xmlsoft.org/bugs.html
try with xmllint --push on your document , verify it work, then
base you code on xmllint.c section where --push is implemented.
that should show how to use the push section, for the
SAX block initialization see the section for --sax option
Daniel
--
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard | virtualization library http://libvirt.org/
veillard redhat com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]