http://swpat.ffii.org/Action against software patents http://www.gnome.org/Gnome2 Logo http://www.w3.org/StatusW3C Logo http://www.redhat.com/Red Hat Logo http://xmlsoft.org/Made with Libxml2 Logo The XML C parser and toolkit of Gnome
I/O Interfaces
Developer Menu index.htmlMain Menu html/index.htmlReference Manual examples/index.htmlCode Examples guidelines.htmlXML Guidelines tutorial/index.htmlTutorial xmlreader.htmlThe Reader Interface ChangeLog.htmlChangeLog XSLT.htmlXSLT python.htmlPython and bindings architecture.htmllibxml2 architecture tree.htmlThe tree output interface.htmlThe SAX interface xmlmem.htmlMemory Management xmlio.htmlI/O Interfaces library.htmlThe parser interfaces entities.htmlEntities or no entities namespaces.htmlNamespaces upgrade.htmlUpgrading 1.x code threads.htmlThread safety DOM.htmlDOM Principles example.htmlA real example xml.htmlflat page , site.xslstylesheet API Indexes APIchunk0.htmlAlphabetic APIconstructors.htmlConstructors APIfunctions.htmlFunctions/Types APIfiles.htmlModules APIsymbols.htmlSymbols Related links http://mail.gnome.org/archives/xml/Mail archive http://xmlsoft.org/XSLT/XSLT libxslt http://phd.cs.unibo.it/gdome2/DOM gdome2 http://www.aleksey.com/xmlsec/XML-DSig xmlsec ftp://xmlsoft.org/FTP http://www.zlatkovic.com/projects/libxml/Windows binaries http://www.blastwave.org/packages.php/libxml2Solaris binaries http://www.explain.com.au/oss/libxml2xslt.htmlMacOsX binaries http://libxmlplusplus.sourceforge.net/C++ bindings http://www.zend.com/php5/articles/php5-xmlphp.php#Heading4PHP bindings http://sourceforge.net/projects/libxml2-pas/Pascal bindings http://rubyforge.org/projects/xml-tools/Ruby bindings http://tclxml.sourceforge.net/Tcl bindings http://bugzilla.gnome.org/buglist.cgi?product=libxml2Bug Tracker Table of Content:
#General1General overview   
#basicThe basic buffer type   
#InputInput I/O handlers   
#OutputOutput I/O handlers   
#entitiesThe entities loader   
#Example2Example of customized I/O General overview 
The module http://xmlsoft.org/html/libxml-xmlio.htmlxmlIO.h  provides
the interfaces to the libxml2 I/O system. This consists of 4 main parts:
Entities loader, this is a routine which tries to fetch the entities
    (files) based on their PUBLIC and SYSTEM identifiers. The default loader
    don't look at the public identifier since libxml2 do not maintain a
    catalog. You can redefine you own entity loader by using
    
xmlGetExternalEntityLoader() and
    
xmlSetExternalEntityLoader(). #entitiesCheck the
    example
.  
Input I/O buffers which are a commodity structure used by the parser(s)
    input layer to handle fetching the informations to feed the parser. This
    provides buffering and is also a placeholder where the encoding
    converters to UTF8 are piggy-backed.
  
Output I/O buffers are similar to the Input ones and fulfill similar
    task but when generating a serialization from a tree.
  
A mechanism to register sets of I/O callbacks and associate them with
    specific naming schemes like the protocol part of the URIs.
    
This affect the default I/O operations and allows to use specific I/O
    handlers for certain names.
  
The general mechanism used when loading http://rpmfind.net/xml.html for
example in the HTML parser is the following:
The default entity loader calls xmlNewInputFromFile() with
    the parsing context and the URI string.
  
the URI string is checked against the existing registered handlers
    using their match() callback function, if the HTTP module was compiled
    in, it is registered and its match() function will succeeds
  
the open() function of the handler is called and if successful will
    return an I/O Input buffer
  
the parser will the start reading from this buffer and progressively
    fetch information from the resource, calling the read() function of the
    handler until the resource is exhausted
  
if an encoding change is detected it will be installed on the input
    buffer, providing buffering and efficient use of the conversion
  routines
  
once the parser has finished, the close() function of the handler is
    called once and the Input buffer and associated resources are
  deallocated.
The user defined callbacks are checked first to allow overriding of the
default libxml2 I/O routines.
The basic buffer type 
All the buffer manipulation handling is done using the
xmlBuffer type define in http://xmlsoft.org/html/libxml-tree.htmltree.h  which is a
resizable memory buffer. The buffer allocation strategy can be selected to be
either best-fit or use an exponential doubling one (CPU vs. memory use
trade-off). The values are 
XML_BUFFER_ALLOC_EXACT and
XML_BUFFER_ALLOC_DOUBLEIT, and can be set individually or on a
system wide basis using 
xmlBufferSetAllocationScheme(). A number
of functions allows to manipulate buffers with names starting with the
xmlBuffer... prefix.
Input I/O handlers 
An Input I/O handler is a simple structure
xmlParserInputBuffer containing a context associated to the
resource (file descriptor, or pointer to a protocol handler), the read() and
close() callbacks to use and an xmlBuffer. And extra xmlBuffer and a charset
encoding handler are also present to support charset conversion when
needed.
Output I/O handlers 
An Output handler xmlOutputBuffer is completely similar to an
Input one except the callbacks are write() and close().
The entities loader 
The entity loader resolves requests for new entities and create inputs for
the parser. Creating an input from a filename or an URI string is done
through the xmlNewInputFromFile() routine.  The default entity loader do not
handle the PUBLIC identifier associated with an entity (if any). So it just
calls xmlNewInputFromFile() with the SYSTEM identifier (which is mandatory in
XML).
If you want to hook up a catalog mechanism then you simply need to
override the default entity loader, here is an example:
#include <libxml/xmlIO.h>
xmlExternalEntityLoader defaultLoader = NULL;
xmlParserInputPtr
xmlMyExternalEntityLoader(const char *URL, const char *ID,
                               xmlParserCtxtPtr ctxt) {
    xmlParserInputPtr ret;
    const char *fileID = NULL;
    /* lookup for the fileID depending on ID */
    ret = xmlNewInputFromFile(ctxt, fileID);
    if (ret != NULL)
        return(ret);
    if (defaultLoader != NULL)
        ret = defaultLoader(URL, ID, ctxt);
    return(ret);
}
int main(..) {
    ...
    /*
     * Install our own entity loader
     */
    defaultLoader = xmlGetExternalEntityLoader();
    xmlSetExternalEntityLoader(xmlMyExternalEntityLoader);
    ...
}
Example of customized I/O 
This example come from http://xmlsoft.org/messages/0708.htmla
real use case
,  xmlDocDump() closes the FILE * passed by the application
and this was a problem. The 
http://xmlsoft.org/messages/0711.htmlsolution  was to redefine a
new output handler with the closing call deactivated:
First define a new I/O output allocator where the output don't close
    the file:
    
xmlOutputBufferPtr
xmlOutputBufferCreateOwn(FILE *file, xmlCharEncodingHandlerPtr encoder) {
xmlOutputBufferPtr ret;
if (xmlOutputCallbackInitialized == 0)
xmlRegisterDefaultOutputCallbacks();
if (file == NULL) return(NULL);
ret = xmlAllocOutputBuffer(encoder);
if (ret != NULL) {
ret->context = file;
ret->writecallback = xmlFileWrite;
ret->closecallback = NULL;  /* No close callback */
}
return(ret);
} 
  
  
And then use it to save the document:
    
FILE *f;
xmlOutputBufferPtr output;
xmlDocPtr doc;
int res;
f = ...
doc = ....
output = xmlOutputBufferCreateOwn(f, NULL);
res = xmlSaveFileTo(output, doc, NULL);
    
  
bugs.htmlDaniel Veillard 
