http://swpat.ffii.org/
Action against software patents
http://www.gnome.org/
Gnome2 Logo
http://www.w3.org/Status
W3C 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.html
Main Menu
html/index.html
Reference Manual
examples/index.html
Code Examples
guidelines.html
XML Guidelines
tutorial/index.html
Tutorial
xmlreader.html
The Reader Interface
ChangeLog.html
ChangeLog
XSLT.html
XSLT
python.html
Python and bindings
architecture.html
libxml2 architecture
tree.html
The tree output
interface.html
The SAX interface
xmlmem.html
Memory Management
xmlio.html
I/O Interfaces
library.html
The parser interfaces
entities.html
Entities or no entities
namespaces.html
Namespaces
upgrade.html
Upgrading 1.x code
threads.html
Thread safety
DOM.html
DOM Principles
example.html
A real example
xml.html
flat page
,
site.xsl
stylesheet
API Indexes
APIchunk0.html
Alphabetic
APIconstructors.html
Constructors
APIfunctions.html
Functions/Types
APIfiles.html
Modules
APIsymbols.html
Symbols
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/libxml2
Solaris binaries
http://www.explain.com.au/oss/libxml2xslt.html
MacOsX binaries
http://libxmlplusplus.sourceforge.net/
C++ bindings
http://www.zend.com/php5/articles/php5-xmlphp.php#Heading4
PHP 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=libxml2
Bug Tracker
Table of Content:
#General1
General overview
#basic
The basic buffer type
#Input
Input I/O handlers
#Output
Output I/O handlers
#entities
The entities loader
#Example2
Example of customized I/O
General overview
The module
http://xmlsoft.org/html/libxml-xmlio.html
xmlIO.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()
.
#entities
Check 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.html
tree.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.html
a
real use case
,  xmlDocDump() closes the FILE * passed by the application
and this was a problem. The
http://xmlsoft.org/messages/0711.html
solution
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.html
Daniel Veillard
