Re: [xml] Adding new slot in parser.h::_xmlParserCtxt



Hi Lilith,

Lilith wrote:
Hello,

I use libxml2, libxslt, and libxml2-python. In some tasks I need to redefine the default entity loader. My application runs in multithreaded mode, and each thread must have a different loader . Also imported and included stylesheets must be loaded with the same loader as their parent stylesheet. To implement this, I did the following: 1) added new `loaderId' slot in libxml2::include/libxml/tree.h:_xmlDoc structure; 2) added new `loaderId' slot in libxml2::include/libxml/parser.h: _xmlParserCtxt; 3) modified function `xsltDocDefaultLoaderFunc' changing the type of the fourth argument to `xsltStylesheetPtr ctxt' and added the following:
               pctxt = xmlNewParserCtxt();
        /* hacked */
        if (ctxt) {
                par = ctxt->parent;
                loaderId = ctxt->doc->loaderId;
                pctxt->loaderId = doc->loaderId = (xsltStylesheet *)ctxt->doc->loaderId;
        }
to `xsltDocDefaultLoaderFunc' (and modified every call of this function to pass the right argument); 4) added accessors for `loaderId' to the python wrappers in `parserCtxt' and `xmlDoc' classes;
If its the external entity loader you need to manage, within PHP, I use xmlParserInputBufferCreateFilenameDefault. Its per thread and allows me to take control of input handling for URIs, so we can use the PHP stream handlers for I/O without possible hijacking from outside sources. It is called by xmlNewInputFromFile and ultimately from xmlDefaultExternalEntityLoader. The xsl extension, as it depends on libxml2 ends up relying upon the custom handling as well.

Rob



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]