blob: 0ba43969ec4430142781e73974d24f9c9df9d0eb [file] [log] [blame]
Daniel Veillard1177ca42003-04-26 22:29:54 +00001<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><link rel="SHORTCUT ICON" href="/favicon.ico" /><style type="text/css">
Daniel Veillard373a4752002-02-21 14:46:29 +00004TD {font-family: Verdana,Arial,Helvetica}
5BODY {font-family: Verdana,Arial,Helvetica; margin-top: 2em; margin-left: 0em; margin-right: 0em}
6H1 {font-family: Verdana,Arial,Helvetica}
7H2 {font-family: Verdana,Arial,Helvetica}
8H3 {font-family: Verdana,Arial,Helvetica}
Daniel Veillardb8cfbd12001-10-25 10:53:28 +00009A:link, A:visited, A:active { text-decoration: underline }
Daniel Veillardd49370e2005-04-11 23:28:16 +000010</style><title>The SAX interface</title></head><body bgcolor="#8b7765" text="#000000" link="#a06060" vlink="#000000"><table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr><td width="120"><a href="http://swpat.ffii.org/"><img src="epatents.png" alt="Action against software patents" /></a></td><td width="180"><a href="http://www.gnome.org/"><img src="gnome2.png" alt="Gnome2 Logo" /></a><a href="http://www.w3.org/Status"><img src="w3c.png" alt="W3C Logo" /></a><a href="http://www.redhat.com/"><img src="redhat.gif" alt="Red Hat Logo" /></a><div align="left"><a href="http://xmlsoft.org/"><img src="Libxml2-Logo-180x168.gif" alt="Made with Libxml2 Logo" /></a></div></td><td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"><h1>The XML C parser and toolkit of Gnome</h1><h2>The SAX interface</h2></td></tr></table></td></tr></table></td></tr></table><table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Developer Menu</b></center></td></tr><tr><td bgcolor="#fffacd"><form action="search.php" enctype="application/x-www-form-urlencoded" method="get"><input name="query" type="text" size="20" value="" /><input name="submit" type="submit" value="Search ..." /></form><ul><li><a href="index.html" style="font-weight:bold">Main Menu</a></li><li><a href="html/index.html" style="font-weight:bold">Reference Manual</a></li><li><a href="examples/index.html" style="font-weight:bold">Code Examples</a></li><li><a href="guidelines.html">XML Guidelines</a></li><li><a href="tutorial/index.html">Tutorial</a></li><li><a href="xmlreader.html">The Reader Interface</a></li><li><a href="ChangeLog.html">ChangeLog</a></li><li><a href="XSLT.html">XSLT</a></li><li><a href="python.html">Python and bindings</a></li><li><a href="architecture.html">libxml2 architecture</a></li><li><a href="tree.html">The tree output</a></li><li><a href="interface.html">The SAX interface</a></li><li><a href="xmlmem.html">Memory Management</a></li><li><a href="xmlio.html">I/O Interfaces</a></li><li><a href="library.html">The parser interfaces</a></li><li><a href="entities.html">Entities or no entities</a></li><li><a href="namespaces.html">Namespaces</a></li><li><a href="upgrade.html">Upgrading 1.x code</a></li><li><a href="threads.html">Thread safety</a></li><li><a href="DOM.html">DOM Principles</a></li><li><a href="example.html">A real example</a></li><li><a href="xml.html">flat page</a>, <a href="site.xsl">stylesheet</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="APIchunk0.html">Alphabetic</a></li><li><a href="APIconstructors.html">Constructors</a></li><li><a href="APIfunctions.html">Functions/Types</a></li><li><a href="APIfiles.html">Modules</a></li><li><a href="APIsymbols.html">Symbols</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="http://mail.gnome.org/archives/xml/">Mail archive</a></li><li><a href="http://xmlsoft.org/XSLT/">XSLT libxslt</a></li><li><a href="http://phd.cs.unibo.it/gdome2/">DOM gdome2</a></li><li><a href="http://www.aleksey.com/xmlsec/">XML-DSig xmlsec</a></li><li><a href="ftp://xmlsoft.org/">FTP</a></li><li><a href="http://www.zlatkovic.com/projects/libxml/">Windows binaries</a></li><li><a href="http://www.blastwave.org/packages.php/libxml2">Solaris binaries</a></li><li><a href="http://www.explain.com.au/oss/libxml2xslt.html">MacOsX binaries</a></li><li><a href="http://libxmlplusplus.sourceforge.net/">C++ bindings</a></li><li><a href="http://www.zend.com/php5/articles/php5-xmlphp.php#Heading4">PHP bindings</a></li><li><a href="http://sourceforge.net/projects/libxml2-pas/">Pascal bindings</a></li><li><a href="http://rubyforge.org/projects/xml-tools/">Ruby bindings</a></li><li><a href="http://tclxml.sourceforge.net/">Tcl bindings</a></li><li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxml2">Bug Tracker</a></li></ul></td></tr></table></td></tr></table></td><td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"><p>Sometimes the DOM tree output is just too large to fit reasonably into
Daniel Veillardc9484202001-10-24 12:35:52 +000011memory. In that case (and if you don't expect to save back the XML document
12loaded using libxml), it's better to use the SAX interface of libxml. SAX is
13a <strong>callback-based interface</strong> to the parser. Before parsing,
14the application layer registers a customized set of callbacks which are
Daniel Veillard1177ca42003-04-26 22:29:54 +000015called by the library as it progresses through the XML input.</p><p>To get more detailed step-by-step guidance on using the SAX interface of
Daniel Veillardc9484202001-10-24 12:35:52 +000016libxml, see the <a href="http://www.daa.com.au/~james/gnome/xml-sax/xml-sax.html">nice
17documentation</a>.written by <a href="mailto:james@daa.com.au">James
Daniel Veillard1177ca42003-04-26 22:29:54 +000018Henstridge</a>.</p><p>You can debug the SAX behaviour by using the <strong>testSAX</strong>
Daniel Veillardc9484202001-10-24 12:35:52 +000019program located in the gnome-xml module (it's usually not shipped in the
20binary packages of libxml, but you can find it in the tar source
21distribution). Here is the sequence of callbacks that would be reported by
Daniel Veillard1177ca42003-04-26 22:29:54 +000022testSAX when parsing the example XML document shown earlier:</p><pre>SAX.setDocumentLocator()
Daniel Veillardc9484202001-10-24 12:35:52 +000023SAX.startDocument()
24SAX.getEntity(amp)
25SAX.startElement(EXAMPLE, prop1='gnome is great', prop2='&amp;amp; linux too')
26SAX.characters( , 3)
27SAX.startElement(head)
28SAX.characters( , 4)
29SAX.startElement(title)
30SAX.characters(Welcome to Gnome, 16)
31SAX.endElement(title)
32SAX.characters( , 3)
33SAX.endElement(head)
34SAX.characters( , 3)
35SAX.startElement(chapter)
36SAX.characters( , 4)
37SAX.startElement(title)
38SAX.characters(The Linux adventure, 19)
39SAX.endElement(title)
40SAX.characters( , 4)
41SAX.startElement(p)
42SAX.characters(bla bla bla ..., 15)
43SAX.endElement(p)
44SAX.characters( , 4)
45SAX.startElement(image, href='linus.gif')
46SAX.endElement(image)
47SAX.characters( , 4)
48SAX.startElement(p)
49SAX.characters(..., 3)
50SAX.endElement(p)
51SAX.characters( , 3)
52SAX.endElement(chapter)
53SAX.characters( , 1)
54SAX.endElement(EXAMPLE)
Daniel Veillard8a469172003-06-12 16:05:07 +000055SAX.endDocument()</pre><p>Most of the other interfaces of libxml2 are based on the DOM tree-building
Daniel Veillardc9484202001-10-24 12:35:52 +000056facility, so nearly everything up to the end of this document presupposes the
57use of the standard DOM tree build. Note that the DOM tree itself is built by
58a set of registered default callbacks, without internal specific
Daniel Veillard1177ca42003-04-26 22:29:54 +000059interface.</p><p><a href="bugs.html">Daniel Veillard</a></p></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></body></html>