Hi Daniel,

Thank you very much. It works.


Le mer. 2 déc. 2015 à 09:10, Daniel Veillard <veill...@redhat.com> a écrit :

> On Tue, Dec 01, 2015 at 05:11:52PM +0000, David Boucher wrote:
> > Hi the list,
> >
> > I use libcurl to get a big chunk of xml data.
> >
> > In the CURLOPT_WRITEFUNCTION call back, I have a piece of memory with xml
> > data.
> >
> > The first time this callback is executed, we call xmlReaderNewMemory().
> > Then we call xmlTextReaderRead() while the result is 1.
> >
> > The XML being splitted, the loop finishes to fail because it needs
> > following datas...
> >
> > Thanks to xmlTextReaderByteConsumed, we are able to get data already read
> > and then the piece of data not read.
> >
> > The next time the callback is called, we are able to build a new buffer
> > containing :
> > * datas not already read from the previous call
> > * new data from the new call.
> >
> > My problem is here. I'm looking for a function that could change the
> buffer
> > to read to continue to parse xml data. I have tried xmlReaderNewMemory(),
> > but it fails...
> >
> > Maybe a such function does not exist, and maybe this idea to read
> different
> > buffers of a same xml is a bad idea.
> >
> > Is there a better way ? What are your advices ?
>
>   Err you want to use the push parser when you don't have all data
> available
> at parser creation time.
>
>   Get the xmllint.c program look at the code in parseAndPrintFile
> which handle the push testing case, it does something  like
>
>                 res = fread(chars, 1, 4, f);
>                 if (res > 0) {
>                     ctxt = xmlCreatePushParserCtxt(NULL, NULL,
>                                 chars, res, filename);
>                     xmlCtxtUseOptions(ctxt, options);
>                     while ((res = fread(chars, 1, size, f)) > 0) {
>                         xmlParseChunk(ctxt, chars, res, 0);
>                     }
>                     xmlParseChunk(ctxt, chars, 0, 1);
>                     doc = ctxt->myDoc;
>                     ret = ctxt->wellFormed;
>                     xmlFreeParserCtxt(ctxt);
>                     if (!ret) {
>                         xmlFreeDoc(doc);
>                         doc = NULL;
>
>   You create the parser context with first 4 bytes of your stream,
> define which options you want to use, and then xmlParseChunk( ... 0)
> for each part until you reach the end where you do xmlParseChunk( ... 1)
>
> Daniel
>
> > Thanks a lot.
> > Regards.
> > David.
>
> > _______________________________________________
> > xml mailing list, project page  http://xmlsoft.org/
> > xml@gnome.org
> > https://mail.gnome.org/mailman/listinfo/xml
>
>
> --
> Daniel Veillard      | Open Source and Standards, Red Hat
> veill...@redhat.com  | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
> http://veillard.com/ | virtualization library  http://libvirt.org/
>
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml@gnome.org
https://mail.gnome.org/mailman/listinfo/xml

Reply via email to