/ libxml2 / doc / xml.html
xml.html
   1  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   2      "http://www.w3.org/TR/html4/loose.dtd">
   3  <html>
   4  <head>
   5    <title>The XML C parser and toolkit of Gnome</title>
   6    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
   7  </head>
   8  <body bgcolor="#ffffff">
   9  <h1 align="center">The XML C parser and toolkit of Gnome</h1>
  10  
  11  <h1>Note: this is the flat content of the <a href="index.html">web
  12  site</a></h1>
  13  
  14  <h1 style="text-align: center">libxml, a.k.a. gnome-xml</h1>
  15  
  16  <p></p>
  17  
  18  <p
  19  style="text-align: right; font-style: italic; font-size: 10pt">"Programming
  20  with libxml2 is like the thrilling embrace of an exotic stranger." <a
  21  href="http://diveintomark.org/archives/2004/02/18/libxml2">Mark
  22  Pilgrim</a></p>
  23  
  24  <p>Libxml2 is the XML C parser and toolkit developed for the Gnome project
  25  (but usable outside of the Gnome platform), it is free software available
  26  under the <a href="http://www.opensource.org/licenses/mit-license.html">MIT
  27  License</a>. XML itself is a metalanguage to design markup languages, i.e.
  28  text language where semantic and structure are added to the content using
  29  extra "markup" information enclosed between angle brackets. HTML is the most
  30  well-known markup language. Though the library is written in C <a
  31  href="python.html">a variety of language bindings</a> make it available in
  32  other environments.</p>
  33  
  34  <p>Libxml2 is known to be very portable, the library should build and work
  35  without serious troubles on a variety of systems (Linux, Unix, Windows,
  36  CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks, ...)</p>
  37  
  38  <p>Libxml2 implements a number of existing standards related to markup
  39  languages:</p>
  40  <ul>
  41    <li>the XML standard: <a
  42      href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a></li>
  43    <li>Namespaces in XML: <a
  44      href="http://www.w3.org/TR/REC-xml-names/">http://www.w3.org/TR/REC-xml-names/</a></li>
  45    <li>XML Base: <a
  46      href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a></li>
  47    <li><a href="http://www.cis.ohio-state.edu/rfc/rfc2396.txt">RFC 2396</a> :
  48      Uniform Resource Identifiers <a
  49      href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</a></li>
  50    <li>XML Path Language (XPath) 1.0: <a
  51      href="http://www.w3.org/TR/xpath">http://www.w3.org/TR/xpath</a></li>
  52    <li>HTML4 parser: <a
  53      href="http://www.w3.org/TR/html401/">http://www.w3.org/TR/html401/</a></li>
  54    <li>XML Pointer Language (XPointer) Version 1.0: <a
  55      href="http://www.w3.org/TR/xptr">http://www.w3.org/TR/xptr</a></li>
  56    <li>XML Inclusions (XInclude) Version 1.0: <a
  57      href="http://www.w3.org/TR/xinclude/">http://www.w3.org/TR/xinclude/</a></li>
  58    <li>ISO-8859-x encodings, as well as <a
  59      href="http://www.cis.ohio-state.edu/rfc/rfc2044.txt">rfc2044</a> [UTF-8]
  60      and <a href="http://www.cis.ohio-state.edu/rfc/rfc2781.txt">rfc2781</a>
  61      [UTF-16] Unicode encodings, and more if using iconv support</li>
  62    <li>part of SGML Open Technical Resolution TR9401:1997</li>
  63    <li>XML Catalogs Working Draft 06 August 2001: <a
  64      href="http://www.oasis-open.org/committees/entity/spec-2001-08-06.html">http://www.oasis-open.org/committees/entity/spec-2001-08-06.html</a></li>
  65    <li>Canonical XML Version 1.0: <a
  66      href="http://www.w3.org/TR/xml-c14n">http://www.w3.org/TR/xml-c14n</a>
  67      and the Exclusive XML Canonicalization CR draft <a
  68      href="http://www.w3.org/TR/xml-exc-c14n">http://www.w3.org/TR/xml-exc-c14n</a></li>
  69    <li>Relax NG, ISO/IEC 19757-2:2003, <a
  70      href="http://www.oasis-open.org/committees/relax-ng/spec-20011203.html">http://www.oasis-open.org/committees/relax-ng/spec-20011203.html</a></li>
  71    <li>W3C XML Schemas Part 2: Datatypes <a
  72      href="http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/">REC 02 May
  73      2001</a></li>
  74    <li>W3C <a href="http://www.w3.org/TR/xml-id/">xml:id</a> Working Draft 7
  75      April 2004</li>
  76  </ul>
  77  
  78  <p>In most cases libxml2 tries to implement the specifications in a
  79  relatively strictly compliant way. As of release 2.4.16, libxml2 passed all
  80  1800+ tests from the <a
  81  href="http://www.oasis-open.org/committees/xml-conformance/">OASIS XML Tests
  82  Suite</a>.</p>
  83  
  84  <p>To some extent libxml2 provides support for the following additional
  85  specifications but doesn't claim to implement them completely:</p>
  86  <ul>
  87    <li>Document Object Model (DOM) <a
  88      href="http://www.w3.org/TR/DOM-Level-2-Core/">http://www.w3.org/TR/DOM-Level-2-Core/</a>
  89      the document model, but it doesn't implement the API itself, gdome2 does
  90      this on top of libxml2</li>
  91    <li><a href="http://www.cis.ohio-state.edu/rfc/rfc959.txt">RFC 959</a> :
  92      libxml2 implements a basic FTP client code</li>
  93    <li><a href="http://www.cis.ohio-state.edu/rfc/rfc1945.txt">RFC 1945</a> :
  94      HTTP/1.0, again a basic HTTP client code</li>
  95    <li>SAX: a SAX2 like interface and a minimal SAX1 implementation compatible
  96      with early expat versions</li>
  97  </ul>
  98  
  99  <p>A partial implementation of <a
 100  href="http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/">XML Schemas Part
 101  1: Structure</a> is being worked on but it would be far too early to make any
 102  conformance statement about it at the moment.</p>
 103  
 104  <p>Separate documents:</p>
 105  <ul>
 106    <li><a href="http://xmlsoft.org/XSLT/">the libxslt page</a> providing an
 107      implementation of XSLT 1.0 and common extensions like EXSLT for
 108    libxml2</li>
 109    <li><a href="http://gdome2.cs.unibo.it/">the gdome2 page</a>
 110      : a standard DOM2 implementation for libxml2</li>
 111    <li><a href="http://www.aleksey.com/xmlsec/">the XMLSec page</a>: an
 112      implementation of <a href="http://www.w3.org/TR/xmldsig-core/">W3C XML
 113      Digital Signature</a> for libxml2</li>
 114    <li>also check the related links section for more related and active
 115      projects.</li>
 116  </ul>
 117  <p> Hosting sponsored by <a href="http://www.aoemedia.de/opensource-cms.html"
 118  >Open Source CMS services</a> from AOE media.</p>
 119  
 120  <p>Logo designed by <a href="mailto:liyanage@access.ch">Marc Liyanage</a>.</p>
 121  
 122  <h2><a name="Introducti">Introduction</a></h2>
 123  
 124  <p>This document describes libxml, the <a
 125  href="http://www.w3.org/XML/">XML</a> C parser and toolkit developed for the
 126  <a href="http://www.gnome.org/">Gnome</a> project. <a
 127  href="http://www.w3.org/XML/">XML is a standard</a> for building tag-based
 128  structured documents/data.</p>
 129  
 130  <p>Here are some key points about libxml:</p>
 131  <ul>
 132    <li>Libxml2 exports Push (progressive) and Pull (blocking) type parser
 133      interfaces for both XML and HTML.</li>
 134    <li>Libxml2 can do DTD validation at parse time, using a parsed document
 135      instance, or with an arbitrary DTD.</li>
 136    <li>Libxml2 includes complete <a
 137      href="http://www.w3.org/TR/xpath">XPath</a>, <a
 138      href="http://www.w3.org/TR/xptr">XPointer</a> and <a
 139      href="http://www.w3.org/TR/xinclude">XInclude</a> implementations.</li>
 140    <li>It is written in plain C, making as few assumptions as possible, and
 141      sticking closely to ANSI C/POSIX for easy embedding. Works on
 142      Linux/Unix/Windows, ported to a number of other platforms.</li>
 143    <li>Basic support for HTTP and FTP client allowing applications to fetch
 144      remote resources.</li>
 145    <li>The design is modular, most of the extensions can be compiled out.</li>
 146    <li>The internal document representation is as close as possible to the <a
 147      href="http://www.w3.org/DOM/">DOM</a> interfaces.</li>
 148    <li>Libxml2 also has a <a
 149      href="http://www.megginson.com/SAX/index.html">SAX like interface</a>;
 150      the interface is designed to be compatible with <a
 151      href="http://www.jclark.com/xml/expat.html">Expat</a>.</li>
 152    <li>This library is released under the <a
 153      href="http://www.opensource.org/licenses/mit-license.html">MIT
 154      License</a>. See the Copyright file in the distribution for the precise
 155      wording.</li>
 156  </ul>
 157  
 158  <p>Warning: unless you are forced to because your application links with a
 159  Gnome-1.X library requiring it,  <strong><span
 160  style="background-color: #FF0000">Do Not Use libxml1</span></strong>, use
 161  libxml2</p>
 162  
 163  <h2><a name="FAQ">FAQ</a></h2>
 164  
 165  <p>Table of Contents:</p>
 166  <ul>
 167    <li><a href="FAQ.html#License">License(s)</a></li>
 168    <li><a href="FAQ.html#Installati">Installation</a></li>
 169    <li><a href="FAQ.html#Compilatio">Compilation</a></li>
 170    <li><a href="FAQ.html#Developer">Developer corner</a></li>
 171  </ul>
 172  
 173  <h3><a name="License">License</a>(s)</h3>
 174  <ol>
 175    <li><em>Licensing Terms for libxml</em>
 176      <p>libxml2 is released under the <a
 177      href="http://www.opensource.org/licenses/mit-license.html">MIT
 178      License</a>; see the file Copyright in the distribution for the precise
 179      wording</p>
 180    </li>
 181    <li><em>Can I embed libxml2 in a proprietary application ?</em>
 182      <p>Yes. The MIT License allows you to keep proprietary the changes you
 183      made to libxml, but it would be graceful to send-back bug fixes and
 184      improvements as patches for possible incorporation in the main
 185      development tree.</p>
 186    </li>
 187  </ol>
 188  
 189  <h3><a name="Installati">Installation</a></h3>
 190  <ol>
 191    <li><strong><span style="background-color: #FF0000">Do Not Use
 192      libxml1</span></strong>, use libxml2</li>
 193    <p></p>
 194    <li><em>Where can I get libxml</em> ?
 195      <p>The original distribution comes from <a
 196      href="ftp://xmlsoft.org/libxml2/">xmlsoft.org</a> or <a
 197      href="ftp://ftp.gnome.org/pub/GNOME/sources/libxml2/2.6/">gnome.org</a></p>
 198      <p>Most Linux and BSD distributions include libxml, this is probably the
 199      safer way for end-users to use libxml.</p>
 200      <p>David Doolin provides precompiled Windows versions at <a
 201      href="http://www.ce.berkeley.edu/~doolin/code/libxmlwin32/         ">http://www.ce.berkeley.edu/~doolin/code/libxmlwin32/</a></p>
 202    </li>
 203    <p></p>
 204    <li><em>I see libxml and libxml2 releases, which one should I install ?</em>
 205      <ul>
 206        <li>If you are not constrained by backward compatibility issues with
 207          existing applications, install libxml2 only</li>
 208        <li>If you are not doing development, you can safely install both.
 209          Usually the packages <a
 210          href="http://rpmfind.net/linux/RPM/libxml.html">libxml</a> and <a
 211          href="http://rpmfind.net/linux/RPM/libxml2.html">libxml2</a> are
 212          compatible (this is not the case for development packages).</li>
 213        <li>If you are a developer and your system provides separate packaging
 214          for shared libraries and the development components, it is possible
 215          to install libxml and libxml2, and also <a
 216          href="http://rpmfind.net/linux/RPM/libxml-devel.html">libxml-devel</a>
 217          and <a
 218          href="http://rpmfind.net/linux/RPM/libxml2-devel.html">libxml2-devel</a>
 219          too for libxml2 &gt;= 2.3.0</li>
 220        <li>If you are developing a new application, please develop against
 221          libxml2(-devel)</li>
 222      </ul>
 223    </li>
 224    <li><em>I can't install the libxml package, it conflicts with libxml0</em>
 225      <p>You probably have an old libxml0 package used to provide the shared
 226      library for libxml.so.0, you can probably safely remove it. The libxml
 227      packages provided on <a
 228      href="ftp://xmlsoft.org/libxml2/">xmlsoft.org</a> provide
 229      libxml.so.0</p>
 230    </li>
 231    <li><em>I can't install the libxml(2) RPM package due to failed
 232      dependencies</em>
 233      <p>The most generic solution is to re-fetch the latest src.rpm , and
 234      rebuild it locally with</p>
 235      <p><code>rpm --rebuild libxml(2)-xxx.src.rpm</code>.</p>
 236      <p>If everything goes well it will generate two binary rpm packages (one
 237      providing the shared libs and xmllint, and the other one, the -devel
 238      package, providing includes, static libraries and scripts needed to build
 239      applications with libxml(2)) that you can install locally.</p>
 240    </li>
 241  </ol>
 242  
 243  <h3><a name="Compilatio">Compilation</a></h3>
 244  <ol>
 245    <li><em>What is the process to compile libxml2 ?</em>
 246      <p>As most UNIX libraries libxml2 follows the "standard":</p>
 247      <p><code>gunzip -c xxx.tar.gz | tar xvf -</code></p>
 248      <p><code>cd libxml-xxxx</code></p>
 249      <p><code>./configure --help</code></p>
 250      <p>to see the options, then the compilation/installation proper</p>
 251      <p><code>./configure [possible options]</code></p>
 252      <p><code>make</code></p>
 253      <p><code>make install</code></p>
 254      <p>At that point you may have to rerun ldconfig or a similar utility to
 255      update your list of installed shared libs.</p>
 256    </li>
 257    <li><em>What other libraries are needed to compile/install libxml2 ?</em>
 258      <p>Libxml2 does not require any other library, the normal C ANSI API
 259      should be sufficient (please report any violation to this rule you may
 260      find).</p>
 261      <p>However if found at configuration time libxml2 will detect and use the
 262      following libs:</p>
 263      <ul>
 264        <li><a href="http://www.info-zip.org/pub/infozip/zlib/">libz</a> : a
 265          highly portable and available widely compression library.</li>
 266        <li>iconv: a powerful character encoding conversion library. It is
 267          included by default in recent glibc libraries, so it doesn't need to
 268          be installed specifically on Linux. It now seems a <a
 269          href="http://www.opennc.org/onlinepubs/7908799/xsh/iconv.html">part
 270          of the official UNIX</a> specification. Here is one <a
 271          href="http://www.gnu.org/software/libiconv/">implementation of the
 272          library</a> which source can be found <a
 273          href="ftp://ftp.ilog.fr/pub/Users/haible/gnu/">here</a>.</li>
 274      </ul>
 275    </li>
 276    <p></p>
 277    <li><em>Make check fails on some platforms</em>
 278      <p>Sometimes the regression tests' results don't completely match the
 279      value produced by the parser, and the makefile uses diff to print the
 280      delta. On some platforms the diff return breaks the compilation process;
 281      if the diff is small this is probably not a serious problem.</p>
 282      <p>Sometimes (especially on Solaris) make checks fail due to limitations
 283      in make. Try using GNU-make instead.</p>
 284    </li>
 285    <li><em>I use the SVN version and there is no configure script</em>
 286      <p>The configure script (and other Makefiles) are generated. Use the
 287      autogen.sh script to regenerate the configure script and Makefiles,
 288      like:</p>
 289      <p><code>./autogen.sh --prefix=/usr --disable-shared</code></p>
 290    </li>
 291    <li><em>I have troubles when running make tests with gcc-3.0</em>
 292      <p>It seems the initial release of gcc-3.0 has a problem with the
 293      optimizer which miscompiles the URI module. Please use another
 294      compiler.</p>
 295    </li>
 296  </ol>
 297  
 298  <h3><a name="Developer">Developer</a> corner</h3>
 299  <ol>
 300    <li><em>Troubles compiling or linking programs using libxml2</em>
 301      <p>Usually the problem comes from the fact that the compiler doesn't get
 302      the right compilation or linking flags. There is a small shell script
 303      <code>xml2-config</code> which is installed as part of libxml2 usual
 304      install process which provides those flags. Use</p>
 305      <p><code>xml2-config --cflags</code></p>
 306      <p>to get the compilation flags and</p>
 307      <p><code>xml2-config --libs</code></p>
 308      <p>to get the linker flags. Usually this is done directly from the
 309      Makefile as:</p>
 310      <p><code>CFLAGS=`xml2-config --cflags`</code></p>
 311      <p><code>LIBS=`xml2-config --libs`</code></p>
 312    </li>
 313    <li><em>I want to install my own copy of libxml2 in my home directory and
 314      link my programs against it, but it doesn't work</em>
 315      <p>There are many different ways to accomplish this.  Here is one way to
 316      do this under Linux.  Suppose your home directory is <code>/home/user.
 317      </code>Then:</p>
 318      <ul>
 319        <li>Create a subdirectory, let's call it <code>myxml</code></li>
 320        <li>unpack the libxml2 distribution into that subdirectory</li>
 321        <li>chdir into the unpacked distribution
 322          (<code>/home/user/myxml/libxml2 </code>)</li>
 323        <li>configure the library using the "<code>--prefix</code>" switch,
 324          specifying an installation subdirectory in
 325          <code>/home/user/myxml</code>, e.g.
 326          <p><code>./configure --prefix /home/user/myxml/xmlinst</code> {other
 327          configuration options}</p>
 328        </li>
 329        <li>now run <code>make</code> followed by <code>make install</code></li>
 330        <li>At this point, the installation subdirectory contains the complete
 331          "private" include files, library files and binary program files (e.g.
 332          xmllint), located in
 333          <p><code>/home/user/myxml/xmlinst/lib,
 334          /home/user/myxml/xmlinst/include </code> and <code>
 335          /home/user/myxml/xmlinst/bin</code></p>
 336          respectively.</li>
 337        <li>In order to use this "private" library, you should first add it to
 338          the beginning of your default PATH (so that your own private program
 339          files such as xmllint will be used instead of the normal system
 340          ones).  To do this, the Bash command would be
 341          <p><code>export PATH=/home/user/myxml/xmlinst/bin:$PATH</code></p>
 342        </li>
 343        <li>Now suppose you have a program <code>test1.c</code> that you would
 344          like to compile with your "private" library.  Simply compile it using
 345          the command
 346          <p><code>gcc `xml2-config --cflags --libs` -o test test.c</code></p>
 347          Note that, because your PATH has been set with <code>
 348          /home/user/myxml/xmlinst/bin</code> at the beginning, the xml2-config
 349          program which you just installed will be used instead of the system
 350          default one, and this will <em>automatically</em> get the correct
 351          libraries linked with your program.</li>
 352      </ul>
 353    </li>
 354  
 355    <p></p>
 356    <li><em>xmlDocDump() generates output on one line.</em>
 357      <p>Libxml2 will not <strong>invent</strong> spaces in the content of a
 358      document since <strong>all spaces in the content of a document are
 359      significant</strong>. If you build a tree from the API and want
 360      indentation:</p>
 361      <ol>
 362        <li>the correct way is to generate those yourself too.</li>
 363        <li>the dangerous way is to ask libxml2 to add those blanks to your
 364          content <strong>modifying the content of your document in the
 365          process</strong>. The result may not be what you expect. There is
 366          <strong>NO</strong> way to guarantee that such a modification won't
 367          affect other parts of the content of your document. See <a
 368          href="http://xmlsoft.org/html/libxml-parser.html#xmlKeepBlanksDefault">xmlKeepBlanksDefault
 369          ()</a> and <a
 370          href="http://xmlsoft.org/html/libxml-tree.html#xmlSaveFormatFile">xmlSaveFormatFile
 371          ()</a></li>
 372      </ol>
 373    </li>
 374    <p></p>
 375    <li><em>Extra nodes in the document:</em>
 376      <p><em>For an XML file as below:</em></p>
 377      <pre>&lt;?xml version="1.0"?&gt;
 378  &lt;PLAN xmlns="http://www.argus.ca/autotest/1.0/"&gt;
 379  &lt;NODE CommFlag="0"/&gt;
 380  &lt;NODE CommFlag="1"/&gt;
 381  &lt;/PLAN&gt;</pre>
 382      <p><em>after parsing it with the function
 383      pxmlDoc=xmlParseFile(...);</em></p>
 384      <p><em>I want to the get the content of the first node (node with the
 385      CommFlag="0")</em></p>
 386      <p><em>so I did it as following;</em></p>
 387      <pre>xmlNodePtr pnode;
 388  pnode=pxmlDoc-&gt;children-&gt;children;</pre>
 389      <p><em>but it does not work. If I change it to</em></p>
 390      <pre>pnode=pxmlDoc-&gt;children-&gt;children-&gt;next;</pre>
 391      <p><em>then it works.  Can someone explain it to me.</em></p>
 392      <p></p>
 393      <p>In XML all characters in the content of the document are significant
 394      <strong>including blanks and formatting line breaks</strong>.</p>
 395      <p>The extra nodes you are wondering about are just that, text nodes with
 396      the formatting spaces which are part of the document but that people tend
 397      to forget. There is a function <a
 398      href="http://xmlsoft.org/html/libxml-parser.html">xmlKeepBlanksDefault
 399      ()</a>  to remove those at parse time, but that's an heuristic, and its
 400      use should be limited to cases where you are certain there is no
 401      mixed-content in the document.</p>
 402    </li>
 403    <li><em>I get compilation errors of existing code like when accessing
 404      <strong>root</strong> or <strong>child fields</strong> of nodes.</em>
 405      <p>You are compiling code developed for libxml version 1 and using a
 406      libxml2 development environment. Either switch back to libxml v1 devel or
 407      even better fix the code to compile with libxml2 (or both) by <a
 408      href="upgrade.html">following the instructions</a>.</p>
 409    </li>
 410    <li><em>I get compilation errors about non existing
 411      <strong>xmlRootNode</strong> or <strong>xmlChildrenNode</strong>
 412      fields.</em>
 413      <p>The source code you are using has been <a
 414      href="upgrade.html">upgraded</a> to be able to compile with both libxml
 415      and libxml2, but you need to install a more recent version:
 416      libxml(-devel) &gt;= 1.8.8 or libxml2(-devel) &gt;= 2.1.0</p>
 417    </li>
 418    <li><em>Random crashes in threaded applications</em>
 419      <p>Read and follow all advices on the <a href="threads.html">thread
 420      safety</a> page, and make 100% sure you never call xmlCleanupParser()
 421      while the library or an XML document might still be in use by another
 422      thread.</p>
 423    </li>
 424    <li><em>The example provided in the web page does not compile.</em>
 425      <p>It's hard to maintain the documentation in sync with the code
 426      &lt;grin/&gt; ...</p>
 427      <p>Check the previous points 1/ and 2/ raised before, and please send
 428      patches.</p>
 429    </li>
 430    <li><em>Where can I get more examples and information than provided on the
 431      web page?</em>
 432      <p>Ideally a libxml2 book would be nice. I have no such plan ... But you
 433      can:</p>
 434      <ul>
 435        <li>check more deeply the <a href="html/libxml-lib.html">existing
 436          generated doc</a></li>
 437        <li>have a look at <a href="examples/index.html">the set of
 438          examples</a>.</li>
 439        <li>look for examples of use for libxml2 function using the Gnome code
 440            or by asking on Google.</li>
 441        <li><a
 442          href="http://svn.gnome.org/viewvc/libxml2/trunk/">Browse
 443          the libxml2 source</a> , I try to write code as clean and documented
 444          as possible, so looking at it may be helpful. In particular the code
 445          of <a href="http://svn.gnome.org/viewvc/libxml2/trunk/xmllint.c?view=markup">xmllint.c</a> and of the various testXXX.c test programs should
 446          provide good examples of how to do things with the library.</li>
 447      </ul>
 448    </li>
 449    <p></p>
 450    <li><em>What about C++ ?</em>
 451      <p>libxml2 is written in pure C in order to allow easy reuse on a number
 452      of platforms, including embedded systems. I don't intend to convert to
 453      C++.</p>
 454      <p>There is however a C++ wrapper which may fulfill your needs:</p>
 455      <ul>
 456        <li>by Ari Johnson &lt;ari@btigate.com&gt;:
 457          <p>Website: <a
 458          href="http://libxmlplusplus.sourceforge.net/">http://libxmlplusplus.sourceforge.net/</a></p>
 459          <p>Download: <a
 460          href="http://sourceforge.net/project/showfiles.php?group_id=12999">http://sourceforge.net/project/showfiles.php?group_id=12999</a></p>
 461        </li>
 462      </ul>
 463    </li>
 464    <li><em>How to validate a document a posteriori ?</em>
 465      <p>It is possible to validate documents which had not been validated at
 466      initial parsing time or documents which have been built from scratch
 467      using the API. Use the <a
 468      href="http://xmlsoft.org/html/libxml-valid.html#xmlValidateDtd">xmlValidateDtd()</a>
 469      function. It is also possible to simply add a DTD to an existing
 470      document:</p>
 471      <pre>xmlDocPtr doc; /* your existing document */
 472  xmlDtdPtr dtd = xmlParseDTD(NULL, filename_of_dtd); /* parse the DTD */
 473  
 474          dtd-&gt;name = xmlStrDup((xmlChar*)"root_name"); /* use the given root */
 475  
 476          doc-&gt;intSubset = dtd;
 477          if (doc-&gt;children == NULL) xmlAddChild((xmlNodePtr)doc, (xmlNodePtr)dtd);
 478          else xmlAddPrevSibling(doc-&gt;children, (xmlNodePtr)dtd);
 479            </pre>
 480    </li>
 481    <li><em>So what is this funky "xmlChar" used all the time?</em>
 482      <p>It is a null terminated sequence of utf-8 characters. And only utf-8!
 483      You need to convert strings encoded in different ways to utf-8 before
 484      passing them to the API.  This can be accomplished with the iconv library
 485      for instance.</p>
 486    </li>
 487    <li>etc ...</li>
 488  </ol>
 489  
 490  <p></p>
 491  
 492  <h2><a name="Documentat">Developer Menu</a></h2>
 493  
 494  <p>There are several on-line resources related to using libxml:</p>
 495  <ol>
 496    <li>Use the <a href="search.php">search engine</a> to look up
 497    information.</li>
 498    <li>Check the <a href="FAQ.html">FAQ.</a></li>
 499    <li>Check the <a href="http://xmlsoft.org/html/libxml-lib.html">extensive
 500      documentation</a> automatically extracted from code comments.</li>
 501    <li>Look at the documentation about <a href="encoding.html">libxml
 502      internationalization support</a>.</li>
 503    <li>This page provides a global overview and <a href="example.html">some
 504      examples</a> on how to use libxml.</li>
 505    <li><a href="examples/index.html">Code examples</a></li>
 506    <li>John Fleck's libxml2 tutorial: <a href="tutorial/index.html">html</a>
 507      or <a href="tutorial/xmltutorial.pdf">pdf</a>.</li>
 508    <li>If you need to parse large files, check the <a
 509      href="xmlreader.html">xmlReader</a> API tutorial</li>
 510    <li><a href="mailto:james@daa.com.au">James Henstridge</a> wrote <a
 511      href="http://www.jamesh.id.au/articles/libxml-sax/libxml-sax.html">some nice
 512      documentation</a> explaining how to use the libxml SAX interface.</li>
 513    <li>George Lebl wrote <a
 514      href="http://www-106.ibm.com/developerworks/library/l-gnome3/">an article
 515      for IBM developerWorks</a> about using libxml.</li>
 516    <li>Check <a href="http://svn.gnome.org/viewvc/libxml2/trunk/TODO?view=markup">the TODO
 517      file</a>.</li>
 518    <li>Read the <a href="upgrade.html">1.x to 2.x upgrade path</a>
 519      description. If you are starting a new project using libxml you should
 520      really use the 2.x version.</li>
 521    <li>And don't forget to look at the <a
 522      href="http://mail.gnome.org/archives/xml/">mailing-list archive</a>.</li>
 523  </ol>
 524  
 525  <h2><a name="Reporting">Reporting bugs and getting help</a></h2>
 526  
 527  <p>Well, bugs or missing features are always possible, and I will make a
 528  point of fixing them in a timely fashion. The best way to report a bug is to
 529  use the <a href="http://bugzilla.gnome.org/buglist.cgi?product=libxml2">Gnome
 530  bug tracking database</a> (make sure to use the "libxml2" module name). I
 531  look at reports there regularly and it's good to have a reminder when a bug
 532  is still open. Be sure to specify that the bug is for the package libxml2.</p>
 533  
 534  <p>For small problems you can try to get help on IRC, the #xml channel on
 535  irc.gnome.org (port 6667) usually has a few people subscribed which may help
 536  (but there is no guarantee and if a real issue is raised it should go on the
 537  mailing-list for archival).</p>
 538  
 539  <p>There is also a mailing-list <a
 540  href="mailto:xml@gnome.org">xml@gnome.org</a> for libxml, with an  <a
 541  href="http://mail.gnome.org/archives/xml/">on-line archive</a> (<a
 542  href="http://xmlsoft.org/messages">old</a>). To subscribe to this list,
 543  please visit the <a
 544  href="http://mail.gnome.org/mailman/listinfo/xml">associated Web</a> page and
 545  follow the instructions. <strong>Do not send code, I won't debug it</strong>
 546  (but patches are really appreciated!).</p>
 547  
 548  <p>Please note that with the current amount of virus and SPAM, sending mail
 549  to the list without being subscribed won't work. There is *far too many
 550  bounces* (in the order of a thousand a day !) I cannot approve them manually
 551  anymore. If your mail to the list bounced waiting for administrator approval,
 552  it is LOST ! Repost it and fix the problem triggering the error. Also please
 553  note that <span style="color: #FF0000; background-color: #FFFFFF">emails with
 554  a legal warning asking to not copy or redistribute freely the information
 555  they contain</span> are <strong>NOT</strong> acceptable for the mailing-list,
 556  such mail will as much as possible be discarded automatically, and are less
 557  likely to be answered if they made it to the list, <strong>DO NOT</strong>
 558  post to the list from an email address where such legal requirements are
 559  automatically added, get private paying support if you can't share
 560  information.</p>
 561  
 562  <p>Check the following <strong><span style="color: #FF0000">before
 563  posting</span></strong>:</p>
 564  <ul>
 565    <li>Read the <a href="FAQ.html">FAQ</a> and <a href="search.php">use the
 566      search engine</a> to get information related to your problem.</li>
 567    <li>Make sure you are <a href="ftp://xmlsoft.org/libxml2/">using a recent
 568      version</a>, and that the problem still shows up in a recent version.</li>
 569    <li>Check the <a href="http://mail.gnome.org/archives/xml/">list
 570      archives</a> to see if the problem was reported already. In this case
 571      there is probably a fix available, similarly check the <a
 572      href="http://bugzilla.gnome.org/buglist.cgi?product=libxml2">registered
 573      open bugs</a>.</li>
 574    <li>Make sure you can reproduce the bug with xmllint or one of the test
 575      programs found in source in the distribution.</li>
 576    <li>Please send the command showing the error as well as the input (as an
 577      attachment)</li>
 578  </ul>
 579  
 580  <p>Then send the bug with associated information to reproduce it to the <a
 581  href="mailto:xml@gnome.org">xml@gnome.org</a> list; if it's really libxml
 582  related I will approve it. Please do not send mail to me directly, it makes
 583  things really hard to track and in some cases I am not the best person to
 584  answer a given question, ask on the list.</p>
 585  
 586  <p>To <span style="color: #E50000">be really clear about support</span>:</p>
 587  <ul>
 588    <li>Support or help <span style="color: #E50000">requests MUST be sent to
 589      the list or on bugzilla</span> in case of problems, so that the Question
 590      and Answers can be shared publicly. Failing to do so carries the implicit
 591      message "I want free support but I don't want to share the benefits with
 592      others" and is not welcome. I will automatically Carbon-Copy the
 593      xml@gnome.org mailing list for any technical reply made about libxml2 or
 594      libxslt.</li>
 595    <li>There is <span style="color: #E50000">no guarantee of support</span>. If
 596      your question remains unanswered after a week, repost it, making sure you
 597      gave all the detail needed and the information requested.</li>
 598    <li>Failing to provide information as requested or double checking first
 599      for prior feedback also carries the implicit message "the time of the
 600      library maintainers is less valuable than my time" and might not be
 601      welcome.</li>
 602  </ul>
 603  
 604  <p>Of course, bugs reported with a suggested patch for fixing them will
 605  probably be processed faster than those without.</p>
 606  
 607  <p>If you're looking for help, a quick look at <a
 608  href="http://mail.gnome.org/archives/xml/">the list archive</a> may actually
 609  provide the answer. I usually send source samples when answering libxml2
 610  usage questions. The <a
 611  href="http://xmlsoft.org/html/book1.html">auto-generated documentation</a> is
 612  not as polished as I would like (i need to learn more about DocBook), but
 613  it's a good starting point.</p>
 614  
 615  <h2><a name="help">How to help</a></h2>
 616  
 617  <p>You can help the project in various ways, the best thing to do first is to
 618  subscribe to the mailing-list as explained before, check the <a
 619  href="http://mail.gnome.org/archives/xml/">archives </a>and the <a
 620  href="http://bugzilla.gnome.org/buglist.cgi?product=libxml2">Gnome bug
 621  database</a>:</p>
 622  <ol>
 623    <li>Provide patches when you find problems.</li>
 624    <li>Provide the diffs when you port libxml2 to a new platform. They may not
 625      be integrated in all cases but help pinpointing portability problems
 626    and</li>
 627    <li>Provide documentation fixes (either as patches to the code comments or
 628      as HTML diffs).</li>
 629    <li>Provide new documentations pieces (translations, examples, etc
 630    ...).</li>
 631    <li>Check the TODO file and try to close one of the items.</li>
 632    <li>Take one of the points raised in the archive or the bug database and
 633      provide a fix. <a href="mailto:daniel@veillard.com">Get in touch with me
 634      </a>before to avoid synchronization problems and check that the suggested
 635      fix will fit in nicely :-)</li>
 636  </ol>
 637  
 638  <h2><a name="Downloads">Downloads</a></h2>
 639  
 640  <p>The latest versions of libxml2 can be found on the <a
 641  href="ftp://xmlsoft.org/libxml2/">xmlsoft.org</a> server ( <a
 642  href="ftp://xmlsoft.org/libxml2/">FTP</a> and rsync are available), there are also
 643  mirrors (<a href="ftp://fr.rpmfind.net/pub/libxml/">France</a> and
 644  Antonin Sprinzl also provide <a href="ftp://gd.tuwien.ac.at/pub/libxml/">a
 645  mirror in Austria</a>). (NOTE that you need both the <a
 646  href="http://rpmfind.net/linux/RPM/libxml2.html">libxml(2)</a> and <a
 647  href="http://rpmfind.net/linux/RPM/libxml2-devel.html">libxml(2)-devel</a>
 648  packages installed to compile applications using libxml if using RPMs.)</p>
 649  
 650  <p>You can find all the history of libxml(2) and libxslt releases in the <a
 651  href="http://xmlsoft.org/sources/old/">old</a> directory. The precompiled
 652  Windows binaries made by Igor Zlatovic are available in the <a
 653  href="http://xmlsoft.org/sources/win32/">win32</a> directory.</p>
 654  
 655  <p>Binary ports:</p>
 656  <ul>
 657    <li>RPMs for x86_64 are available directly on <a
 658      href="ftp://xmlsoft.org/libxml2/">xmlsoft.org</a>, the source RPM will compile on
 659      any architecture supported.</li>
 660    <li><a href="mailto:igor@zlatkovic.com">Igor Zlatkovic</a> is now the
 661      maintainer of the Windows port, <a
 662      href="http://www.zlatkovic.com/projects/libxml/index.html">he provides
 663      binaries</a>.</li>
 664    <li>OpenCSW provides <a
 665      href="http://opencsw.org/packages/libxml2">Solaris
 666    binaries</a>.</li>
 667    <li><a href="mailto:Steve.Ball@explain.com.au">Steve Ball</a> provides <a
 668      href="http://www.explain.com.au/oss/libxml2xslt.html">Mac Os X
 669      binaries</a>.</li>
 670    <li>The HP-UX porting center provides <a
 671      href="http://hpux.connect.org.uk/hppd/hpux/Gnome/">HP-UX binaries</a></li>
 672    <li>Bull provides precompiled <a
 673      href="http://gnome.bullfreeware.com/new_index.html">RPMs for AIX</a> as
 674      patr of their GNOME packages</li>
 675  </ul>
 676  
 677  <p>If you know other supported binary ports, please <a
 678  href="http://veillard.com/">contact me</a>.</p>
 679  
 680  <p><a name="Snapshot">Snapshot:</a></p>
 681  <ul>
 682    <li>Code from the GNOME GIT base libxml2 module, updated hourly <a
 683      href="ftp://xmlsoft.org/libxml2/libxml2-git-snapshot.tar.gz">libxml2-git-snapshot.tar.gz</a>.</li>
 684    <li>Docs, content of the web site, the list archive included <a
 685      href="ftp://xmlsoft.org/libxml2/libxml-docs.tar.gz">libxml-docs.tar.gz</a>.</li>
 686  </ul>
 687  
 688  <p><a name="Contribs">Contributions:</a></p>
 689  
 690  <p>I do accept external contributions, especially if compiling on another
 691  platform,  get in touch with the list to upload the package, wrappers for
 692  various languages have been provided, and can be found in the <a
 693  href="python.html">bindings section</a></p>
 694  
 695  <p>Libxml2 is also available from GIT:</p>
 696  <ul>
 697    <li><p>See <a href="http://git.gnome.org/browse/libxml2/">libxml2 Git web</a>.
 698           To checkout a local tree use:</p>
 699         <pre>git clone git://git.gnome.org/libxml2</pre>
 700    </li>
 701    <li>The <strong>libxslt</strong> module is also present 
 702        <a href="http://git.gnome.org/browse/libxslt/">there</a>.</li>
 703  </ul>
 704  
 705  <h2><a name="News">Releases</a></h2>
 706  
 707  <p>The <a href="ChangeLog.html">change log</a> describes the recents commits
 708  to the <a href="http://git.gnome.org/browse/libxml2/">GIT</a> code base.</p>
 709  
 710  <p>Here is the list of public releases:</p>
 711  
 712  <h3>2.9.4: May 23 2016</h3>
 713  <ul>
 714    <li>Security:<br/>
 715    More format string warnings with possible format string vulnerability (David Kilzer),<br/>
 716    Avoid building recursive entities (Daniel Veillard),<br/>
 717    Heap-based buffer overread in htmlCurrentChar (Pranjal Jumde),<br/>
 718    Heap-based buffer-underreads due to xmlParseName (David Kilzer),<br/>
 719    Heap use-after-free in xmlSAX2AttributeNs (Pranjal Jumde),<br/>
 720    Heap use-after-free in htmlParsePubidLiteral and htmlParseSystemiteral (Pranjal Jumde),<br/>
 721    Fix some format string warnings with possible format string vulnerability (David Kilzer),<br/>
 722    Detect change of encoding when parsing HTML names (Hugh Davenport),<br/>
 723    Fix inappropriate fetch of entities content (Daniel Veillard),<br/>
 724    Bug 759398: Heap use-after-free in xmlDictComputeFastKey &lt;https://bugzilla.gnome.org/show_bug.cgi?id=759398&gt; (Pranjal Jumde),<br/>
 725    Bug 758605: Heap-based buffer overread in xmlDictAddString &lt;https://bugzilla.gnome.org/show_bug.cgi?id=758605&gt; (Pranjal Jumde),<br/>
 726    Bug 758588: Heap-based buffer overread in xmlParserPrintFileContextInternal &lt;https://bugzilla.gnome.org/show_bug.cgi?id=758588&gt; (David Kilzer),<br/>
 727    Bug 757711: heap-buffer-overflow in xmlFAParsePosCharGroup &lt;https://bugzilla.gnome.org/show_bug.cgi?id=757711&gt; (Pranjal Jumde),<br/>
 728    Add missing increments of recursion depth counter to XML parser. (Peter Simons)<br/>
 729    </li>
 730  
 731    <li>Documentation:<br/>
 732    Fix typo: s{ ec -&gt; cr }cipt (Jan Pokorný),<br/>
 733    Fix typos: dictio{ nn -&gt; n }ar{y,ies} (Jan Pokorný),<br/>
 734    Fix typos: PATH_{ SEAPARATOR -&gt; SEPARATOR } (Jan Pokorný),<br/>
 735    Correct a typo. (Shlomi Fish)<br/>
 736    </li>
 737  
 738    <li>Portability:<br/>
 739    Correct the usage of LDFLAGS (Mattias Hansson),<br/>
 740    Revert the use of SAVE_LDFLAGS in configure.ac (Mattias Hansson),<br/>
 741    libxml2 hardcodes -L/lib in zlib/lzma tests which breaks cross-compiles (Mike Frysinger),<br/>
 742    Fix apibuild for a recently added construct (Daniel Veillard),<br/>
 743    Use pkg-config to locate zlib when possible (Stewart Brodie),<br/>
 744    Use pkg-config to locate ICU when possible (Stewart Brodie),<br/>
 745    Portability to non C99 compliant compilers (Patrick Monnerat),<br/>
 746    dict.h: Move xmlDictPtr definition before includes to allow direct inclusion. (Patrick Monnerat),<br/>
 747    os400: tell about xmllint and xmlcatalog in README400. (Patrick Monnerat),<br/>
 748    os400: properly process SGML add in XMLCATALOG command. (Patrick Monnerat),<br/>
 749    os400: implement CL command XMLCATALOG. (Patrick Monnerat),<br/>
 750    os400: compile and install program xmlcatalog (qshell-only). (Patrick Monnerat),<br/>
 751    os400: expand tabs in sources, strip trailing blanks. (Patrick Monnerat),<br/>
 752    os400: implement CL command XMLLINT. (Patrick Monnerat),<br/>
 753    os400: compile and install program xmllint (qshell-only). (Patrick Monnerat),<br/>
 754    os400: initscript make_module(): Use options instead of positional parameters. (Patrick Monnerat),<br/>
 755    os400: c14n.rpgle: allow *omit for nullable reference parameters. (Patrick Monnerat),<br/>
 756    os400: use like() for double type. (Patrick Monnerat),<br/>
 757    os400: use like() for int type. (Patrick Monnerat),<br/>
 758    os400: use like() for unsigned int type. (Patrick Monnerat),<br/>
 759    os400: use like() for enum types. (Patrick Monnerat),<br/>
 760    Add xz to xml2-config --libs output (Baruch Siach),<br/>
 761    Bug 760190: configure.ac should be able to build --with-icu without icu-config tool &lt;https://bugzilla.gnome.org/show_bug.cgi?id=760190&gt; (David Kilzer),<br/>
 762    win32\VC10\config.h and VS 2015 (Bruce Dawson),<br/>
 763    Add configure maintainer mode (orzen)<br/>
 764    </li>
 765  
 766    <li>Bug Fixes:<br/>
 767    Avoid an out of bound access when serializing malformed strings (Daniel Veillard),<br/>
 768    Unsigned addition may overflow in xmlMallocAtomicLoc() (David Kilzer),<br/>
 769    Integer signed/unsigned type mismatch in xmlParserInputGrow() (David Kilzer),<br/>
 770    Bug 763071: heap-buffer-overflow in xmlStrncat &lt;https://bugzilla.gnome.org/show_bug.cgi?id=763071&gt; (Pranjal Jumde),<br/>
 771    Integer overflow parsing port number in URI (Michael Paddon),<br/>
 772    Fix an error with regexp on nullable counted char transition (Daniel Veillard),<br/>
 773    Fix memory leak with XPath namespace nodes (Nick Wellnhofer),<br/>
 774    Fix namespace axis traversal (Nick Wellnhofer),<br/>
 775        Fix null pointer deref in docs with no root element (Hugh Davenport),<br/>
 776    Fix XSD validation of URIs with ampersands (Alex Henrie),<br/>
 777    xmlschemastypes.c: accept endOfDayFrag Times set to "24:00:00" mean "end of day" and should not cause an error. (Patrick Monnerat),<br/>
 778    xmlcatalog: flush stdout before interactive shell input. (Patrick Monnerat),<br/>
 779    xmllint: flush stdout before interactive shell input. (Patrick Monnerat),<br/>
 780    Don't recurse into OP_VALUEs in xmlXPathOptimizeExpression (Nick Wellnhofer),<br/>
 781    Fix namespace::node() XPath expression (Nick Wellnhofer),<br/>
 782    Fix OOB write in xmlXPathEmptyNodeSet (Nick Wellnhofer),<br/>
 783    Fix parsing of NCNames in XPath (Nick Wellnhofer),<br/>
 784    Fix OOB read with invalid UTF-8 in xmlUTF8Strsize (Nick Wellnhofer),<br/>
 785    Do normalize string-based datatype value in RelaxNG facet checking (Audric Schiltknecht),<br/>
 786    Bug 760921: REGRESSION (8eb55d78): doc/examples/io1 test fails after fix for "xmlSaveUri() incorrectly recomposes URIs with rootless paths" &lt;https://bugzilla.gnome.org/show_bug.cgi?id=760921&gt; (David Kilzer),<br/>
 787    Bug 760861: REGRESSION (bf9c1dad): Missing results for test/schemas/regexp-char-ref_[01].xsd &lt;https://bugzilla.gnome.org/show_bug.cgi?id=760861&gt; (David Kilzer),<br/>
 788    error.c: *input-&gt;cur == 0 does not mean no error (Pavel Raiskup),<br/>
 789    Add missing RNG test files (David Kilzer),<br/>
 790    Bug 760183: REGRESSION (v2.9.3): XML push parser fails with bogus UTF-8 encoding error when multi-byte character in large CDATA section is split across buffer &lt;https://bugzilla.gnome.org/show_bug.cgi?id=760183&gt; (David Kilzer),<br/>
 791    Bug 758572: ASAN crash in make check &lt;https://bugzilla.gnome.org/show_bug.cgi?id=758572&gt; (David Kilzer),<br/>
 792    Bug 721158: Missing ICU string when doing --version on xmllint &lt;https://bugzilla.gnome.org/show_bug.cgi?id=721158&gt; (David Kilzer),<br/>
 793    python 3: libxml2.c wrappers create Unicode str already (Michael Stahl),<br/>
 794    Add autogen.sh to distrib (orzen),<br/>
 795    Heap-based buffer overread in xmlNextChar (Daniel Veillard)<br/>
 796    </li>
 797  
 798    <li>Improvements:<br/>
 799    Add more debugging info to runtest (Daniel Veillard),<br/>
 800    Implement "runtest -u" mode (David Kilzer),<br/>
 801    Add a make rule to rebuild for ASAN (Daniel Veillard)<br/>
 802    </li>
 803  </ul>
 804  <h3>v2.9.3: Nov 20 2015</h3>
 805  <ul>
 806    <li>Security:<br/>
 807    CVE-2015-8242 Buffer overead with HTML parser in push mode (Hugh Davenport),<br/>
 808    CVE-2015-7500 Fix memory access error due to incorrect entities boundaries (Daniel Veillard),<br/>
 809    CVE-2015-7499-2 Detect incoherency on GROW (Daniel Veillard),<br/>
 810    CVE-2015-7499-1 Add xmlHaltParser() to stop the parser (Daniel Veillard),<br/>
 811    CVE-2015-5312 Another entity expansion issue (David Drysdale),<br/>
 812    CVE-2015-7497 Avoid an heap buffer overflow in xmlDictComputeFastQKey (David Drysdale),<br/>
 813    CVE-2015-7498 Avoid processing entities after encoding conversion failures (Daniel Veillard),<br/>
 814    CVE-2015-8035 Fix XZ compression support loop (Daniel Veillard),<br/>
 815    CVE-2015-7942-2 Fix an error in previous Conditional section patch (Daniel Veillard),<br/>
 816    CVE-2015-7942 Another variation of overflow in Conditional sections (Daniel Veillard),<br/>
 817    CVE-2015-1819 Enforce the reader to run in constant memory (Daniel Veillard)<br/>
 818    CVE-2015-7941_2 Cleanup conditional section error handling (Daniel Veillard),<br/>
 819    CVE-2015-7941_1 Stop parsing on entities boundaries errors (Daniel Veillard),<br/>
 820    </li>
 821  
 822    <li>Documentation:<br/>
 823    Correct spelling of "calling" (Alex Henrie),<br/>
 824    Fix a small error in xmllint --format description (Fabien Degomme),<br/>
 825    Avoid XSS on the search of xmlsoft.org (Daniel Veillard)<br/>
 826    </li>
 827  
 828    <li>Portability:<br/>
 829    threads: use forward declarations only for glibc (Michael Heimpold),<br/>
 830    Update Win32 configure.js to search for configure.ac (Daniel Veillard)<br/>
 831    </li>
 832  
 833    <li>Bug Fixes:<br/>
 834    Bug on creating new stream from entity (Daniel Veillard),<br/>
 835    Fix some loop issues embedding NEXT (Daniel Veillard),<br/>
 836    Do not print error context when there is none (Daniel Veillard),<br/>
 837    Avoid extra processing of MarkupDecl when EOF (Hugh Davenport),<br/>
 838    Fix parsing short unclosed comment uninitialized access (Daniel Veillard),<br/>
 839    Add missing Null check in xmlParseExternalEntityPrivate (Gaurav Gupta),<br/>
 840    Fix a bug in CData error handling in the push parser (Daniel Veillard),<br/>
 841    Fix a bug on name parsing at the end of current input buffer (Daniel Veillard),<br/>
 842    Fix the spurious ID already defined error (Daniel Veillard),<br/>
 843    Fix previous change to node sort order (Nick Wellnhofer),<br/>
 844    Fix a self assignment issue raised by clang (Scott Graham),<br/>
 845    Fail parsing early on if encoding conversion failed (Daniel Veillard),<br/>
 846    Do not process encoding values if the declaration if broken (Daniel Veillard),<br/>
 847    Silence clang's -Wunknown-attribute (Michael Catanzaro),<br/>
 848    xmlMemUsed is not thread-safe (Martin von Gagern),<br/>
 849    Fix support for except in nameclasses (Daniel Veillard),<br/>
 850    Fix order of root nodes (Nick Wellnhofer),<br/>
 851    Allow attributes on descendant-or-self axis (Nick Wellnhofer),<br/>
 852    Fix the fix to Windows locking (Steve Nairn),<br/>
 853    Fix timsort invariant loop re: Envisage article (Christopher Swenson),<br/>
 854    Don't add IDs in xmlSetTreeDoc (Nick Wellnhofer),<br/>
 855    Account for ID attributes in xmlSetTreeDoc (Nick Wellnhofer),<br/>
 856    Remove various unused value assignments (Philip Withnall),<br/>
 857    Fix missing entities after CVE-2014-3660 fix (Daniel Veillard),<br/>
 858    Revert "Missing initialization for the catalog module" (Daniel Veillard)<br/>
 859    </li>
 860  
 861    <li>Improvements:<br/>
 862    Reuse xmlHaltParser() where it makes sense (Daniel Veillard),<br/>
 863    xmlStopParser reset errNo (Daniel Veillard),<br/>
 864    Reenable xz support by default (Daniel Veillard),<br/>
 865    Recover unescaped less-than character in HTML recovery parsing (Daniel Veillard),<br/>
 866    Allow HTML serializer to output HTML5 DOCTYPE (Shaun McCance),<br/>
 867    Regression test for bug #695699 (Nick Wellnhofer),<br/>
 868    Add a couple of XPath tests (Nick Wellnhofer),<br/>
 869    Add Python 3 rpm subpackage (Tomas Radej),<br/>
 870    libxml2-config.cmake.in: update include directories (Samuel Martin),<br/>
 871    Adding example from bugs 738805 to regression tests (Daniel Veillard)<br/>
 872    </li>
 873  
 874    <li>Cleanups:<br/>
 875    </li>
 876  </ul>
 877  <h3>2.9.2: Oct 16 2014</h3>
 878  <ul>
 879    <li>Security:<br/>
 880    Fix for CVE-2014-3660 billion laugh variant (Daniel Veillard),<br/>
 881    CVE-2014-0191 Do not fetch external parameter entities (Daniel Veillard)<br/>
 882    </li>
 883  
 884    <li>Bug Fixes:<br/>
 885    fix memory leak xml header encoding field with XML_PARSE_IGNORE_ENC (Bart De Schuymer),<br/>
 886    xmlmemory: handle realloc properly (Yegor Yefremov),<br/>
 887    Python generator bug raised by the const change (Daniel Veillard),<br/>
 888    Windows Critical sections not released correctly (Daniel Veillard),<br/>
 889    Parser error on repeated recursive entity expansion containing &amp;lt; (Daniel Veillard),<br/>
 890    xpointer : fixing Null Pointers (Gaurav Gupta),<br/>
 891    Remove Unnecessary Null check in xpointer.c (Gaurav Gupta),<br/>
 892    parser bug on misformed namespace attributes (Dennis Filder),<br/>
 893    Pointer dereferenced before null check (Daniel Veillard),<br/>
 894    Leak of struct addrinfo in xmlNanoFTPConnect() (Gaurav Gupta),<br/>
 895    Possible overflow in HTMLParser.c (Daniel Veillard),<br/>
 896    python/tests/sync.py assumes Python dictionaries are ordered (John Beck),<br/>
 897    Fix Enum check and missing break (Gaurav Gupta),<br/>
 898    xmlIO: Handle error returns from dup() (Philip Withnall),<br/>
 899    Fix a problem properly saving URIs (Daniel Veillard),<br/>
 900    wrong error column in structured error when parsing attribute values (Juergen Keil),<br/>
 901    wrong error column in structured error when skipping whitespace in xml decl (Juergen Keil),<br/>
 902    no error column in structured error handler for xml schema validation errors (Juergen Keil),<br/>
 903    Couple of Missing Null checks (Gaurav Gupta),<br/>
 904    Add couple of missing Null checks (Daniel Veillard),<br/>
 905    xmlschemastypes: Fix potential array overflow (Philip Withnall),<br/>
 906    runtest: Fix a memory leak on parse failure (Philip Withnall),<br/>
 907    xmlIO: Fix an FD leak on gzdopen() failure (Philip Withnall),<br/>
 908    xmlcatalog: Fix a memory leak on quit (Philip Withnall),<br/>
 909    HTMLparser: Correctly initialise a stack allocated structure (Philip Withnall),<br/>
 910    Check for tmon in _xmlSchemaDateAdd() is incorrect (David Kilzer),<br/>
 911    Avoid Possible Null Pointer in trio.c (Gaurav Gupta),<br/>
 912    Fix processing in SAX2 in case of an allocation failure (Daniel Veillard),<br/>
 913    XML Shell command "cd" does not handle "/" at end of path (Daniel Veillard),<br/>
 914    Fix various Missing Null checks (Gaurav Gupta),<br/>
 915    Fix a potential NULL dereference (Daniel Veillard),<br/>
 916    Add a couple of misisng check in xmlRelaxNGCleanupTree (Gaurav Gupta),<br/>
 917    Add a missing argument check (Gaurav Gupta),<br/>
 918    Adding a check in case of allocation error (Gaurav Gupta),<br/>
 919    xmlSaveUri() incorrectly recomposes URIs with rootless paths (Dennis Filder),<br/>
 920    Adding some missing NULL checks (Gaurav),<br/>
 921    Fixes for xmlInitParserCtxt (Daniel Veillard),<br/>
 922    Fix regressions introduced by CVE-2014-0191 patch (Daniel Veillard),<br/>
 923    erroneously ignores a validation error if no error callback set (Daniel Veillard),<br/>
 924    xmllint was not parsing the --c14n11 flag (Sérgio Batista),<br/>
 925    Avoid Possible null pointer dereference in memory debug mode (Gaurav),<br/>
 926    Avoid Double Null Check (Gaurav),<br/>
 927    Restore context size and position after XPATH_OP_ARG (Nick Wellnhofer),<br/>
 928    Fix xmlParseInNodeContext() if node is not element (Daniel Veillard),<br/>
 929    Avoid a possible NULL pointer dereference (Gaurav),<br/>
 930    Fix xmlTextWriterWriteElement when a null content is given (Daniel Veillard),<br/>
 931    Fix an typo 'onrest' in htmlScriptAttributes (Daniel Veillard),<br/>
 932    fixing a ptotential uninitialized access (Daniel Veillard),<br/>
 933    Fix an fd leak in an error case (Daniel Veillard),<br/>
 934    Missing initialization for the catalog module (Daniel Veillard),<br/>
 935    Handling of XPath function arguments in error case (Nick Wellnhofer),<br/>
 936    Fix a couple of missing NULL checks (Gaurav),<br/>
 937    Avoid a possibility of dangling encoding handler (Gaurav),<br/>
 938    Fix HTML push parser to accept HTML_PARSE_NODEFDTD (Arnold Hendriks),<br/>
 939    Fix a bug loading some compressed files (Mike Alexander),<br/>
 940    Fix XPath node comparison bug (Gaurav),<br/>
 941    Type mismatch in xmlschemas.c (Gaurav),<br/>
 942    Type mismatch in xmlschemastypes.c (Gaurav),<br/>
 943    Avoid a deadcode in catalog.c (Daniel Veillard),<br/>
 944    run close socket on Solaris, same as we do on other platforms (Denis Pauk),<br/>
 945    Fix pointer dereferenced before null check (Gaurav),<br/>
 946    Fix a potential NULL dereference in tree code (Daniel Veillard),<br/>
 947    Fix potential NULL pointer dereferences in regexp code (Gaurav),<br/>
 948    xmllint --pretty crashed without following numeric argument (Tim Galeckas),<br/>
 949    Fix XPath expressions of the form '@ns:*' (Nick Wellnhofer),<br/>
 950    Fix XPath '//' optimization with predicates (Nick Wellnhofer),<br/>
 951    Clear up a potential NULL dereference (Daniel Veillard),<br/>
 952    Fix a possible NULL dereference (Gaurav),<br/>
 953    Avoid crash if allocation fails (Daniel Veillard),<br/>
 954    Remove occasional leading space in XPath number formatting (Daniel Veillard),<br/>
 955    Fix handling of mmap errors (Daniel Veillard),<br/>
 956    Catch malloc error and exit accordingly (Daniel Veillard),<br/>
 957    missing else in xlink.c (Ami Fischman),<br/>
 958    Fix a parsing bug on non-ascii element and CR/LF usage (Daniel Veillard),<br/>
 959    Fix a regression in xmlGetDocCompressMode() (Daniel Veillard),<br/>
 960    properly quote the namespace uris written out during c14n (Aleksey Sanin),<br/>
 961    Remove premature XInclude check on URI being relative (Alexey Neyman),<br/>
 962    Fix missing break on last() function for attributes (dcb),<br/>
 963    Do not URI escape in server side includes (Romain Bondue),<br/>
 964    Fix an error in xmlCleanupParser (Alexander Pastukhov)<br/>
 965    </li>
 966  
 967    <li>Documentation:<br/>
 968    typo in error messages "colon are forbidden from..." (Daniel Veillard),<br/>
 969    Fix a link to James SAX documentation old page (Daniel Veillard),<br/>
 970    Fix typos in relaxng.c (Jan Pokorný),<br/>
 971    Fix a doc typo (Daniel Veillard),<br/>
 972    Fix typos in {tree,xpath}.c (errror) (Jan Pokorný),<br/>
 973    Add limitations about encoding conversion (Daniel Veillard),<br/>
 974    Fix typos in xmlschemas{,types}.c (Jan Pokorný),<br/>
 975    Fix incorrect spelling entites-&gt;entities (Jan Pokorný),<br/>
 976    Forgot to document 2.9.1 release, regenerate docs (Daniel Veillard)<br/>
 977    </li>
 978  
 979    <li>Portability:<br/>
 980    AC_CONFIG_FILES and executable bit (Roumen Petrov),<br/>
 981    remove HAVE_CONFIG_H dependency in testlimits.c (Roumen Petrov),<br/>
 982    fix some tabs mixing incompatible with python3 (Roumen Petrov),<br/>
 983    Visual Studio 14 CTP defines snprintf() (Francis Dupont),<br/>
 984    OS400: do not try to copy unexisting doc files (Patrick Monnerat),<br/>
 985    OS400: use either configure.ac or configure.in. (Patrick Monnerat),<br/>
 986    os400: make-src.sh: create physical file with target CCSID (Patrick Monnerat),<br/>
 987    OS400: Add some more C macros equivalent procedures. (Patrick Monnerat),<br/>
 988    OS400: use C macros to implement equivalent RPG support procedures. (Patrick Monnerat),<br/>
 989    OS400: implement XPath macros as procedures for ILE/RPG support. (Patrick Monnerat),<br/>
 990    OS400: include in distribution tarball. (Patrick Monnerat),<br/>
 991    OS400: Add README: compilation directives and OS/400 specific stuff. (Patrick Monnerat),<br/>
 992    OS400: Add compilation scripts. (Patrick Monnerat),<br/>
 993    OS400: ILE RPG language header files. (Patrick Monnerat),<br/>
 994    OS400: implement some macros as functions for ILE/RPG language support (that as no macros). (Patrick Monnerat),<br/>
 995    OS400: UTF8&lt;--&gt;EBCDIC wrappers for system and external library calls (Patrick Monnerat),<br/>
 996    OS400: Easy character transcoding support (Patrick Monnerat),<br/>
 997    OS400: iconv functions compatibility wrappers and table builder. (Patrick Monnerat),<br/>
 998    OS400: create architecture directory. Implement dlfcn emulation. (Patrick Monnerat),<br/>
 999    Fix building when configuring without xpath and xptr (Daniel Veillard),<br/>
1000    configure: Add --with-python-install-dir (Jonas Eriksson),<br/>
1001    Fix compilation with minimum and xinclude. (Nicolas Le Cam),<br/>
1002    Compile out use of xmlValidateNCName() when not available. (Nicolas Le Cam),<br/>
1003    Fix compilation with minimum and schematron. (Nicolas Le Cam),<br/>
1004    Legacy needs xmlSAX2StartElement() and xmlSAX2EndElement(). (Nicolas Le Cam),<br/>
1005    Don't use xmlValidateName() when not available. (Nicolas Le Cam),<br/>
1006    Fix a portability issue on Windows (Longstreth Jon),<br/>
1007    Various portability patches for OpenVMS (Jacob (Jouk) Jansen),<br/>
1008    Use specific macros for portability to OS/400 (Patrick Monnerat),<br/>
1009    Add macros needed for OS/400 portability (Patrick Monnerat),<br/>
1010    Portability patch for fopen on OS/400 (Patrick Monnerat),<br/>
1011    Portability fixes for OS/400 (Patrick Monnerat),<br/>
1012    Improve va_list portability (Patrick Monnerat),<br/>
1013    Portability fix (Patrick Monnerat),<br/>
1014    Portability fix (Patrick Monnerat),<br/>
1015    Generic portability fix (Patrick Monnerat),<br/>
1016    Shortening lines in headers (Patrick Monnerat),<br/>
1017    build: Use pkg-config to find liblzma in preference to AC_CHECK_LIB (Philip Withnall),<br/>
1018    build: Add @LZMA_LIBS@ to libxml’s pkg-config files (Philip Withnall),<br/>
1019    fix some tabs mixing incompatible with python3 (Daniel Veillard),<br/>
1020    add additional defines checks for support "./configure --with-minimum" (Denis Pauk),<br/>
1021    Another round of fixes for older versions of Python (Arfrever Frehtes Taifersar Arahesis),<br/>
1022    python: fix drv_libxml2.py for python3 compatibility (Alexandre Rostovtsev),<br/>
1023    python: Fix compiler warnings when building python3 bindings (Armin K),<br/>
1024    Fix for compilation with python 2.6.8 (Petr Sumbera)<br/>
1025    </li>
1026  
1027    <li>Improvements:<br/>
1028    win32/libxml2.def.src after rebuild in doc (Roumen Petrov),<br/>
1029    elfgcchack.h: more legacy needs xmlSAX2StartElement() and xmlSAX2EndElement() (Roumen Petrov),<br/>
1030    elfgcchack.h: add xmlXPathNodeEval and xmlXPathSetContextNode (Roumen Petrov),<br/>
1031    Provide cmake module (Samuel Martin),<br/>
1032    Fix a couple of issues raised by make dist (Daniel Veillard),<br/>
1033    Fix and add const qualifiers (Kurt Roeckx),<br/>
1034    Preparing for upcoming release of 2.9.2 (Daniel Veillard),<br/>
1035    Fix zlib and lzma libraries check via command line (Dmitriy),<br/>
1036    wrong error column in structured error when parsing end tag (Juergen Keil),<br/>
1037    doc/news.html: small update to avoid line join while generating NEWS. (Patrick Monnerat),<br/>
1038    Add methods for python3 iterator (Ron Angeles),<br/>
1039    Support element node traversal in document fragments. (Kyle VanderBeek),<br/>
1040    xmlNodeSetName: Allow setting the name to a substring of the currently set name (Tristan Van Berkom),<br/>
1041    Added macros for argument casts (Eric Zurcher),<br/>
1042    adding init calls to xml and html Read parsing entry points (Daniel Veillard),<br/>
1043    Get rid of 'REPLACEMENT CHARACTER' Unicode chars in xmlschemas.c (Jan Pokorný),<br/>
1044    Implement choice for name classes on attributes (Shaun McCance),<br/>
1045    Two small namespace tweaks (Daniel Veillard),<br/>
1046    xmllint --memory should fail on empty files (Daniel Veillard),<br/>
1047    Cast encoding name to char pointer to match arg type (Nikolay Sivov)<br/>
1048    </li>
1049  
1050    <li>Cleanups:<br/>
1051    Removal of old configure.in (Daniel Veillard),<br/>
1052    Unreachable code in tree.c (Gaurav Gupta),<br/>
1053    Remove a couple of dead conditions (Gaurav Gupta),<br/>
1054    Avoid some dead code and cleanup in relaxng.c (Gaurav),<br/>
1055    Drop not needed checks (Denis Pauk),<br/>
1056    Fix a wrong test (Daniel Veillard)<br/>
1057    </li>
1058  </ul>
1059  <h3>2.9.1: Apr 19 2013</h3>
1060  <ul>
1061    <li> Features:<br/>
1062      Support for Python3 (Daniel Veillard),<br/>
1063      Add xmlXPathSetContextNode and xmlXPathNodeEval (Alex Bligh)<br/>
1064    </li>
1065  
1066    <li> Documentation:<br/>
1067      Add documentation for xmllint --xpath (Daniel Veillard),<br/>
1068      Fix the URL of the SAX documentation from James (Daniel Veillard),<br/>
1069      Fix spelling of "length". (Michael Wood)<br/>
1070    </li>
1071  
1072    <li> Portability:<br/>
1073      Fix python bindings with versions older than 2.7 (Daniel Veillard),<br/>
1074      rebuild docs:Makefile.am (Roumen Petrov),<br/>
1075      elfgcchack.h after rebuild in doc (Roumen Petrov),<br/>
1076      elfgcchack for buf module (Roumen Petrov),<br/>
1077      Fix a uneeded and wrong extra link parameter (Daniel Veillard),<br/>
1078      Few cleanup patches for Windows (Denis Pauk),<br/>
1079      Fix rpmbuild --nocheck (Mark Salter),<br/>
1080      Fix for win32/configure.js and WITH_THREAD_ALLOC (Daniel Richard),<br/>
1081      Fix Broken multi-arch support in xml2-config (Daniel Veillard),<br/>
1082      Fix a portability issue for GCC &lt; 3.4.0 (Daniel Veillard),<br/>
1083      Windows build fixes (Daniel Richard),<br/>
1084      Fix a thread portability problem (Friedrich Haubensak),<br/>
1085      Downgrade autoconf requirement to 2.63 (Daniel Veillard)<br/>
1086    </li>
1087  
1088    <li> Bug Fixes:<br/>
1089      Fix a linking error for python bindings (Daniel Veillard),<br/>
1090      Fix a couple of return without value (Jüri Aedla),<br/>
1091      Improve the hashing functions (Daniel Franke),<br/>
1092      Improve handling of xmlStopParser() (Daniel Veillard),<br/>
1093      Remove risk of lockup in dictionary initialization (Daniel Veillard),<br/>
1094      Activate detection of encoding in external subset (Daniel Veillard),<br/>
1095      Fix an output buffer flushing conversion bug (Mikhail Titov),<br/>
1096      Fix an old bug in xmlSchemaValidateOneElement (Csaba László),<br/>
1097      Fix configure cannot remove messages (Gilles Espinasse),<br/>
1098      fix schema validation in combination with xsi:nil (Daniel Veillard),<br/>
1099      xmlCtxtReadFile doesn't work with literal IPv6 URLs (Steve Wolf),<br/>
1100      Fix a few problems with setEntityLoader (Alexey Neyman),<br/>
1101      Detect excessive entities expansion upon replacement (Daniel Veillard),<br/>
1102      Fix the flushing out of raw buffers on encoding conversions (Daniel,<br/>
1103  Veillard),<br/>
1104      Fix some buffer conversion issues (Daniel Veillard),<br/>
1105      When calling xmlNodeDump make sure we grow the buffer quickly (Daniel,<br/>
1106  Veillard),<br/>
1107      Fix an error in the progressive DTD parsing code (Dan Winship),<br/>
1108      xmllint should not load DTD by default when using the reader (Daniel,<br/>
1109  Veillard),<br/>
1110      Try IBM-037 when looking for EBCDIC handlers (Petr Sumbera),<br/>
1111      Fix potential out of bound access (Daniel Veillard),<br/>
1112      Fix large parse of file from memory (Daniel Veillard),<br/>
1113      Fix a bug in the nsclean option of the parser (Daniel Veillard),<br/>
1114      Fix a regression in 2.9.0 breaking validation while streaming (Daniel,<br/>
1115  Veillard),<br/>
1116      Remove potential calls to exit() (Daniel Veillard)<br/>
1117    </li>
1118  
1119    <li> Improvements:<br/>
1120      Regenerated API, and testapi, rebuild documentation (Daniel Veillard),<br/>
1121      Fix tree iterators broken by 2to3 script (Daniel Veillard),<br/>
1122      update all tests for Python3 and Python2 (Daniel Veillard),<br/>
1123      A few more fixes for python 3 affecting libxml2.py (Daniel Veillard),<br/>
1124      Fix compilation on Python3 (Daniel Veillard),<br/>
1125      Converting apibuild.py to python3 (Daniel Veillard),<br/>
1126      First pass at starting porting to python3 (Daniel Veillard),<br/>
1127      updated configure.in for python3 (Daniel Veillard),<br/>
1128      Add support for xpathRegisterVariable in Python (Shaun McCance),<br/>
1129      Added a regression tests from bug 694228 data (Daniel Veillard),<br/>
1130      Cache presence of '&lt;' in entities content (Daniel Veillard),<br/>
1131      Avoid extra processing on entities (Daniel Veillard),<br/>
1132      Python binding for xmlRegisterInputCallback (Alexey Neyman),<br/>
1133      Python bindings: DOM casts everything to xmlNode (Alexey Neyman),<br/>
1134      Define LIBXML_THREAD_ALLOC_ENABLED via xmlversion.h (Tim Starling),<br/>
1135      Adding streaming validation to runtest checks (Daniel Veillard),<br/>
1136      Add a --pushsmall option to xmllint (Daniel Veillard)<br/>
1137    </li>
1138  
1139    <li> Cleanups:<br/>
1140      Switched comment in file to UTF-8 encoding (Daniel Veillard),<br/>
1141      Extend gitignore (Daniel Veillard),<br/>
1142      Silent the new python test on input (Alexey Neyman),<br/>
1143      Cleanup of a duplicate test (Daniel Veillard),<br/>
1144      Cleanup on duplicate test expressions (Daniel Veillard),<br/>
1145      Fix compiler warning after 153cf15905cf4ec080612ada6703757d10caba1e (Patrick,<br/>
1146  Gansterer),<br/>
1147      Spec cleanups and a fix for multiarch support (Daniel Veillard),<br/>
1148      Silence a clang warning (Daniel Veillard),<br/>
1149      Cleanup the Copyright to be pure MIT Licence wording (Daniel Veillard),<br/>
1150      rand_seed should be static in dict.c (Wouter Van Rooy),<br/>
1151      Fix typos in parser comments (Jan Pokorný)<br/>
1152    </li>
1153  </ul>
1154  <h3>2.9.0: Sep 11 2012</h3>
1155  <ul>
1156    <li> Features:<br/>
1157      A few new API entry points,<br/>
1158      More resilient push parser mode,<br/>
1159      A lot of portability improvement,<br/>
1160      Faster XPath evaluation<br/>
1161    </li>
1162  
1163    <li> Documentation:<br/>
1164      xml2-config.1 markup error (Christian Weisgerber),<br/>
1165      libxml(3) manpage typo fix (John Bradshaw),<br/>
1166      More cleanups to the documentation part of libxml2 (Daniel Richard G)<br/>
1167    </li>
1168  
1169    <li> Portability:<br/>
1170      Bug 676544 - fails to build with --without-sax1 (Akira TAGOH),<br/>
1171      fix builds not having stdint.h (Rob Richards),<br/>
1172      GetProcAddressA is available only on WinCE (Daniel Veillard),<br/>
1173      More updates and cleanups on autotools and Makefiles (Daniel Richard G),<br/>
1174      More changes for Win32 compilation (Eric Zurcher),<br/>
1175      Basic changes for Win32 builds of release 2.9.0: compile buf.c (Eric Zurcher),<br/>
1176      Bundles all generated files for python into the distribution (Daniel Richard G),<br/>
1177      Fix compiler warnings of wincecompat.c (Patrick Gansterer),<br/>
1178      Fix non __GNUC__ build (Patrick Gansterer),<br/>
1179      Fix windows unicode build (Patrick Gansterer),<br/>
1180      clean redefinition of {v}snprintf in C-source (Roumen Petrov),<br/>
1181      use xmlBuf... if DEBUG_INPUT is defined (Roumen Petrov),<br/>
1182      fix runtests to use pthreads support for various Unix platforms (Daniel Richard G),<br/>
1183      Various "make distcheck" and portability fixups 2nd part (Daniel Richard G),<br/>
1184      Various "make distcheck" and portability fixups (Daniel Richard G),<br/>
1185      Fix compilation on older Visual Studio (Daniel Veillard)<br/>
1186    </li>
1187  
1188    <li> Bug Fixes:<br/>
1189      Change the XPath code to percolate allocation errors (Daniel Veillard),<br/>
1190      Fix reuse of xmlInitParser (Daniel Veillard),<br/>
1191      Fix potential crash on entities errors (Daniel Veillard),<br/>
1192      initialize var (Rob Richards),<br/>
1193      Fix the XPath arity check to also check the XPath stack limits (Daniel Veillard),<br/>
1194      Fix problem with specific and generic error handlers (Pietro Cerutti),<br/>
1195      Avoid a potential infinite recursion (Daniel Veillard),<br/>
1196      Fix an XSD error when generating internal automata (Daniel Veillard),<br/>
1197      Patch for xinclude of text using multibyte characters (Vitaly Ostanin),<br/>
1198      Fix a segfault on XSD validation on pattern error (Daniel Veillard),<br/>
1199      Fix missing xmlsave.h module which was ignored in recent builds (Daniel Veillard),<br/>
1200      Add a missing element check (Daniel Veillard),<br/>
1201      Adding various checks on node type though the API (Daniel Veillard),<br/>
1202      Namespace nodes can't be unlinked with xmlUnlinkNode (Daniel Veillard),<br/>
1203      Fix make dist to include new private header files (Daniel Veillard),<br/>
1204      More fixups on the push parser behaviour (Daniel Veillard),<br/>
1205      Strengthen behaviour of the push parser in problematic situations (Daniel Veillard),<br/>
1206      Enforce XML_PARSER_EOF state handling through the parser (Daniel Veillard),<br/>
1207      Fixup limits parser (Daniel Veillard),<br/>
1208      Do not fetch external parsed entities (Daniel Veillard),<br/>
1209      Fix an error in previous commit (Aron Xu),<br/>
1210      Fix entities local buffers size problems (Daniel Veillard),<br/>
1211      Fix parser local buffers size problems (Daniel Veillard),<br/>
1212      Fix a failure to report xmlreader parsing failures (Daniel Veillard)<br/>
1213    </li>
1214  
1215    <li> Improvements:<br/>
1216      Keep libxml2.syms when running "make distclean" (Daniel Veillard),<br/>
1217      Allow to set the quoting character of an xmlWriter (Csaba Raduly),<br/>
1218      Keep non-significant blanks node in HTML parser (Daniel Veillard),<br/>
1219      Add a forbidden variable error number and message to XPath (Daniel Veillard),<br/>
1220      Support long path names on WNT (Michael Stahl),<br/>
1221      Improve HTML escaping of attribute on output (Daniel Veillard),<br/>
1222      Handle ICU_LIBS as LIBADD, not LDFLAGS to prevent linking errors (Arfrever Frehtes Taifersar Arahesis),<br/>
1223      Switching XPath node sorting to Timsort (Vojtech Fried),<br/>
1224      Optimizing '//' in XPath expressions (Nick Wellnhofer),<br/>
1225      Expose xmlBufShrink in the public tree API (Daniel Veillard),<br/>
1226      Visible HTML elements close the head tag (Conrad Irwin),<br/>
1227      Fix file and line report for XSD SAX and reader streaming validation (Daniel Veillard),<br/>
1228      Fix const qualifyer to definition of xmlBufferDetach (Daniel Veillard),<br/>
1229      minimize use of HAVE_CONFIG_H (Roumen Petrov),<br/>
1230      fixup regression in Various "make distcheck" and portability fixups (Roumen Petrov),<br/>
1231      Add support for big line numbers in error reporting (Daniel Veillard),<br/>
1232      Avoid using xmlBuffer for serialization (Daniel Veillard),<br/>
1233      Improve compatibility between xmlBuf and xmlBuffer (Daniel Veillard),<br/>
1234      Provide new accessors for xmlOutputBuffer (Daniel Veillard),<br/>
1235      Improvements for old buffer compatibility (Daniel Veillard),<br/>
1236      Expand the limit test program (Daniel Veillard),<br/>
1237      Improve error reporting on parser errors (Daniel Veillard),<br/>
1238      Implement some default limits in the XPath module (Daniel Veillard),<br/>
1239      Introduce some default parser limits (Daniel Veillard),<br/>
1240      Cleanups and new limit APIs for dictionaries (Daniel Veillard),<br/>
1241      Fixup for buf.c (Daniel Veillard),<br/>
1242      Cleanup URI module memory allocation code (Daniel Veillard),<br/>
1243      Extend testlimits (Daniel Veillard),<br/>
1244      More avoid quadratic behaviour (Daniel Veillard),<br/>
1245      Impose a reasonable limit on PI size (Daniel Veillard),<br/>
1246      first version of testlimits new test (Daniel Veillard),<br/>
1247      Avoid quadratic behaviour in some push parsing cases (Daniel Veillard),<br/>
1248      Impose a reasonable limit on comment size (Daniel Veillard),<br/>
1249      Impose a reasonable limit on attribute size (Daniel Veillard),<br/>
1250      Harden the buffer code and make it more compatible (Daniel Veillard),<br/>
1251      More cleanups for input/buffers code (Daniel Veillard),<br/>
1252      Cleanup function xmlBufResetInput(),<br/> to set input from Buffer (Daniel Veillard)
1253      Swicth the test program for characters to new input buffers (Daniel Veillard),<br/>
1254      Convert the HTML tree module to the new buffers (Daniel Veillard),<br/>
1255      Convert of the HTML parser to new input buffers (Daniel Veillard),<br/>
1256      Convert the writer to new output buffer and save APIs (Daniel Veillard),<br/>
1257      Convert XMLReader to the new input buffers (Daniel Veillard),<br/>
1258      New saving functions using xmlBuf and conversion (Daniel Veillard),<br/>
1259      Provide new xmlBuf based saving functions (Daniel Veillard),<br/>
1260      Convert XInclude to the new input buffers (Daniel Veillard),<br/>
1261      Convert catalog code to the new input buffers (Daniel Veillard),<br/>
1262      Convert C14N to the new Input buffer (Daniel Veillard),<br/>
1263      Convert xmlIO.c to the new input and output buffers (Daniel Veillard),<br/>
1264      Convert XML parser to the new input buffers (Daniel Veillard),<br/>
1265      Incompatible change to the Input and Output buffers (Daniel Veillard),<br/>
1266      Adding new encoding function to deal with the new structures (Daniel Veillard),<br/>
1267      Convert XPath to xmlBuf (Daniel Veillard),<br/>
1268      Adding a new buf module for buffers (Daniel Veillard),<br/>
1269      Memory error within SAX2 reuse common framework (Daniel Veillard),<br/>
1270      Fix xmllint --xpath node initialization (Daniel Veillard)<br/>
1271    </li>
1272  
1273    <li> Cleanups:<br/>
1274      Various cleanups to avoid compiler warnings (Daniel Veillard),<br/>
1275      Big space and tab cleanup (Daniel Veillard),<br/>
1276      Followup to LibXML2 docs/examples cleanup patch (Daniel Veillard),<br/>
1277      Second round of cleanups for LibXML2 docs/examples (Daniel Richard),<br/>
1278      Remove all .cvsignore as they are not used anymore (Daniel Veillard),<br/>
1279      Fix a Timsort function helper comment (Daniel Veillard),<br/>
1280      Small cleanup for valgrind target (Daniel Veillard),<br/>
1281      Patch for portability of latin characters in C files (Daniel Veillard),<br/>
1282      Cleanup some of the parser code (Daniel Veillard),<br/>
1283      Fix a variable name in comment (Daniel Veillard),<br/>
1284      Regenerated testapi.c (Daniel Veillard),<br/>
1285      Regenerating docs and API files (Daniel Veillard),<br/>
1286      Small cleanup of unused variables in test (Daniel Veillard),<br/>
1287      Expand .gitignore with more files (Daniel Veillard)<br/>
1288    </li>
1289  </ul>
1290  <h3>2.8.0: May 23 2012</h3>
1291  <ul>
1292    <li>Features:
1293    add lzma compression support (Anders F Bjorklund)
1294    </li>
1295  
1296    <li>Documentation:
1297      xmlcatalog: Add uri and delegateURI to possible add types in man page. (Ville Skyttä),
1298      Update README.tests (Daniel Veillard),
1299      URI handling code is not OOM resilient (Daniel Veillard),
1300      Fix an error in comment (Daniel Veillard),
1301      Fixed bug #617016 (Daniel Mustieles),
1302      Fixed two typos in the README document (Daniel Neel),
1303      add generated html files (Anders F Bjorklund),
1304      Clarify the need to use xmlFreeNode after xmlUnlinkNode (Daniel Veillard),
1305      Improve documentation a bit (Daniel Veillard),
1306      Updated URL for lxml python bindings (Daniel Veillard)
1307    </li>
1308  
1309    <li>Portability:
1310      Restore code for Windows compilation (Daniel Veillard),
1311      Remove git error message during configure (Christian Dywan),
1312      xmllint: Build fix for endTimer if !defined(HAVE_GETTIMEOFDAY) (Patrick R. Gansterer),
1313      remove a bashism in confgure.in (John Hein),
1314      undef ERROR if already defined (Patrick R. Gansterer),
1315      Fix library problems with mingw-w64 (Michael Cronenworth),
1316      fix windows build. ifdef addition from bug 666491 makes no sense (Rob Richards),
1317      prefer native threads on win32 (Sam Thursfield),
1318      Allow to compile with Visual Studio 2010 (Thomas Lemm),
1319      Fix mingw's snprintf configure check (Andoni Morales),
1320      fixed a 64bit big endian issue (Marcus Meissner),
1321      Fix portability failure if netdb.h lacks NO_ADDRESS (Daniel Veillard),
1322      Fix windows build from lzma addition (Rob Richards),
1323      autogen: Only check for libtoolize (Colin Walters),
1324      Fix the Windows build files (Patrick von Reth),
1325      634846 Remove a linking option breaking Windows VC10 (Daniel Veillard),
1326      599241 fix an initialization problem on Win64 (Andrew W. Nosenko),
1327      fix win build (Rob Richards)
1328    </li>
1329  
1330    <li>Bug fixes:
1331      Part for rand_r checking missing (Daniel Veillard),
1332      Cleanup on randomization (Daniel Veillard),
1333      Fix undefined reference in python module (Pacho Ramos),
1334      Fix a race in xmlNewInputStream (Daniel Veillard),
1335      Fix weird streaming RelaxNG errors (Noam),
1336      Fix various bugs in new code raised by the API checking (Daniel Veillard),
1337      Fix various problems with "make dist" (Daniel Veillard),
1338      Fix a memory leak in the xzlib code (Daniel Veillard),
1339      HTML parser error with &lt;noscript&gt; in the &lt;head&gt; (Denis Pauk),
1340      XSD: optional element in complex type extension (Remi Gacogne),
1341      Fix html serialization error and htmlSetMetaEncoding() (Daniel Veillard),
1342      Fix a wrong return value in previous patch (Daniel Veillard),
1343      Fix an uninitialized variable use (Daniel Veillard),
1344      Fix a compilation problem with --minimum (Brandon Slack),
1345      Remove redundant and ungarded include of resolv.h (Daniel Veillard),
1346      xinclude with parse="text" does not use the entity loader (Shaun McCance),
1347      Allow to parse 1 byte HTML files (Denis Pauk),
1348      Patch that fixes the skipping of the HTML_PARSE_NOIMPLIED flag (Martin Schröder),
1349      Avoid memory leak if xmlParserInputBufferCreateIO fails (Lin Yi-Li),
1350      Prevent an infinite loop when dumping a node with encoding problems (Timothy Elliott),
1351      xmlParseNodeInContext problems with an empty document (Tim Elliott),
1352      HTML element position is not detected propperly (Pavel Andrejs),
1353      Fix an off by one pointer access (Jüri Aedla),
1354      Try to fix a problem with entities in SAX mode (Daniel Veillard),
1355      Fix a crash with xmllint --path on empty results (Daniel Veillard),
1356      Fixed bug #667946 (Daniel Mustieles),
1357      Fix a logic error in Schemas Component Constraints (Ryan Sleevi),
1358      Fix a wrong enum type use in Schemas Types (Nico Weber),
1359      Fix SAX2 builder in case of undefined attributes namespace (Daniel Veillard),
1360      Fix SAX2 builder in case of undefined element namespaces (Daniel Veillard),
1361      fix reference to STDOUT_FILENO on MSVC (Tay Ray Chuan),
1362      fix a pair of possible out of array char references (Daniel Veillard),
1363      Fix an allocation error when copying entities (Daniel Veillard),
1364      Make sure the parser returns when getting a Stop order (Chris Evans),
1365      Fix some potential problems on reallocation failures(parser.c) (Xia Xinfeng),
1366      Fix a schema type duration comparison overflow (Daniel Veillard),
1367      Fix an unimplemented part in RNG value validation (Daniel Veillard),
1368      Fix missing error status in XPath evaluation (Daniel Veillard),
1369      Hardening of XPath evaluation (Daniel Veillard),
1370      Fix an off by one error in encoding (Daniel Veillard),
1371      Fix RELAX NG include bug #655288 (Shaun McCance),
1372      Fix XSD validation bug #630130 (Toyoda Eizi),
1373      Fix some potential problems on reallocation failures (Chris Evans),
1374      __xmlRaiseError: fix use of the structured callback channel (Dmitry V. Levin),
1375      __xmlRaiseError: fix the structured callback channel's data initialization (Dmitry V. Levin),
1376      Fix memory corruption when xmlParseBalancedChunkMemoryInternal is called from xmlParseBalancedChunk (Rob Richards),
1377      Small fix for previous commit (Daniel Veillard),
1378      Fix a potential freeing error in XPath (Daniel Veillard),
1379      Fix a potential memory access error (Daniel Veillard),
1380      Reactivate the shared library versionning script (Daniel Veillard)
1381    </li>
1382  
1383    <li>Improvements:
1384      use mingw C99 compatible functions {v}snprintf instead those from MSVC runtime (Roumen Petrov),
1385      New symbols added for the next release (Daniel Veillard),
1386      xmlTextReader bails too quickly on error (Andy Lutomirski),
1387      Use a hybrid allocation scheme in xmlNodeSetContent (Conrad Irwin),
1388      Use buffers when constructing string node lists. (Conrad Irwin),
1389      Add HTML parser support for HTML5 meta charset encoding declaration (Denis Pauk),
1390      wrong message for double hyphen in comment XML error (Bryan Henderson),
1391      Fix "make tst" to grab lzma lib too (Daniel Veillard),
1392      Add "whereis" command to xmllint shell (Ryan),
1393      Improve xmllint shell (Ryan),
1394      add function xmlTextReaderRelaxNGValidateCtxt() (Noam Postavsky),
1395      Add --system support to autogen.sh (Daniel Veillard),
1396      Add hash randomization to hash and dict structures (Daniel Veillard),
1397      included xzlib in dist (Anders F Bjorklund),
1398      move xz/lzma helpers to separate included files (Anders F Bjorklund),
1399      add generated devhelp files (Anders F Bjorklund),
1400      add XML_WITH_LZMA to api (Anders F Bjorklund),
1401      autogen.sh: Honor NOCONFIGURE environment variable (Colin Walters),
1402      Improve the error report on undefined REFs (Daniel Veillard),
1403      Add exception for new W3C PI xml-model (Daniel Veillard),
1404      Add options to ignore the internal encoding (Daniel Veillard),
1405      testapi: use the right type for the check (Stefan Kost),
1406      various: handle return values of write calls (Stefan Kost),
1407      testWriter: xmlTextWriterWriteFormatElement wants an int instead of a long int (Stefan Kost),
1408      runxmlconf: update to latest testsuite version (Stefan Kost),
1409      configure: add -Wno-long-long to CFLAGS (Stefan Kost),
1410      configure: support silent automake rules if possible (Stefan Kost),
1411      xmlmemory: add a cast as size_t has no portable printf modifier (Stefan Kost),
1412      __xmlRaiseError: remove redundant schannel initialization (Dmitry V. Levin),
1413      __xmlRaiseError: do cheap code check early (Dmitry V. Levin)
1414    </li>
1415  
1416    <li>Cleanups:
1417      Cleanups before 2.8.0-rc2 (Daniel Veillard),
1418      Avoid an extra operation (Daniel Veillard),
1419      Remove vestigial de-ANSI-fication support. (Javier Jardón),
1420      autogen.sh: Fix typo (Javier Jardón),
1421      Do not use unsigned but unsigned int (Daniel Veillard),
1422      Remove two references to u_short (Daniel Veillard),
1423      Fix -Wempty-body warning from clang (Nico Weber),
1424      Cleanups of lzma support (Daniel Veillard),
1425      Augment the list of ignored files (Daniel Veillard),
1426      python: remove unused variable (Stefan Kost),
1427      python: flag two unused args (Stefan Kost),
1428      configure: acconfig.h is deprecated since autoconf-2.50 (Stefan Kost),
1429      xpath: remove unused variable (Stefan Kost)
1430    </li>
1431  </ul>
1432  <h3>2.7.8: Nov 4 2010</h3>
1433  <ul>
1434    <li> Features:
1435      480323 add code to plug in ICU converters by default (Giuseppe Iuculano),
1436      Add xmlSaveOption XML_SAVE_WSNONSIG (Adam Spragg)
1437    </li>
1438    <li> Documentation:
1439      Fix devhelp documentation installation (Mike Hommey),
1440      Fix web site encoding problems (Daniel Veillard),
1441      Fix a couple of typo in HTML parser error messages (Michael Day),
1442      Forgot to update the news page for 0.7.7 (Daniel Veillard)
1443    </li>
1444    <li> Portability:
1445      607273 Fix python detection on MSys/Windows (LRN),
1446      614087 Fix Socket API usage to allow Windows64 compilation (Ozkan Sezer),
1447      Fix compilation with Clang (Koop Mast),
1448      Fix Win32 build (Rob Richards)
1449    </li>
1450    <li> Bug Fixes:
1451      595789 fix a remaining potential Solaris problem (Daniel Veillard),
1452      617468 fix progressive HTML parsing with style using "'" (Denis Pauk),
1453      616478 Fix xmllint shell write command (Gwenn Kahz),
1454      614005 Possible erroneous HTML parsing on unterminated script (Pierre Belzile),
1455      627987 Fix XSD IDC errors in imported schemas (Jim Panetta),
1456      629325 XPath rounding errors first cleanup (Phil Shafer),
1457      630140 fix iso995x encoding error (Daniel Veillard),
1458      make sure htmlCtxtReset do reset the disableSAX field (Daniel Veillard),
1459      Fix a change of semantic on XPath preceding and following axis (Daniel Veillard),
1460      Fix a potential segfault due to weak symbols on pthreads (Mike Hommey),
1461      Fix a leak in XPath compilation (Daniel Veillard),
1462      Fix the semantic of XPath axis for namespace/attribute context nodes (Daniel Veillard),
1463      Avoid a descriptor leak in catalog loading code (Carlo Bramini),
1464      Fix a small bug in XPath evaluation code (Marius Wachtler),
1465      Fix handling of XML-1.0 XML namespace declaration (Daniel Veillard),
1466      Fix errors in XSD double validation check (Csaba Raduly),
1467      Fix handling of apos in URIs (Daniel Veillard),
1468      xmlTextReaderReadOuterXml should handle DTD (Rob Richards),
1469      Autogen.sh needs to create m4 directory (Rob Richards)
1470    </li>
1471    <li> Improvements:
1472      606592 update language ID parser to RFC 5646 (Daniel Veillard),
1473      Sort python generated stubs (Mike Hommey),
1474      Add an HTML parser option to avoid a default doctype (Daniel Veillard)
1475    </li>
1476    <li> Cleanups:
1477      618831 don't ship generated files in git (Adrian Bunk),
1478      Switch from the obsolete mkinstalldirs to AC_PROG_MKDIR_P (Adrian Bunk),
1479      Various cleanups on encoding handling (Daniel Veillard),
1480      Fix xmllint to use format=1 for default formatting (Adam Spragg),
1481      Force _xmlSaveCtxt.format to be 0 or 1 (Adam Spragg),
1482      Cleanup encoding pointer comparison (Nikolay Sivov),
1483      Small code cleanup on previous patch (Daniel Veillard)
1484    </li>
1485  </ul>
1486  <h3>2.7.7: Mar 15 2010</h3>
1487  <ul>
1488    <li> Improvements:
1489      Adding a --xpath option to xmllint (Daniel Veillard),
1490      Make HTML parser non-recursive (Eugene Pimenov)
1491    </li>
1492    <li> Portability:
1493      relaxng.c: cast to allow compilation with sun studio 11 (Ben Walton),
1494      Fix build failure on Sparc solaris (Roumen Petrov),
1495      use autoreconf in autogen.sh (Daniel Veillard),
1496      Fix build with mingw (Roumen Petrov),
1497      Upgrade some of the configure and autogen (Daniel Veillard),
1498      Fix relaxNG tests in runtest for Windows runtest.c: initialize ret (Rob Richards),
1499      Fix a const warning in xmlNodeSetBase (Martin Trappel),
1500      Fix python generator to not use deprecated xmllib (Daniel Veillard),
1501      Update some automake files (Daniel Veillard),
1502      598785 Fix nanohttp on Windows (spadix)
1503    </li>
1504    <li> Bug Fixes:
1505      libxml violates the zlib interface and crashes (Mark Adler),
1506      Fix broken escape behaviour in regexp ranges (Daniel Veillard),
1507      Fix  missing win32 libraries in libxml-2.0.pc (Volker Grabsch),
1508      Fix detection of python linker flags (Daniel Macks),
1509      fix build error in libxml2/python (Paul Smith),
1510      ChunkParser: Incorrect decoding of small xml files (Raul Hudea),
1511      htmlCheckEncoding doesn't update input-end after shrink (Eugene Pimenov),
1512      Fix a missing #ifdef (Daniel Veillard),
1513      Fix encoding selection for xmlParseInNodeContext (Daniel Veillard),
1514      xmlPreviousElementSibling mistake (François Delyon),
1515      608773 add a missing check in xmlGROW (Daniel Veillard),
1516      Fix xmlParseInNodeContext for HTML content (Daniel Veillard),
1517      Fix lost namespace when copying node * tree.c: reconcile namespace if not found (Rob Richards),
1518      Fix some missing commas in HTML element lists (Eugene Pimenov),
1519      Correct variable type to unsigned (Nikolay Sivov),
1520      Recognize ID attribute in HTML without DOCTYPE (Daniel Veillard),
1521      Fix memory leak in xmlXPathEvalExpression() (Martin),
1522      Fix an init bug in global.c (Kai Henning),
1523      Fix xmlNodeSetBase() comment (Daniel Veillard),
1524      Fix broken escape behaviour in regexp ranges (Daniel Veillard),
1525      Don't give default HTML boolean attribute values in parser (Daniel Veillard),
1526      xmlCtxtResetLastError should reset ctxt-errNo (Daniel Veillard)
1527    </li>
1528    <li> Cleanups:
1529      Cleanup a couple of weirdness in HTML parser (Eugene Pimenov)
1530    </li>
1531  </ul>
1532  <h3>2.7.6: Oct  6 2009</h3>
1533  <ul>
1534    <li> Bug Fixes:
1535       Restore thread support in default configuration (Andrew W. Nosenko),
1536       URI with no path parsing problem (Daniel Veillard),
1537       Minor patch for conditional defines in threads.c (Eric Zurcher)
1538    </li>
1539  </ul>
1540  <h3>2.7.5: Sep 24 2009</h3>
1541  <ul>
1542    <li> Bug Fixes:
1543      Restore behavior of --with-threads without argument (Andrew W. Nosenko),
1544      Fix memory leak when doc is NULL (Rob Richards),
1545      595792 fixing a RelaxNG bug introduced in 2.7.4 (Daniel Veillard),
1546      Fix a Relaxng bug raised by libvirt test suite (Daniel Veillard),
1547      Fix a parsing problem with little data at startup (Daniel Veillard),
1548      link python module with python library (Frederic Crozat),
1549      594874 Forgot an fclose in xmllint (Daniel Veillard)
1550    </li>
1551    <li> Cleanup:
1552      Adding symbols.xml to EXTRA_DIST (Daniel Veillard)
1553    </li>
1554  </ul>
1555  <h3>2.7.4: Sep 10 2009</h3>
1556  <ul>
1557    <li>Improvements:
1558      Switch to GIT (GNOME),
1559      Add symbol versioning to libxml2 shared libs (Daniel Veillard)
1560    </li>
1561    <li>Portability:
1562      593857 try to work around thread pbm MinGW 4.4 (Daniel Veillard),
1563      594250 rename ATTRIBUTE_ALLOC_SIZE to avoid clashes (Daniel Veillard),
1564      Fix Windows build * relaxng.c: fix windows build (Rob Richards),
1565      Fix the globals.h to use XMLPUBFUN (Paul Smith),
1566      Problem with extern extern in header (Daniel Veillard),
1567      Add -lnetwork for compiling on Haiku (Scott McCreary),
1568      Runtest portability patch for Solaris (Tim Rice),
1569      Small patch to accomodate the Haiku OS (Scott McCreary),
1570      584605 package VxWorks folder in the distribution (Daniel Veillard),
1571      574017 Realloc too expensive on most platform (Daniel Veillard),
1572      Fix windows build (Rob Richards),
1573      545579 doesn't compile without schema support (Daniel Veillard),
1574      xmllint use xmlGetNodePath when not compiled in (Daniel Veillard),
1575      Try to avoid __imp__xmlFree link trouble on msys (Daniel Veillard),
1576      Allow to select the threading system on Windows (LRN),
1577      Fix Solaris binary links, cleanups (Daniel Veillard),
1578      Bug 571059 – MSVC doesn't work with the bakefile (Intron),
1579      fix ATTRIBUTE_PRINTF header clash (Belgabor and Mike Hommey),
1580      fixes for Borland/CodeGear/Embarcadero compilers (Eric Zurcher)
1581    </li>
1582    <li>Documentation:
1583      544910 typo: "renciliateNs" (Leonid Evdokimov),
1584      Add VxWorks to list of OSes (Daniel Veillard),
1585      Regenerate the documentation and update for git (Daniel Veillard),
1586      560524 ¿ xmlTextReaderLocalName description (Daniel Veillard),
1587      Added sponsoring by AOE media for the server (Daniel Veillard),
1588      updated URLs for GNOME (Vincent Lefevre),
1589      more warnings about xmlCleanupThreads and xmlCleanupParser (Daniel Veillard)
1590    </li>
1591    <li>Bug fixes:
1592      594514 memory leaks - duplicate initialization (MOD),
1593      Wrong block opening in htmlNodeDumpOutputInternal (Daniel Veillard),
1594      492317 Fix  Relax-NG validation problems (Daniel Veillard),
1595      558452 fight with reg test and error report (Daniel Veillard),
1596      558452 RNG compilation of optional multiple child (Daniel Veillard),
1597      579746 XSD validation not correct / nilable groups (Daniel Veillard),
1598      502960 provide namespace stack when parsing entity (Daniel Veillard),
1599      566012 part 2 fix regresion tests and push mode (Daniel Veillard),
1600      566012 autodetected encoding and encoding conflict (Daniel Veillard),
1601      584220 xpointer(/) and xinclude problems (Daniel Veillard),
1602      587663 Incorrect Attribute-Value Normalization (Daniel Veillard),
1603      444994 HTML chunked failure for attribute with &lt;&gt; (Daniel Veillard),
1604      Fix end of buffer char being split in XML parser (Daniel Veillard),
1605      Non ASCII character may be split at buffer end (Adiel Mittmann),
1606      440226 Add xmlXIncludeProcessTreeFlagsData API (Stefan Behnel),
1607      572129 speed up parsing of large HTML text nodes (Markus Kull),
1608      Fix HTML parsing with 0 character in CDATA (Daniel Veillard),
1609      Fix SetGenericErrorFunc and SetStructured clash (Wang Lam),
1610      566012  Incomplete EBCDIC parsing support (Martin Kogler),
1611      541335 HTML avoid creating 2 head or 2 body element (Daniel Veillard),
1612      541237 error correcting missing end tags in HTML (Daniel Veillard),
1613      583439 missing line numbers in push mode (Daniel Veillard),
1614      587867 xmllint --html --xmlout serializing as HTML (Daniel Veillard),
1615      559501 avoid select and use poll for nanohttp (Raphael Prevost),
1616      559410 -  Regexp bug on (...)? constructs (Daniel Veillard),
1617      Fix a small problem on previous HTML parser patch (Daniel Veillard),
1618      592430 -  HTML parser runs into endless loop (Daniel Veillard),
1619      447899 potential double free in xmlFreeTextReader (Daniel Veillard),
1620      446613 small validation bug mixed content with NS (Daniel Veillard),
1621      Fix the problem of revalidating a doc with RNG (Daniel Veillard),
1622      Fix xmlKeepBlanksDefault to not break indent (Nick Wellnhofer),
1623      512131 refs from externalRef part need to be added (Daniel Veillard),
1624      512131 crash in xmlRelaxNGValidateFullElement (Daniel Veillard),
1625      588441 allow '.' in HTML Names even if invalid (Daniel Veillard),
1626      582913 Fix htmlSetMetaEncoding() to be nicer (Daniel Veillard),
1627      579317 Try to find the HTML encoding information (Daniel Veillard),
1628      575875 don't output charset=html (Daniel Veillard),
1629      571271 fix semantic of xsd:all with minOccurs=0 (Daniel Veillard),
1630      570702 fix a bug in regexp determinism checking (Daniel Veillard),
1631      567619 xmlValidateNotationUse missing param test (Daniel Veillard),
1632      574393 ¿ utf-8 filename magic for compressed files (Hans Breuer),
1633      Fix a couple of problems in the parser (Daniel Veillard),
1634      585505 ¿ Document ids and refs populated by XSD (Wayne Jensen),
1635      582906 XSD validating multiple imports of the same schema (Jason Childs),
1636      Bug 582887 ¿ problems validating complex schemas (Jason Childs),
1637      Bug 579729 ¿ fix XSD schemas parsing crash (Miroslav Bajtos),
1638      576368 ¿ htmlChunkParser with special attributes (Jiri Netolicky),
1639      Bug 565747 ¿ relax anyURI data character checking (Vincent Lefevre),
1640      Preserve attributes of include start on tree copy (Petr Pajas),
1641      Skip silently unrecognized XPointer schemes (Jakub Wilk),
1642      Fix leak on SAX1, xmllint --sax1 option and debug (Daniel Veillard),
1643      potential NULL dereference on non-glibc (Jim Meyering),
1644      Fix an XSD validation crash (Daniel Veillard),
1645      Fix a regression in streaming entities support (Daniel Veillard),
1646      Fix a couple of ABI issues with C14N 1.1 (Aleksey Sanin),
1647      Aleksey Sanin support for c14n 1.1 (Aleksey Sanin),
1648      reader bug fix with entities (Daniel Veillard),
1649      use options from current parser ctxt for external entities (Rob Richards),
1650      581612 use %s to printf strings (Christian Persch),
1651      584605 change the threading initialization sequence (Igor Novoseltsev),
1652      580705 keep line numbers in HTML parser (Aaron Patterson),
1653      581803 broken HTML table attributes init (Roland Steiner),
1654      do not set error code in xmlNsWarn (Rob Richards),
1655      564217 fix structured error handling problems,
1656      reuse options from current parser for entities (Rob Richards),
1657      xmlXPathRegisterNs should not allow enpty prefixes (Daniel Veillard),
1658      add a missing check in xmlAddSibling (Kris Breuker),
1659      avoid leaks on errors (Jinmei Tatuya)
1660    </li>
1661    <li>Cleanup:
1662      Chasing dead assignments reported by clang-scan (Daniel Veillard),
1663      A few more safety cleanup raised by scan (Daniel Veillard),
1664      Fixing assorted potential problems raised by scan (Daniel Veillard),
1665      Potential uninitialized arguments raised by scan (Daniel Veillard),
1666      Fix a bunch of scan 'dead increments' and cleanup (Daniel Veillard),
1667      Remove a pedantic warning (Daniel Veillard),
1668      555833 always use rm -f in uninstall-local (Daniel Veillard),
1669      542394 xmlRegisterOutputCallbacks MAX_INPUT_CALLBACK (Daniel Veillard),
1670      Autoregenerate libxml2.syms automated checkings (Daniel Veillard),
1671      Make xmlRecoverDoc const (Martin Trappel) (Daniel Veillard),
1672      Both args of xmlStrcasestr are const (Daniel Veillard),
1673      hide the nbParse* variables used for debugging (Mike Hommey),
1674      570806 changed include of config.h (William M. Brack),
1675      cleanups and error reports when xmlTextWriterVSprintf fails (Jinmei Tatuya)
1676    </li>
1677  </ul>
1678  <h3>2.7.3: Jan 18 2009</h3>
1679  <ul>
1680    <li>Build fix: fix build when HTML support is not included.</li>
1681    <li>Bug fixes: avoid memory overflow in gigantic text nodes,
1682        indentation problem on the writed (Rob Richards),
1683        xmlAddChildList pointer problem (Rob Richards and Kevin Milburn),
1684        xmlAddChild problem with attribute (Rob Richards and Kris Breuker),
1685        avoid a memory leak in an edge case (Daniel Zimmermann),
1686        deallocate some pthread data (Alex Ott).</li>
1687    <li>Improvements: configure option to avoid rebuilding docs (Adrian Bunk),
1688        limit text nodes to 10MB max by default, add element traversal
1689        APIs, add a parser option to enable pre 2.7 SAX behavior (Rob Richards),
1690        add gcc malloc checking (Marcus Meissner), add gcc printf like functions
1691        parameters checking (Marcus Meissner).</li>
1692  </ul>
1693  <h3>2.7.2: Oct 3 2008</h3>
1694  <ul>
1695      <li>Portability fix: fix solaris compilation problem, fix compilation
1696          if XPath is not configured in</li>
1697      <li>Bug fixes: nasty entity bug introduced in 2.7.0, restore old behaviour
1698          when saving an HTML doc with an xml dump function, HTML UTF-8 parsing
1699          bug, fix reader custom error handlers (Riccardo Scussat)
1700      <li>Improvement: xmlSave options for more flexibility to save as
1701          XML/HTML/XHTML, handle leading BOM in HTML documents</li>
1702  </ul>
1703  
1704  <h3>2.7.1: Sep 1 2008</h3>
1705  <ul>
1706      <li>Portability fix: Borland C fix (Moritz Both)</li>
1707      <li>Bug fixes: python serialization wrappers, XPath QName corner
1708          case handking and leaks (Martin)</li>
1709      <li>Improvement: extend the xmlSave to handle HTML documents and trees</li>
1710      <li>Cleanup: python serialization wrappers</li>
1711  </ul>
1712  
1713  <h3>2.7.0: Aug 30 2008</h3>
1714  <ul>
1715    <li>Documentation: switch ChangeLog to UTF-8, improve mutithreads and
1716        xmlParserCleanup docs</li>
1717    <li>Portability fixes: Older Win32 platforms (Rob Richards), MSVC
1718        porting fix (Rob Richards), Mac OS X regression tests (Sven Herzberg),
1719        non GNUCC builds (Rob Richards), compilation on Haiku (Andreas Färber)
1720        </li>
1721    <li>Bug fixes: various realloc problems (Ashwin), potential double-free
1722        (Ashwin), regexp crash, icrash with invalid whitespace facets (Rob
1723        Richards), pattern fix when streaming (William Brack), various XML
1724        parsing and validation fixes based on the W3C regression tests, reader
1725        tree skipping function fix (Ashwin), Schemas regexps escaping fix
1726        (Volker Grabsch), handling of entity push errors (Ashwin), fix a slowdown
1727        when encoder cant serialize characters on output</li>
1728    <li>Code cleanup: compilation fix without the reader, without the output
1729        (Robert Schwebel), python whitespace (Martin), many space/tabs cleanups,
1730        serious cleanup of the entity handling code</li>
1731    <li>Improvement: switch parser to XML-1.0 5th edition, add parsing flags
1732        for old versions, switch URI parsing to RFC 3986,
1733        add xmlSchemaValidCtxtGetParserCtxt (Holger Kaelberer),
1734        new hashing functions for dictionnaries (based on Stefan Behnel work),
1735        improve handling of misplaced html/head/body in HTML parser, better
1736        regression test tools and code coverage display, better algorithms
1737        to detect various versions of the billion laughts attacks, make
1738        arbitrary parser limits avoidable as a parser option</li>
1739  </ul>
1740  <h3>2.6.32: Apr 8 2008</h3>
1741  <ul>
1742    <li>Documentation: returning heap memory to kernel (Wolfram Sang),
1743        trying to clarify xmlCleanupParser() use, xmlXPathContext improvement
1744        (Jack Jansen), improve the *Recover* functions documentation,
1745        XmlNodeType doc link fix (Martijn Arts)</li>
1746    <li>Bug fixes: internal subset memory leak (Ashwin), avoid problem with
1747        paths starting with // (Petr Sumbera), streaming XSD validation callback
1748        patches (Ashwin), fix redirection on port other than 80 (William Brack),
1749        SAX2 leak (Ashwin), XInclude fragment of own document (Chris Ryan),
1750        regexp bug with '.' (Andrew Tosh), flush the writer at the end of the
1751        document (Alfred Mickautsch), output I/O bug fix (William Brack),
1752        writer CDATA output after a text node (Alex Khesin), UTF-16 encoding
1753        detection (William Brack), fix handling of empty CDATA nodes for Safari
1754        team, python binding problem with namespace nodes, improve HTML parsing
1755        (Arnold Hendriks), regexp automata build bug, memory leak fix (Vasily
1756        Chekalkin), XSD test crash, weird system parameter entity parsing problem,
1757        allow save to file:///X:/ windows paths, various attribute normalisation
1758        problems, externalSubsetSplit fix (Ashwin), attribute redefinition in
1759        the DTD (Ashwin), fix in char ref parsing check (Alex Khesin), many
1760        out of memory handling fixes (Ashwin), XPath out of memory handling fixes
1761        (Alvaro Herrera), various realloc problems (Ashwin), UCS4 encoding
1762        conversion buffer size (Christian Fruth), problems with EatName
1763        functions on memory errors, BOM handling in external parsed entities
1764        (Mark Rowe)</li>
1765    <li>Code cleanup: fix build under VS 2008 (David Wimsey), remove useless
1766        mutex in xmlDict (Florent Guilian), Mingw32 compilation fix (Carlo
1767        Bramini), Win and MacOS EOL cleanups (Florent Guiliani), iconv need
1768        a const detection (Roumen Petrov), simplify xmlSetProp (Julien Charbon),
1769        cross compilation fixes for Mingw (Roumen Petrov), SCO Openserver build
1770        fix (Florent Guiliani), iconv uses const on Win32 (Rob Richards),
1771        duplicate code removal (Ashwin), missing malloc test and error reports
1772        (Ashwin), VMS makefile fix (Tycho Hilhorst)</li>
1773    <li>improvements: better plug of schematron in the normal error handling
1774        (Tobias Minich)</li>
1775  </ul>
1776  
1777  <h3>2.6.31: Jan 11 2008</h3>
1778  <ul>
1779    <li>Security fix: missing of checks in UTF-8 parsing</li>
1780    <li>Bug fixes: regexp bug, dump attribute from XHTML document, fix
1781        xmlFree(NULL) to not crash in debug mode, Schematron parsing crash
1782        (Rob Richards), global lock free on Windows (Marc-Antoine Ruel),
1783        XSD crash due to double free (Rob Richards), indentation fix in
1784        xmlTextWriterFullEndElement (Felipe Pena), error in attribute type
1785        parsing if attribute redeclared, avoid crash in hash list scanner if
1786        deleting elements, column counter bug fix (Christian Schmidt),
1787        HTML embed element saving fix (Stefan Behnel), avoid -L/usr/lib
1788        output from xml2-config (Fred Crozat), avoid an xmllint crash 
1789        (Stefan Kost), don't stop HTML parsing on out of range chars.
1790        </li>
1791    <li>Code cleanup: fix open() call third argument, regexp cut'n paste
1792        copy error, unused variable in __xmlGlobalInitMutexLock (Hannes Eder),
1793        some make distcheck realted fixes (John Carr)</li>
1794    <li>Improvements: HTTP Header: includes port number (William Brack),
1795        testURI --debug option, </li>
1796  </ul>
1797  <h3>2.6.30: Aug 23 2007</h3>
1798  <ul>
1799    <li>Portability: Solaris crash on error handling, windows path fixes
1800        (Roland Schwarz and Rob Richards), mingw build (Roland Schwarz)</li>
1801    <li>Bugfixes: xmlXPathNodeSetSort problem (William Brack), leak when
1802        reusing a writer for a new document (Dodji Seketeli), Schemas
1803        xsi:nil handling patch (Frank Gross), relative URI build problem
1804        (Patrik Fimml), crash in xmlDocFormatDump, invalid char in comment
1805        detection bug, fix disparity with xmlSAXUserParseMemory, automata
1806        generation for complex regexp counts problems, Schemas IDC import
1807        problems (Frank Gross), xpath predicate evailation error handling
1808        (William Brack)</li>
1809  </ul>
1810  <h3>2.6.29: Jun 12 2007</h3>
1811  <ul>
1812    <li>Portability: patches from Andreas Stricke for WinCEi,
1813        fix compilation warnings (William Brack), avoid warnings on Apple OS/X
1814        (Wendy Doyle and Mark Rowe), Windows compilation and threading
1815        improvements (Rob Richards), compilation against old Python versions,
1816        new GNU tar changes (Ryan Hill)</li>
1817    <li>Documentation: xmlURIUnescapeString comment, </li>
1818    <li>Bugfixes: xmlBufferAdd problem (Richard Jones), 'make valgrind'
1819        flag fix (Richard Jones), regexp interpretation of \,
1820        htmlCreateDocParserCtxt (Jean-Daniel Dupas), configure.in
1821        typo (Bjorn Reese), entity content failure, xmlListAppend() fix
1822        (Georges-André Silber), XPath number serialization (William Brack),
1823        nanohttp gzipped stream fix (William Brack and Alex Cornejo),
1824        xmlCharEncFirstLine typo (Mark Rowe), uri bug (François Delyon),
1825        XPath string value of PI nodes (William Brack), XPath node set
1826        sorting bugs (William Brack), avoid outputting namespace decl
1827        dups in the writer (Rob Richards), xmlCtxtReset bug, UTF-8 encoding
1828        error handling, recustion on next in catalogs, fix a Relax-NG crash,
1829        workaround wrong file: URIs, htmlNodeDumpFormatOutput on attributes,
1830        invalid character in attribute detection bug, big comments before 
1831        internal subset streaming bug, HTML parsing of attributes with : in
1832        the name, IDness of name in HTML (Dagfinn I. Mannsåker) </li>
1833    <li>Improvement: keep URI query parts in raw form (Richard Jones),
1834        embed tag support in HTML (Michael Day) </li>
1835  </ul>
1836  
1837  <h3>2.6.28: Apr 17 2007</h3>
1838  <ul>
1839    <li>Documentation: comment fixes (Markus Keim), xpath comments fixes too
1840        (James Dennett)</li>
1841    <li>Bug fixes: XPath bug (William Brack), HTML parser autoclose stack usage
1842        (Usamah Malik), various regexp bug fixes (DV and William), path conversion
1843        on Windows (Igor Zlatkovic), htmlCtxtReset fix (Michael Day), XPath
1844        principal node of axis bug, HTML serialization of some codepoint
1845        (Steven Rainwater), user data propagation in XInclude (Michael Day),
1846        standalone and XML decl detection (Michael Day), Python id ouptut
1847        for some id, fix the big python string memory leak, URI parsing fixes
1848        (Stéphane Bidoul and William), long comments parsing bug (William),
1849        concurrent threads initialization (Ted Phelps), invalid char
1850        in text XInclude (William), XPath memory leak (William), tab in
1851        python problems (Andreas Hanke), XPath node comparison error
1852        (Oleg Paraschenko), cleanup patch for reader (Julien Reichel),
1853        XML Schemas attribute group (William), HTML parsing problem (William),
1854        fix char 0x2d in regexps (William), regexp quantifier range with
1855        min occurs of 0 (William), HTML script/style parsing (Mike Day)</li>
1856    <li>Improvement: make xmlTextReaderSetup() public</li>
1857    <li>Compilation and postability: fix a missing include problem (William),
1858        __ss_familly on AIX again (Björn Wiberg), compilation without zlib
1859        (Michael Day), catalog patch for Win32 (Christian Ehrlicher),
1860        Windows CE fixes (Andreas Stricke)</li>
1861    <li>Various CVS to SVN infrastructure changes</li>
1862  </ul>
1863  <h3>2.6.27: Oct 25 2006</h3>
1864  <ul>
1865    <li>Portability fixes: file names on windows (Roland Schwingel, 
1866        Emelyanov Alexey), windows compile fixup (Rob Richards), 
1867        AIX iconv() is apparently case sensitive</li>
1868    <li>improvements: Python XPath types mapping (Nic Ferrier), XPath optimization
1869        (Kasimier), add xmlXPathCompiledEvalToBoolean (Kasimier), Python node
1870        equality and comparison (Andreas Pakulat), xmlXPathCollectAndTest
1871        improvememt (Kasimier), expose if library was compiled with zlib 
1872        support (Andrew Nosenko), cache for xmlSchemaIDCMatcher structs
1873        (Kasimier), xmlTextConcat should work with comments and PIs (Rob
1874        Richards), export htmlNewParserCtxt needed by Michael Day, refactoring
1875        of catalog entity loaders (Michael Day), add XPointer support to 
1876        python bindings (Ross Reedstrom, Brian West and Stefan Anca), 
1877        try to sort out most file path to URI conversions and xmlPathToUri,
1878        add --html --memory case to xmllint</li>
1879    <li>building fix: fix --with-minimum (Felipe Contreras), VMS fix, 
1880        const'ification of HTML parser structures (Matthias Clasen),
1881        portability fix (Emelyanov Alexey), wget autodetection (Peter
1882        Breitenlohner),  remove the build path recorded in the python
1883        shared module, separate library flags for shared and static builds
1884        (Mikhail Zabaluev), fix --with-minimum --with-sax1 builds, fix
1885        --with-minimum --with-schemas builds</li>
1886    <li>bug fix: xmlGetNodePath fix (Kasimier), xmlDOMWrapAdoptNode and
1887        attribute (Kasimier), crash when using the recover mode, 
1888        xmlXPathEvalExpr problem (Kasimier), xmlXPathCompExprAdd bug (Kasimier),
1889        missing destry in xmlFreeRMutex (Andrew Nosenko), XML Schemas fixes
1890        (Kasimier), warning on entities processing, XHTML script and style
1891        serialization (Kasimier), python generator for long types, bug in
1892        xmlSchemaClearValidCtxt (Bertrand Fritsch), xmlSchemaXPathEvaluate
1893        allocation bug (Marton Illes), error message end of line (Rob Richards),
1894        fix attribute serialization in writer (Rob Richards), PHP4 DTD validation
1895        crasher, parser safety patch (Ben Darnell), _private context propagation
1896        when parsing entities (with Michael Day), fix entities behaviour when 
1897        using SAX, URI to file path fix (Mikhail Zabaluev), disapearing validity
1898        context, arg error in SAX callback (Mike Hommey), fix mixed-content
1899        autodetect when using --noblanks, fix xmlIOParseDTD error handling,
1900        fix bug in xmlSplitQName on special Names, fix Relax-NG element content
1901        validation bug, fix xmlReconciliateNs bug, fix potential attribute 
1902        XML parsing bug, fix line/column accounting in XML parser, chunking bug
1903        in the HTML parser on script, try to detect obviously buggy HTML
1904        meta encoding indications, bugs with encoding BOM and xmlSaveDoc, 
1905        HTML entities in attributes parsing, HTML minimized attribute values,
1906        htmlReadDoc and htmlReadIO were broken, error handling bug in
1907        xmlXPathEvalExpression (Olaf Walkowiak), fix a problem in
1908        htmlCtxtUseOptions, xmlNewInputFromFile could leak (Marius Konitzer),
1909        bug on misformed SSD regexps (Christopher Boumenot)
1910        </li>
1911    <li>documentation: warning about XML_PARSE_COMPACT (Kasimier Buchcik),
1912        fix xmlXPathCastToString documentation, improve man pages for
1913        xmllitn and xmlcatalog (Daniel Leidert), fixed comments of a few
1914        functions</li>
1915  </ul>
1916  <h3>2.6.26: Jun 6 2006</h3>
1917  <ul>
1918    <li>portability fixes: Python detection (Joseph Sacco), compilation
1919      error(William Brack and Graham Bennett), LynxOS patch (Olli Savia)</li>
1920    <li>bug fixes: encoding buffer problem, mix of code and data in
1921      xmlIO.c(Kjartan Maraas), entities in XSD validation (Kasimier Buchcik),
1922      variousXSD validation fixes (Kasimier), memory leak in pattern (Rob
1923      Richards andKasimier), attribute with colon in name (Rob Richards), XPath
1924      leak inerror reporting (Aleksey Sanin), XInclude text include of
1925      selfdocument.</li>
1926    <li>improvements: Xpath optimizations (Kasimier), XPath object
1927      cache(Kasimier)</li>
1928  </ul>
1929  
1930  <h3>2.6.25: Jun 6 2006:</h3>
1931  
1932  <p>Do not use or package 2.6.25</p>
1933  
1934  <h3>2.6.24: Apr 28 2006</h3>
1935  <ul>
1936    <li>Portability fixes: configure on Windows, testapi compile on windows
1937        (Kasimier Buchcik, venkat naidu), Borland C++ 6 compile (Eric Zurcher),
1938        HP-UX compiler workaround (Rick Jones), xml2-config bugfix, gcc-4.1
1939        cleanups, Python detection scheme (Joseph Sacco), UTF-8 file paths on
1940        Windows (Roland Schwingel).
1941        </li>
1942    <li>Improvements: xmlDOMWrapReconcileNamespaces xmlDOMWrapCloneNode (Kasimier
1943        Buchcik), XML catalog debugging (Rick Jones), update to Unicode 4.01.</li>
1944    <li>Bug fixes: xmlParseChunk() problem in 2.6.23, xmlParseInNodeContext()
1945        on HTML docs, URI behaviour on Windows (Rob Richards), comment streaming
1946        bug, xmlParseComment (with William Brack), regexp bug fixes (DV &amp;
1947        Youri Golovanov), xmlGetNodePath on text/CDATA (Kasimier),
1948        one Relax-NG interleave bug, xmllint --path and --valid,
1949        XSD bugfixes (Kasimier), remove debug
1950        left in Python bindings (Nic Ferrier), xmlCatalogAdd bug (Martin Cole),
1951        xmlSetProp fixes (Rob Richards), HTML IDness (Rob Richards), a large
1952        number of cleanups and small fixes based on Coverity reports, bug
1953        in character ranges, Unicode tables const (Aivars Kalvans), schemas
1954        fix (Stefan Kost), xmlRelaxNGParse error deallocation, 
1955        xmlSchemaAddSchemaDoc error deallocation, error handling on unallowed
1956        code point, ixmllint --nonet to never reach the net (Gary Coady),
1957        line break in writer after end PI (Jason Viers). </li>
1958    <li>Documentation: man pages updates and cleanups (Daniel Leidert).</li>
1959    <li>New features: Relax NG structure error handlers.</li>
1960  </ul>
1961  
1962  <h3>2.6.23: Jan 5 2006</h3>
1963  <ul>
1964    <li>portability fixes: Windows (Rob Richards), getaddrinfo on Windows
1965      (Kolja Nowak, Rob Richards), icc warnings (Kjartan Maraas),
1966      --with-minimum compilation fixes (William Brack), error case handling fix
1967      on Solaris (Albert Chin), don't use 'list' as parameter name reported by
1968      Samuel Diaz Garcia, more old Unices portability fixes (Albert Chin),
1969      MinGW compilation (Mark Junker), HP-UX compiler warnings (Rick
1970    Jones),</li>
1971    <li>code cleanup: xmlReportError (Adrian Mouat), remove xmlBufferClose
1972      (Geert Jansen), unreachable code (Oleksandr Kononenko), refactoring
1973      parsing code (Bjorn Reese)</li>
1974    <li>bug fixes: xmlBuildRelativeURI and empty path (William Brack),
1975      combinatory explosion and performances in regexp code, leak in
1976      xmlTextReaderReadString(), xmlStringLenDecodeEntities problem (Massimo
1977      Morara), Identity Constraints bugs and a segfault (Kasimier Buchcik),
1978      XPath pattern based evaluation bugs (DV &amp; Kasimier),
1979      xmlSchemaContentModelDump() memory leak (Kasimier), potential leak in
1980      xmlSchemaCheckCSelectorXPath(), xmlTextWriterVSprintf() misuse of
1981      vsnprintf (William Brack), XHTML serialization fix (Rob Richards), CRLF
1982      split problem (William), issues with non-namespaced attributes in
1983      xmlAddChild() xmlAddNextSibling() and xmlAddPrevSibling() (Rob Richards),
1984      HTML parsing of script, Python must not output to stdout (Nic Ferrier),
1985      exclusive C14N namespace visibility (Aleksey Sanin), XSD dataype
1986      totalDigits bug (Kasimier Buchcik), error handling when writing to an
1987      xmlBuffer (Rob Richards), runtest schemas error not reported (Hisashi
1988      Fujinaka), signed/unsigned problem in date/time code (Albert Chin), fix
1989      XSI driven XSD validation (Kasimier), parsing of xs:decimal (Kasimier),
1990      fix DTD writer output (Rob Richards), leak in xmlTextReaderReadInnerXml
1991      (Gary Coady), regexp bug affecting schemas (Kasimier), configuration of
1992      runtime debugging (Kasimier), xmlNodeBufGetContent bug on entity refs
1993      (Oleksandr Kononenko), xmlRegExecPushString2 bug (Sreeni Nair),
1994      compilation and build fixes (Michael Day), removed dependancies on
1995      xmlSchemaValidError (Kasimier), bug with &lt;xml:foo/&gt;, more XPath
1996      pattern based evaluation fixes (Kasimier)</li>
1997    <li>improvements: XSD Schemas redefinitions/restrictions (Kasimier
1998      Buchcik), node copy checks and fix for attribute (Rob Richards), counted
1999      transition bug in regexps, ctxt-&gt;standalone = -2 to indicate no
2000      standalone attribute was found, add xmlSchemaSetParserStructuredErrors()
2001      (Kasimier Buchcik), add xmlTextReaderSchemaValidateCtxt() to API
2002      (Kasimier), handle gzipped HTTP resources (Gary Coady), add
2003      htmlDocDumpMemoryFormat. (Rob Richards),</li>
2004    <li>documentation: typo (Michael Day), libxml man page (Albert Chin), save
2005      function to XML buffer (Geert Jansen), small doc fix (Aron Stansvik),</li>
2006  </ul>
2007  
2008  <h3>2.6.22: Sep 12 2005</h3>
2009  <ul>
2010    <li>build fixes: compile without schematron (Stéphane Bidoul)</li>
2011    <li>bug fixes: xmlDebugDumpNode on namespace node (Oleg Paraschenko)i,
2012      CDATA push parser bug, xmlElemDump problem with XHTML1 doc,
2013      XML_FEATURE_xxx clash with expat headers renamed XML_WITH_xxx, fix some
2014      output formatting for meta element (Rob Richards), script and style
2015      XHTML1 serialization (David Madore), Attribute derivation fixups in XSD
2016      (Kasimier Buchcik), better IDC error reports (Kasimier Buchcik)</li>
2017    <li>improvements: add XML_SAVE_NO_EMPTY xmlSaveOption (Rob Richards), add
2018      XML_SAVE_NO_XHTML xmlSaveOption, XML Schemas improvements preparing for
2019      derive (Kasimier Buchcik).</li>
2020    <li>documentation: generation of gtk-doc like docs, integration with
2021      devhelp.</li>
2022  </ul>
2023  
2024  <h3>2.6.21: Sep 4 2005</h3>
2025  <ul>
2026    <li>build fixes: Cygwin portability fixes (Gerrit P. Haase), calling
2027      convention problems on Windows (Marcus Boerger), cleanups based on Linus'
2028      sparse tool, update of win32/configure.js (Rob Richards), remove warnings
2029      on Windows(Marcus Boerger), compilation without SAX1, detection of the
2030      Python binary, use $GCC inestad of $CC = 'gcc' (Andrew W. Nosenko),
2031      compilation/link with threads and old gcc, compile problem by C370 on
2032      Z/OS,</li>
2033    <li>bug fixes: http_proxy environments (Peter Breitenlohner), HTML UTF-8
2034      bug (Jiri Netolicky), XPath NaN compare bug (William Brack),
2035      htmlParseScript potential bug, Schemas regexp handling of spaces, Base64
2036      Schemas comparisons NIST passes, automata build error xsd:all,
2037      xmlGetNodePath for namespaced attributes (Alexander Pohoyda), xmlSchemas
2038      foreign namespaces handling, XML Schemas facet comparison (Kupriyanov
2039      Anatolij), xmlSchemaPSimpleTypeErr error report (Kasimier Buchcik), xml:
2040      namespace ahndling in Schemas (Kasimier), empty model group in Schemas
2041      (Kasimier), wilcard in Schemas (Kasimier), URI composition (William),
2042      xs:anyType in Schemas (Kasimier), Python resolver emmitting error
2043      messages directly, Python xmlAttr.parent (Jakub Piotr Clapa), trying to
2044      fix the file path/URI conversion, xmlTextReaderGetAttribute fix (Rob
2045      Richards), xmlSchemaFreeAnnot memleak (Kasimier), HTML UTF-8
2046      serialization, streaming XPath, Schemas determinism detection problem,
2047      XInclude bug, Schemas context type (Dean Hill), validation fix (Derek
2048      Poon), xmlTextReaderGetAttribute[Ns] namespaces (Rob Richards), Schemas
2049      type fix (Kuba Nowakowski), UTF-8 parser bug, error in encoding handling,
2050      xmlGetLineNo fixes, bug on entities handling, entity name extraction in
2051      error handling with XInclude, text nodes in HTML body tags (Gary Coady),
2052      xml:id and IDness at the treee level fixes, XPath streaming patterns
2053    bugs.</li>
2054    <li>improvements: structured interfaces for schemas and RNG error reports
2055      (Marcus Boerger), optimization of the char data inner loop parsing
2056      (thanks to Behdad Esfahbod for the idea), schematron validation though
2057      not finished yet, xmlSaveOption to omit XML declaration, keyref match
2058      error reports (Kasimier), formal expression handling code not plugged
2059      yet, more lax mode for the HTML parser, parser XML_PARSE_COMPACT option
2060      for text nodes allocation.</li>
2061    <li>documentation: xmllint man page had --nonet duplicated</li>
2062  </ul>
2063  
2064  <h3>2.6.20: Jul 10 2005</h3>
2065  <ul>
2066    <li>build fixes: Windows build (Rob Richards), Mingw compilation (Igor
2067      Zlatkovic), Windows Makefile (Igor), gcc warnings (Kasimier and
2068      andriy@google.com), use gcc weak references to pthread to avoid the
2069      pthread dependancy on Linux, compilation problem (Steve Nairn), compiling
2070      of subset (Morten Welinder), IPv6/ss_family compilation (William Brack),
2071      compilation when disabling parts of the library, standalone test
2072      distribution.</li>
2073    <li>bug fixes: bug in lang(), memory cleanup on errors (William Brack),
2074      HTTP query strings (Aron Stansvik), memory leak in DTD (William), integer
2075      overflow in XPath (William), nanoftp buffer size, pattern "." apth fixup
2076      (Kasimier), leak in tree reported by Malcolm Rowe, replaceNode patch
2077      (Brent Hendricks), CDATA with NULL content (Mark Vakoc), xml:base fixup
2078      on XInclude (William), pattern fixes (William), attribute bug in
2079      exclusive c14n (Aleksey Sanin), xml:space and xml:lang with SAX2 (Rob
2080      Richards), namespace trouble in complex parsing (Malcolm Rowe), XSD type
2081      QNames fixes (Kasimier), XPath streaming fixups (William), RelaxNG bug
2082      (Rob Richards), Schemas for Schemas fixes (Kasimier), removal of ID (Rob
2083      Richards), a small RelaxNG leak, HTML parsing in push mode bug (James
2084      Bursa), failure to detect UTF-8 parsing bugs in CDATA sections,
2085      areBlanks() heuristic failure, duplicate attributes in DTD bug
2086    (William).</li>
2087    <li>improvements: lot of work on Schemas by Kasimier Buchcik both on
2088      conformance and streaming, Schemas validation messages (Kasimier Buchcik,
2089      Matthew Burgess), namespace removal at the python level (Brent
2090      Hendricks), Update to new Schemas regression tests from W3C/Nist
2091      (Kasimier), xmlSchemaValidateFile() (Kasimier), implementation of
2092      xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml (James Wert),
2093      standalone test framework and programs, new DOM import APIs
2094      xmlDOMWrapReconcileNamespaces() xmlDOMWrapAdoptNode() and
2095      xmlDOMWrapRemoveNode(), extension of xmllint capabilities for SAX and
2096      Schemas regression tests, xmlStopParser() available in pull mode too,
2097      ienhancement to xmllint --shell namespaces support, Windows port of the
2098      standalone testing tools (Kasimier and William),
2099      xmlSchemaValidateStream() xmlSchemaSAXPlug() and xmlSchemaSAXUnplug() SAX
2100      Schemas APIs, Schemas xmlReader support.</li>
2101  </ul>
2102  
2103  <h3>2.6.19: Apr 02 2005</h3>
2104  <ul>
2105    <li>build fixes: drop .la from RPMs, --with-minimum build fix (William
2106      Brack), use XML_SOCKLEN_T instead of SOCKLEN_T because it breaks with AIX
2107      5.3 compiler, fixed elfgcchack.h generation and PLT reduction code on
2108      Linux/ELF/gcc4</li>
2109    <li>bug fixes: schemas type decimal fixups (William Brack), xmmlint return
2110      code (Gerry Murphy), small schemas fixes (Matthew Burgess and GUY
2111      Fabrice), workaround "DAV:" namespace brokeness in c14n (Aleksey Sanin),
2112      segfault in Schemas (Kasimier Buchcik), Schemas attribute validation
2113      (Kasimier), Prop related functions and xmlNewNodeEatName (Rob Richards),
2114      HTML serialization of name attribute on a elements, Python error handlers
2115      leaks and improvement (Brent Hendricks), uninitialized variable in
2116      encoding code, Relax-NG validation bug, potential crash if
2117      gnorableWhitespace is NULL, xmlSAXParseDoc and xmlParseDoc signatures,
2118      switched back to assuming UTF-8 in case no encoding is given at
2119      serialization time</li>
2120    <li>improvements: lot of work on Schemas by Kasimier Buchcik on facets
2121      checking and also mixed handling.</li>
2122    <li></li>
2123  </ul>
2124  
2125  <h3>2.6.18: Mar 13 2005</h3>
2126  <ul>
2127    <li>build fixes: warnings (Peter Breitenlohner), testapi.c generation,
2128      Bakefile support (Francesco Montorsi), Windows compilation (Joel Reed),
2129      some gcc4 fixes, HP-UX portability fixes (Rick Jones).</li>
2130    <li>bug fixes: xmlSchemaElementDump namespace (Kasimier Buchcik), push and
2131      xmlreader stopping on non-fatal errors, thread support for dictionnaries
2132      reference counting (Gary Coady), internal subset and push problem, URL
2133      saved in xmlCopyDoc, various schemas bug fixes (Kasimier), Python paths
2134      fixup (Stephane Bidoul), xmlGetNodePath and namespaces, xmlSetNsProp fix
2135      (Mike Hommey), warning should not count as error (William Brack),
2136      xmlCreatePushParser empty chunk, XInclude parser flags (William), cleanup
2137      FTP and HTTP code to reuse the uri parsing and IPv6 (William),
2138      xmlTextWriterStartAttributeNS fix (Rob Richards), XMLLINT_INDENT being
2139      empty (William), xmlWriter bugs (Rob Richards), multithreading on Windows
2140      (Rich Salz), xmlSearchNsByHref fix (Kasimier), Python binding leak (Brent
2141      Hendricks), aliasing bug exposed by gcc4 on s390, xmlTextReaderNext bug
2142      (Rob Richards), Schemas decimal type fixes (William Brack),
2143      xmlByteConsumed static buffer (Ben Maurer).</li>
2144    <li>improvement: speedup parsing comments and DTDs, dictionary support for
2145      hash tables, Schemas Identity constraints (Kasimier), streaming XPath
2146      subset, xmlTextReaderReadString added (Bjorn Reese), Schemas canonical
2147      values handling (Kasimier), add xmlTextReaderByteConsumed (Aron
2148    Stansvik),</li>
2149    <li>Documentation: Wiki support (Joel Reed)</li>
2150  </ul>
2151  
2152  <h3>2.6.17: Jan 16 2005</h3>
2153  <ul>
2154    <li>build fixes: Windows, warnings removal (William Brack),
2155      maintainer-clean dependency(William), build in a different directory
2156      (William), fixing --with-minimum configure build (William), BeOS build
2157      (Marcin Konicki), Python-2.4 detection (William), compilation on AIX (Dan
2158      McNichol)</li>
2159    <li>bug fixes: xmlTextReaderHasAttributes (Rob Richards), xmlCtxtReadFile()
2160      to use the catalog(s), loop on output (William Brack), XPath memory leak,
2161      ID deallocation problem (Steve Shepard), debugDumpNode crash (William),
2162      warning not using error callback (William), xmlStopParser bug (William),
2163      UTF-16 with BOM on DTDs (William), namespace bug on empty elements in
2164      push mode (Rob Richards), line and col computations fixups (Aleksey
2165      Sanin), xmlURIEscape fix (William), xmlXPathErr on bad range (William),
2166      patterns with too many steps, bug in RNG choice optimization, line number
2167      sometimes missing.</li>
2168    <li>improvements: XSD Schemas (Kasimier Buchcik), python generator
2169      (William), xmlUTF8Strpos speedup (William), unicode Python strings
2170      (William), XSD error reports (Kasimier Buchcik), Python __str__ call
2171      serialize().</li>
2172    <li>new APIs: added xmlDictExists(), GetLineNumber and GetColumnNumber for
2173      the xmlReader (Aleksey Sanin), Dynamic Shared Libraries APIs (mostly Joel
2174      Reed), error extraction API from regexps, new XMLSave option for format
2175      (Phil Shafer)</li>
2176    <li>documentation: site improvement (John Fleck), FAQ entries
2177    (William).</li>
2178  </ul>
2179  
2180  <h3>2.6.16: Nov 10 2004</h3>
2181  <ul>
2182    <li>general hardening and bug fixing crossing all the API based on new
2183      automated regression testing</li>
2184    <li>build fix: IPv6 build and test on AIX (Dodji Seketeli)</li>
2185    <li>bug fixes: problem with XML::Libxml reported by Petr Pajas,  encoding
2186      conversion functions return values, UTF-8 bug affecting XPath reported by
2187      Markus Bertheau, catalog problem with NULL entries (William Brack)</li>
2188    <li>documentation: fix to xmllint man page, some API function descritpion
2189      were updated.</li>
2190    <li>improvements: DTD validation APIs provided at the Python level (Brent
2191      Hendricks)</li>
2192  </ul>
2193  
2194  <h3>2.6.15: Oct 27 2004</h3>
2195  <ul>
2196    <li>security fixes on the nanoftp and nanohttp modules</li>
2197    <li>build fixes: xmllint detection bug in configure, building outside the
2198      source tree (Thomas Fitzsimmons)</li>
2199    <li>bug fixes: HTML parser on broken ASCII chars in names (William), Python
2200      paths (Malcolm Tredinnick), xmlHasNsProp and default namespace (William),
2201      saving to python file objects (Malcolm Tredinnick), DTD lookup fix
2202      (Malcolm), save back &lt;group&gt; in catalogs (William), tree build
2203      fixes (DV and Rob Richards), Schemas memory bug, structured error handler
2204      on Python 64bits, thread local memory deallocation, memory leak reported
2205      by Volker Roth, xmlValidateDtd in the presence of an internal subset,
2206      entities and _private problem (William), xmlBuildRelativeURI error
2207      (William).</li>
2208    <li>improvements: better XInclude error reports (William), tree debugging
2209      module and tests, convenience functions at the Reader API (Graham
2210      Bennett), add support for PI in the HTML parser.</li>
2211  </ul>
2212  
2213  <h3>2.6.14: Sep 29 2004</h3>
2214  <ul>
2215    <li>build fixes: configure paths for xmllint and xsltproc, compilation
2216      without HTML parser, compilation warning cleanups (William Brack &amp;
2217      Malcolm Tredinnick), VMS makefile update (Craig Berry),</li>
2218    <li>bug fixes: xmlGetUTF8Char (William Brack), QName properties (Kasimier
2219      Buchcik), XInclude testing, Notation serialization, UTF8ToISO8859x
2220      transcoding (Mark Itzcovitz), lots of XML Schemas cleanup and fixes
2221      (Kasimier), ChangeLog cleanup (Stepan Kasal), memory fixes (Mark Vakoc),
2222      handling of failed realloc(), out of bound array adressing in Schemas
2223      date handling, Python space/tabs cleanups (Malcolm Tredinnick), NMTOKENS
2224      E20 validation fix (Malcolm),</li>
2225    <li>improvements: added W3C XML Schemas testsuite (Kasimier Buchcik), add
2226      xmlSchemaValidateOneElement (Kasimier), Python exception hierearchy
2227      (Malcolm Tredinnick), Python libxml2 driver improvement (Malcolm
2228      Tredinnick), Schemas support for xsi:schemaLocation,
2229      xsi:noNamespaceSchemaLocation, xsi:type (Kasimier Buchcik)</li>
2230  </ul>
2231  
2232  <h3>2.6.13: Aug 31 2004</h3>
2233  <ul>
2234    <li>build fixes: Windows and zlib (Igor Zlatkovic), -O flag with gcc,
2235      Solaris compiler warning, fixing RPM BuildRequires,</li>
2236    <li>fixes: DTD loading on Windows (Igor), Schemas error reports APIs
2237      (Kasimier Buchcik), Schemas validation crash, xmlCheckUTF8 (William Brack
2238      and Julius Mittenzwei), Schemas facet check (Kasimier), default namespace
2239      problem (William), Schemas hexbinary empty values, encoding error could
2240      genrate a serialization loop.</li>
2241    <li>Improvements: Schemas validity improvements (Kasimier), added --path
2242      and --load-trace options to xmllint</li>
2243    <li>documentation: tutorial update (John Fleck)</li>
2244  </ul>
2245  
2246  <h3>2.6.12: Aug 22 2004</h3>
2247  <ul>
2248    <li>build fixes: fix --with-minimum, elfgcchack.h fixes (Peter
2249      Breitenlohner), perl path lookup (William), diff on Solaris (Albert
2250      Chin), some 64bits cleanups.</li>
2251    <li>Python: avoid a warning with 2.3 (William Brack), tab and space mixes
2252      (William), wrapper generator fixes (William), Cygwin support (Gerrit P.
2253      Haase), node wrapper fix (Marc-Antoine Parent), XML Schemas support
2254      (Torkel Lyng)</li>
2255    <li>Schemas: a lot of bug fixes and improvements from Kasimier Buchcik</li>
2256    <li>fixes: RVT fixes (William), XPath context resets bug (William), memory
2257      debug (Steve Hay), catalog white space handling (Peter Breitenlohner),
2258      xmlReader state after attribute reading (William), structured error
2259      handler (William), XInclude generated xml:base fixup (William), Windows
2260      memory reallocation problem (Steve Hay), Out of Memory conditions
2261      handling (William and Olivier Andrieu), htmlNewDoc() charset bug,
2262      htmlReadMemory init (William), a posteriori validation DTD base
2263      (William), notations serialization missing, xmlGetNodePath (Dodji),
2264      xmlCheckUTF8 (Diego Tartara), missing line numbers on entity
2265    (William)</li>
2266    <li>improvements: DocBook catalog build scrip (William), xmlcatalog tool
2267      (Albert Chin), xmllint --c14n option, no_proxy environment (Mike Hommey),
2268      xmlParseInNodeContext() addition, extend xmllint --shell, allow XInclude
2269      to not generate start/end nodes, extend xmllint --version to include CVS
2270      tag (William)</li>
2271    <li>documentation: web pages fixes, validity API docs fixes (William)
2272      schemas API fix (Eric Haszlakiewicz), xmllint man page (John Fleck)</li>
2273  </ul>
2274  
2275  <h3>2.6.11: July 5 2004</h3>
2276  <ul>
2277    <li>Schemas: a lot of changes and improvements by Kasimier Buchcik for
2278      attributes, namespaces and simple types.</li>
2279    <li>build fixes: --with-minimum (William Brack),  some gcc cleanup
2280      (William), --with-thread-alloc (William)</li>
2281    <li>portability: Windows binary package change (Igor Zlatkovic), Catalog
2282      path on Windows</li>
2283    <li>documentation: update to the tutorial (John Fleck), xmllint return code
2284      (John Fleck), man pages (Ville Skytta),</li>
2285    <li>bug fixes: C14N bug serializing namespaces (Aleksey Sanin), testSAX
2286      properly initialize the library (William), empty node set in XPath
2287      (William), xmlSchemas errors (William), invalid charref problem pointed
2288      by Morus Walter, XInclude xml:base generation (William), Relax-NG bug
2289      with div processing (William), XPointer and xml:base problem(William),
2290      Reader and entities, xmllint return code for schemas (William), reader
2291      streaming problem (Steve Ball), DTD serialization problem (William),
2292      libxml.m4 fixes (Mike Hommey), do not provide destructors as methods on
2293      Python classes, xmlReader buffer bug, Python bindings memory interfaces
2294      improvement (with Stéphane Bidoul), Fixed the push parser to be back to
2295      synchronous behaviour.</li>
2296    <li>improvement: custom per-thread I/O enhancement (Rob Richards), register
2297      namespace in debug shell (Stefano Debenedetti), Python based regression
2298      test for non-Unix users (William), dynamically increase the number of
2299      XPath extension functions in Python and fix a memory leak (Marc-Antoine
2300      Parent and William)</li>
2301    <li>performance: hack done with Arjan van de Ven to reduce ELF footprint
2302      and generated code on Linux, plus use gcc runtime profiling to optimize
2303      the code generated in the RPM packages.</li>
2304  </ul>
2305  
2306  <h3>2.6.10: May 17 2004</h3>
2307  <ul>
2308    <li>Web page generated for ChangeLog</li>
2309    <li>build fixes: --without-html problems, make check without make all</li>
2310    <li>portability: problem with xpath.c on Windows (MSC and Borland), memcmp
2311      vs. strncmp on Solaris, XPath tests on Windows (Mark Vakoc), C++ do not
2312      use "list" as parameter name, make tests work with Python 1.5 (Ed
2313    Davis),</li>
2314    <li>improvements: made xmlTextReaderMode public, small buffers resizing
2315      (Morten Welinder), add --maxmem option to xmllint, add
2316      xmlPopInputCallback() for Matt Sergeant, refactoring of serialization
2317      escaping, added escaping customization</li>
2318    <li>bugfixes: xsd:extension (Taihei Goi), assorted regexp bugs (William
2319      Brack), xmlReader end of stream problem, node deregistration with reader,
2320      URI escaping and filemanes,  XHTML1 formatting (Nick Wellnhofer), regexp
2321      transition reduction (William), various XSD Schemas fixes (Kasimier
2322      Buchcik), XInclude fallback problem (William), weird problems with DTD
2323      (William), structured error handler callback context (William), reverse
2324      xmlEncodeSpecialChars() behaviour back to escaping '"'</li>
2325  </ul>
2326  
2327  <h3>2.6.9: Apr 18 2004</h3>
2328  <ul>
2329    <li>implement xml:id Working Draft, relaxed XPath id() checking</li>
2330    <li>bugfixes: xmlCtxtReset (Brent Hendricks), line number and CDATA (Dave
2331      Beckett), Relax-NG compilation (William Brack), Regexp patches (with
2332      William), xmlUriEscape (Mark Vakoc), a Relax-NG notAllowed problem (with
2333      William), Relax-NG name classes compares (William), XInclude duplicate
2334      fallback (William), external DTD encoding detection (William), a DTD
2335      validation bug (William), xmlReader Close() fix, recusive extention
2336      schemas</li>
2337    <li>improvements: use xmlRead* APIs in test tools (Mark Vakoc), indenting
2338      save optimization, better handle IIS broken HTTP redirect  behaviour (Ian
2339      Hummel), HTML parser frameset (James Bursa), libxml2-python RPM
2340      dependancy, XML Schemas union support (Kasimier Buchcik), warning removal
2341      clanup (William), keep ChangeLog compressed when installing from RPMs</li>
2342    <li>documentation: examples and xmlDocDumpMemory docs (John Fleck), new
2343      example (load, xpath, modify, save), xmlCatalogDump() comments,</li>
2344    <li>Windows: Borland C++ builder (Eric Zurcher), work around Microsoft
2345      compiler NaN handling bug (Mark Vakoc)</li>
2346  </ul>
2347  
2348  <h3>2.6.8: Mar 23 2004</h3>
2349  <ul>
2350    <li>First step of the cleanup of the serialization code and APIs</li>
2351    <li>XML Schemas: mixed content (Adam Dickmeiss), QName handling fixes (Adam
2352      Dickmeiss), anyURI for "" (John Belmonte)</li>
2353    <li>Python: Canonicalization C14N support added (Anthony Carrico)</li>
2354    <li>xmlDocCopyNode() extension (William)</li>
2355    <li>Relax-NG: fix when processing XInclude results (William), external
2356      reference in interleave (William), missing error on &lt;choice&gt;
2357      failure (William), memory leak in schemas datatype facets.</li>
2358    <li>xmlWriter: patch for better DTD support (Alfred Mickautsch)</li>
2359    <li>bug fixes: xmlXPathLangFunction memory leak (Mike Hommey and William
2360      Brack), no ID errors if using HTML_PARSE_NOERROR, xmlcatalog fallbacks to
2361      URI on SYSTEM lookup failure, XInclude parse flags inheritance (William),
2362      XInclude and XPointer fixes for entities (William), XML parser bug
2363      reported by Holger Rauch, nanohttp fd leak (William),  regexps char
2364      groups '-' handling (William), dictionary reference counting problems,
2365      do not close stderr.</li>
2366    <li>performance patches from Petr Pajas</li>
2367    <li>Documentation fixes: XML_CATALOG_FILES in man pages (Mike Hommey)</li>
2368    <li>compilation and portability fixes: --without-valid, catalog cleanups
2369      (Peter Breitenlohner), MingW patch (Roland Schwingel), cross-compilation
2370      to Windows (Christophe de Vienne),  --with-html-dir fixup (Julio Merino
2371      Vidal), Windows build (Eric Zurcher)</li>
2372  </ul>
2373  
2374  <h3>2.6.7: Feb 23 2004</h3>
2375  <ul>
2376    <li>documentation: tutorial updates (John Fleck), benchmark results</li>
2377    <li>xmlWriter: updates and fixes (Alfred Mickautsch, Lucas Brasilino)</li>
2378    <li>XPath optimization (Petr Pajas)</li>
2379    <li>DTD ID handling optimization</li>
2380    <li>bugfixes: xpath number with  &gt; 19 fractional (William Brack), push
2381      mode with unescaped '&gt;' characters, fix xmllint --stream --timing, fix
2382      xmllint --memory --stream memory usage, xmlAttrSerializeTxtContent
2383      handling NULL, trying to fix Relax-NG/Perl interface.</li>
2384    <li>python: 2.3 compatibility, whitespace fixes (Malcolm Tredinnick)</li>
2385    <li>Added relaxng option to xmllint --shell</li>
2386  </ul>
2387  
2388  <h3>2.6.6: Feb 12 2004</h3>
2389  <ul>
2390    <li>nanohttp and nanoftp: buffer overflow error on URI parsing (Igor and
2391      William) reported by Yuuichi Teranishi</li>
2392    <li>bugfixes: make test and path issues, xmlWriter attribute serialization
2393      (William Brack), xmlWriter indentation (William), schemas validation
2394      (Eric Haszlakiewicz), XInclude dictionnaries issues (William and Oleg
2395      Paraschenko), XInclude empty fallback (William), HTML warnings (William),
2396      XPointer in XInclude (William), Python namespace serialization,
2397      isolat1ToUTF8 bound error (Alfred Mickautsch), output of parameter
2398      entities in internal subset (William), internal subset bug in push mode,
2399      &lt;xs:all&gt; fix (Alexey Sarytchev)</li>
2400    <li>Build: fix for automake-1.8 (Alexander Winston), warnings removal
2401      (Philip Ludlam), SOCKLEN_T detection fixes (Daniel Richard), fix
2402      --with-minimum configuration.</li>
2403    <li>XInclude: allow the 2001 namespace without warning.</li>
2404    <li>Documentation: missing example/index.html (John Fleck), version
2405      dependancies (John Fleck)</li>
2406    <li>reader API: structured error reporting (Steve Ball)</li>
2407    <li>Windows compilation: mingw, msys (Mikhail Grushinskiy), function
2408      prototype (Cameron Johnson), MSVC6 compiler warnings, _WINSOCKAPI_
2409    patch</li>
2410    <li>Parsers: added xmlByteConsumed(ctxt) API to get the byte offest in
2411      input.</li>
2412  </ul>
2413  
2414  <h3>2.6.5: Jan 25 2004</h3>
2415  <ul>
2416    <li>Bugfixes: dictionnaries for schemas (William Brack), regexp segfault
2417      (William), xs:all problem (William), a number of XPointer bugfixes
2418      (William), xmllint error go to stderr, DTD validation problem with
2419      namespace, memory leak (William), SAX1 cleanup and minimal options fixes
2420      (Mark Vadoc), parser context reset on error (Shaun McCance), XPath union
2421      evaluation problem (William) , xmlReallocLoc with NULL (Aleksey Sanin),
2422      XML Schemas double free (Steve Ball), XInclude with no href, argument
2423      callbacks order for XPath callbacks (Frederic Peters)</li>
2424    <li>Documentation: python scripts (William Brack), xslt stylesheets (John
2425      Fleck), doc (Sven Zimmerman), I/O example.</li>
2426    <li>Python bindings: fixes (William), enum support (Stéphane Bidoul),
2427      structured error reporting (Stéphane Bidoul)</li>
2428    <li>XInclude: various fixes for conformance, problem related to dictionary
2429      references (William &amp; me), recursion (William)</li>
2430    <li>xmlWriter: indentation (Lucas Brasilino), memory leaks (Alfred
2431      Mickautsch),</li>
2432    <li>xmlSchemas: normalizedString datatype (John Belmonte)</li>
2433    <li>code cleanup for strings functions (William)</li>
2434    <li>Windows: compiler patches (Mark Vakoc)</li>
2435    <li>Parser optimizations, a few new XPath and dictionary APIs for future
2436      XSLT optimizations.</li>
2437  </ul>
2438  
2439  <h3>2.6.4: Dec 24 2003</h3>
2440  <ul>
2441    <li>Windows build fixes (Igor Zlatkovic)</li>
2442    <li>Some serious XInclude problems reported by Oleg Paraschenko and</li>
2443    <li>Unix and Makefile packaging fixes (me, William Brack,</li>
2444    <li>Documentation improvements (John Fleck, William Brack), example fix
2445      (Lucas Brasilino)</li>
2446    <li>bugfixes: xmlTextReaderExpand() with xmlReaderWalker, XPath handling of
2447      NULL strings (William Brack) , API building reader or parser from
2448      filedescriptor should not close it, changed XPath sorting to be stable
2449      again (William Brack), xmlGetNodePath() generating '(null)' (William
2450      Brack), DTD validation and namespace bug (William Brack), XML Schemas
2451      double inclusion behaviour</li>
2452  </ul>
2453  
2454  <h3>2.6.3: Dec 10 2003</h3>
2455  <ul>
2456    <li>documentation updates and cleanup (DV, William Brack, John Fleck)</li>
2457    <li>added a repository of examples, examples from Aleksey Sanin, Dodji
2458      Seketeli, Alfred Mickautsch</li>
2459    <li>Windows updates: Mark Vakoc, Igor Zlatkovic, Eric Zurcher, Mingw
2460      (Kenneth Haley)</li>
2461    <li>Unicode range checking (William Brack)</li>
2462    <li>code cleanup (William Brack)</li>
2463    <li>Python bindings: doc (John Fleck),  bug fixes</li>
2464    <li>UTF-16 cleanup and BOM issues (William Brack)</li>
2465    <li>bug fixes: ID and xmlReader validation, XPath (William Brack),
2466      xmlWriter (Alfred Mickautsch), hash.h inclusion problem, HTML parser
2467      (James Bursa), attribute defaulting and validation, some serialization
2468      cleanups, XML_GET_LINE macro, memory debug when using threads (William
2469      Brack), serialization of attributes and entities content, xmlWriter
2470      (Daniel Schulman)</li>
2471    <li>XInclude bugfix, new APIs and update to the last version including the
2472      namespace change.</li>
2473    <li>XML Schemas improvements: include (Robert Stepanek), import and
2474      namespace handling, fixed the regression tests troubles, added examples
2475      based on Eric van der Vlist book, regexp fixes</li>
2476    <li>preliminary pattern support for streaming (needed for schemas
2477      constraints), added xmlTextReaderPreservePattern() to collect subdocument
2478      when streaming.</li>
2479    <li>various fixes in the structured error handling</li>
2480  </ul>
2481  
2482  <h3>2.6.2: Nov 4 2003</h3>
2483  <ul>
2484    <li>XPath context unregistration fixes</li>
2485    <li>text node coalescing fixes (Mark Lilback)</li>
2486    <li>API to screate a W3C Schemas from an existing document (Steve Ball)</li>
2487    <li>BeOS patches (Marcin 'Shard' Konicki)</li>
2488    <li>xmlStrVPrintf function added (Aleksey Sanin)</li>
2489    <li>compilation fixes (Mark Vakoc)</li>
2490    <li>stdin parsing fix (William Brack)</li>
2491    <li>a posteriori DTD validation fixes</li>
2492    <li>xmlReader bug fixes: Walker fixes, python bindings</li>
2493    <li>fixed xmlStopParser() to really stop the parser and errors</li>
2494    <li>always generate line numbers when using the new xmlReadxxx
2495    functions</li>
2496    <li>added XInclude support to the xmlReader interface</li>
2497    <li>implemented XML_PARSE_NONET parser option</li>
2498    <li>DocBook XSLT processing bug fixed</li>
2499    <li>HTML serialization for &lt;p&gt; elements (William Brack and me)</li>
2500    <li>XPointer failure in XInclude are now handled as resource errors</li>
2501    <li>fixed xmllint --html to use the HTML serializer on output (added
2502      --xmlout to implement the previous behaviour of saving it using the XML
2503      serializer)</li>
2504  </ul>
2505  
2506  <h3>2.6.1: Oct 28 2003</h3>
2507  <ul>
2508    <li>Mostly bugfixes after the big 2.6.0 changes</li>
2509    <li>Unix compilation patches: libxml.m4 (Patrick Welche), warnings cleanup
2510      (William Brack)</li>
2511    <li>Windows compilation patches (Joachim Bauch, Stephane Bidoul, Igor
2512      Zlatkovic)</li>
2513    <li>xmlWriter bugfix (Alfred Mickautsch)</li>
2514    <li>chvalid.[ch]: couple of fixes from Stephane Bidoul</li>
2515    <li>context reset: error state reset, push parser reset (Graham
2516    Bennett)</li>
2517    <li>context reuse: generate errors if file is not readable</li>
2518    <li>defaulted attributes for element coming from internal entities
2519      (Stephane Bidoul)</li>
2520    <li>Python: tab and spaces mix (William Brack)</li>
2521    <li>Error handler could crash in DTD validation in 2.6.0</li>
2522    <li>xmlReader: do not use the document or element _private field</li>
2523    <li>testSAX.c: avoid a problem with some PIs (Massimo Morara)</li>
2524    <li>general bug fixes: mandatory encoding in text decl, serializing
2525      Document Fragment nodes, xmlSearchNs 2.6.0 problem (Kasimier Buchcik),
2526      XPath errors not reported,  slow HTML parsing of large documents.</li>
2527  </ul>
2528  
2529  <h3>2.6.0: Oct 20 2003</h3>
2530  <ul>
2531    <li>Major revision release: should be API and ABI compatible but got a lot
2532      of change</li>
2533    <li>Increased the library modularity, far more options can be stripped out,
2534      a --with-minimum configuration will weight around 160KBytes</li>
2535    <li>Use per parser and per document dictionary, allocate names and small
2536      text nodes from the dictionary</li>
2537    <li>Switch to a SAX2 like parser rewrote most of the XML parser core,
2538      provides namespace resolution and defaulted attributes, minimize memory
2539      allocations and copies, namespace checking and specific error handling,
2540      immutable buffers, make predefined entities static structures, etc...</li>
2541    <li>rewrote all the error handling in the library, all errors can be
2542      intercepted at a structured level, with precise information
2543    available.</li>
2544    <li>New simpler and more generic XML and HTML parser APIs, allowing to
2545      easilly modify the parsing options and reuse parser context for multiple
2546      consecutive documents.</li>
2547    <li>Similar new APIs for the xmlReader, for options and reuse, provided new
2548      functions to access content as const strings, use them for Python
2549    bindings</li>
2550    <li>a  lot of other smaller API improvements: xmlStrPrintf (Aleksey Sanin),
2551      Walker i.e. reader on a document tree based on Alfred Mickautsch code,
2552      make room in nodes for line numbers, reference counting and future PSVI
2553      extensions, generation of character ranges to be checked with faster
2554      algorithm (William),  xmlParserMaxDepth (Crutcher Dunnavant), buffer
2555      access</li>
2556    <li>New xmlWriter API provided by Alfred Mickautsch</li>
2557    <li>Schemas: base64 support by Anthony Carrico</li>
2558    <li>Parser&lt;-&gt;HTTP integration fix, proper processing of the Mime-Type
2559      and charset information if available.</li>
2560    <li>Relax-NG: bug fixes including the one reported by Martijn Faassen and
2561      zeroOrMore, better error reporting.</li>
2562    <li>Python bindings (Stéphane Bidoul), never use stdout for errors
2563    output</li>
2564    <li>Portability: all the headers have macros for export and calling
2565      convention definitions (Igor Zlatkovic), VMS update (Craig A. Berry),
2566      Windows: threads (Jesse Pelton), Borland compiler (Eric Zurcher,  Igor),
2567      Mingw (Igor), typos (Mark Vakoc),  beta version (Stephane Bidoul),
2568      warning cleanups on AIX and MIPS compilers (William Brack), BeOS (Marcin
2569      'Shard' Konicki)</li>
2570    <li>Documentation fixes and README (William Brack), search fix (William),
2571      tutorial updates (John Fleck), namespace docs (Stefan Kost)</li>
2572    <li>Bug fixes: xmlCleanupParser (Dave Beckett), threading uninitialized
2573      mutexes, HTML doctype lowercase,  SAX/IO (William), compression detection
2574      and restore (William), attribute declaration in DTDs (William), namespace
2575      on attribute in HTML output (William), input filename (Rob Richards),
2576      namespace DTD validation, xmlReplaceNode (Chris Ryland), I/O callbacks
2577      (Markus Keim), CDATA serialization (Shaun McCance), xmlReader (Peter
2578      Derr), high codepoint charref like &amp;#x10FFFF;, buffer access in push
2579      mode (Justin Fletcher), TLS threads on Windows (Jesse Pelton), XPath bug
2580      (William), xmlCleanupParser (Marc Liyanage), CDATA output (William), HTTP
2581      error handling.</li>
2582    <li>xmllint options: --dtdvalidfpi for Tobias Reif, --sax1 for compat
2583      testing,  --nodict for building without tree dictionary, --nocdata to
2584      replace CDATA by text, --nsclean to remove surperfluous  namespace
2585      declarations</li>
2586    <li>added xml2-config --libtool-libs option from Kevin P. Fleming</li>
2587    <li>a lot of profiling and tuning of the code, speedup patch for
2588      xmlSearchNs() by Luca Padovani. The xmlReader should do far less
2589      allocation and it speed should get closer to SAX. Chris Anderson worked
2590      on speeding and cleaning up repetitive checking code.</li>
2591    <li>cleanup of "make tests"</li>
2592    <li>libxml-2.0-uninstalled.pc from Malcolm Tredinnick</li>
2593    <li>deactivated the broken docBook SGML parser code and plugged the XML
2594      parser instead.</li>
2595  </ul>
2596  
2597  <h3>2.5.11: Sep 9 2003</h3>
2598  
2599  <p>A bugfix only release:</p>
2600  <ul>
2601    <li>risk of crash in Relax-NG</li>
2602    <li>risk of crash when using multithreaded programs</li>
2603  </ul>
2604  
2605  <h3>2.5.10: Aug 15 2003</h3>
2606  
2607  <p>A bugfixes only release</p>
2608  <ul>
2609    <li>Windows Makefiles (William Brack)</li>
2610    <li>UTF-16 support fixes (Mark Itzcovitz)</li>
2611    <li>Makefile and portability (William Brack) automake, Linux alpha, Mingw
2612      on Windows (Mikhail Grushinskiy)</li>
2613    <li>HTML parser (Oliver Stoeneberg)</li>
2614    <li>XInclude performance problem reported by Kevin Ruscoe</li>
2615    <li>XML parser performance problem reported by Grant Goodale</li>
2616    <li>xmlSAXParseDTD() bug fix from Malcolm Tredinnick</li>
2617    <li>and a couple other cleanup</li>
2618  </ul>
2619  
2620  <h3>2.5.9: Aug 9 2003</h3>
2621  <ul>
2622    <li>bugfixes: IPv6 portability, xmlHasNsProp (Markus Keim), Windows build
2623      (Wiliam Brake, Jesse Pelton, Igor), Schemas (Peter Sobisch), threading
2624      (Rob Richards), hexBinary type (), UTF-16 BOM (Dodji Seketeli),
2625      xmlReader, Relax-NG schemas compilation, namespace handling,  EXSLT (Sean
2626      Griffin), HTML parsing problem (William Brack), DTD validation for mixed
2627      content + namespaces, HTML serialization, library initialization,
2628      progressive HTML parser</li>
2629    <li>better interfaces for Relax-NG error handling (Joachim Bauch, )</li>
2630    <li>adding xmlXIncludeProcessTree() for XInclud'ing in a subtree</li>
2631    <li>doc fixes and improvements (John Fleck)</li>
2632    <li>configure flag for -with-fexceptions when embedding in C++</li>
2633    <li>couple of new UTF-8 helper functions (William Brack)</li>
2634    <li>general encoding cleanup + ISO-8859-x without iconv (Peter Jacobi)</li>
2635    <li>xmlTextReader cleanup + enum for node types (Bjorn Reese)</li>
2636    <li>general compilation/warning cleanup Solaris/HP-UX/... (William
2637    Brack)</li>
2638  </ul>
2639  
2640  <h3>2.5.8: Jul 6 2003</h3>
2641  <ul>
2642    <li>bugfixes: XPath, XInclude, file/URI mapping, UTF-16 save (Mark
2643      Itzcovitz), UTF-8 checking, URI saving, error printing (William Brack),
2644      PI related memleak, compilation without schemas or without xpath (Joerg
2645      Schmitz-Linneweber/Garry Pennington), xmlUnlinkNode problem with DTDs,
2646      rpm problem on , i86_64, removed a few compilation problems from 2.5.7,
2647      xmlIOParseDTD, and xmlSAXParseDTD (Malcolm Tredinnick)</li>
2648    <li>portability: DJGPP (MsDos) , OpenVMS (Craig A. Berry)</li>
2649    <li>William Brack fixed multithreading lock problems</li>
2650    <li>IPv6 patch for FTP and HTTP accesses (Archana Shah/Wipro)</li>
2651    <li>Windows fixes (Igor Zlatkovic,  Eric Zurcher), threading (Stéphane
2652      Bidoul)</li>
2653    <li>A few W3C Schemas Structure improvements</li>
2654    <li>W3C Schemas Datatype improvements (Charlie Bozeman)</li>
2655    <li>Python bindings for thread globals (Stéphane Bidoul), and method/class
2656      generator</li>
2657    <li>added --nonet option to xmllint</li>
2658    <li>documentation improvements (John Fleck)</li>
2659  </ul>
2660  
2661  <h3>2.5.7: Apr 25 2003</h3>
2662  <ul>
2663    <li>Relax-NG: Compiling to regexp and streaming validation on top of the
2664      xmlReader interface, added to xmllint --stream</li>
2665    <li>xmlReader: Expand(), Next() and DOM access glue, bug fixes</li>
2666    <li>Support for large files: RGN validated a 4.5GB instance</li>
2667    <li>Thread support is now configured in by default</li>
2668    <li>Fixes: update of the Trio code (Bjorn), WXS Date and Duration fixes
2669      (Charles Bozeman), DTD and namespaces (Brent Hendricks), HTML push parser
2670      and zero bytes handling, some missing Windows file path conversions,
2671      behaviour of the parser and validator in the presence of "out of memory"
2672      error conditions</li>
2673    <li>extended the API to be able to plug a garbage collecting memory
2674      allocator, added xmlMallocAtomic() and modified the allocations
2675      accordingly.</li>
2676    <li>Performances: removed excessive malloc() calls, speedup of the push and
2677      xmlReader interfaces, removed excessive thread locking</li>
2678    <li>Documentation: man page (John Fleck), xmlReader documentation</li>
2679    <li>Python: adding binding for xmlCatalogAddLocal (Brent M Hendricks)</li>
2680  </ul>
2681  
2682  <h3>2.5.6: Apr 1 2003</h3>
2683  <ul>
2684    <li>Fixed W3C XML Schemas datatype, should be compliant now except for
2685      binHex and base64 which are not supported yet.</li>
2686    <li>bug fixes: non-ASCII IDs, HTML output, XInclude on large docs and
2687      XInclude entities handling, encoding detection on external subsets, XML
2688      Schemas bugs and memory leaks, HTML parser (James Bursa)</li>
2689    <li>portability: python/trio (Albert Chin), Sun compiler warnings</li>
2690    <li>documentation: added --relaxng option to xmllint man page (John)</li>
2691    <li>improved error reporting: xml:space, start/end tag mismatches, Relax NG
2692      errors</li>
2693  </ul>
2694  
2695  <h3>2.5.5: Mar 24 2003</h3>
2696  <ul>
2697    <li>Lot of fixes on the Relax NG implementation. More testing including
2698      DocBook and TEI examples.</li>
2699    <li>Increased the support for W3C XML Schemas datatype</li>
2700    <li>Several bug fixes in the URI handling layer</li>
2701    <li>Bug fixes: HTML parser, xmlReader, DTD validation, XPath, encoding
2702      conversion, line counting in the parser.</li>
2703    <li>Added support for $XMLLINT_INDENT environment variable, FTP delete</li>
2704    <li>Fixed the RPM spec file name</li>
2705  </ul>
2706  
2707  <h3>2.5.4: Feb 20 2003</h3>
2708  <ul>
2709    <li>Conformance testing and lot of fixes on Relax NG and XInclude
2710      implementation</li>
2711    <li>Implementation of XPointer element() scheme</li>
2712    <li>Bug fixes: XML parser, XInclude entities merge, validity checking on
2713      namespaces,
2714      <p>2 serialization bugs, node info generation problems, a DTD regexp
2715      generation problem.</p>
2716    </li>
2717    <li>Portability: windows updates and path canonicalization (Igor)</li>
2718    <li>A few typo fixes (Kjartan Maraas)</li>
2719    <li>Python bindings generator fixes (Stephane Bidoul)</li>
2720  </ul>
2721  
2722  <h3>2.5.3: Feb 10 2003</h3>
2723  <ul>
2724    <li>RelaxNG and XML Schemas datatypes improvements, and added a first
2725      version of RelaxNG Python bindings</li>
2726    <li>Fixes: XLink (Sean Chittenden), XInclude (Sean Chittenden), API fix for
2727      serializing namespace nodes, encoding conversion bug, XHTML1
2728    serialization</li>
2729    <li>Portability fixes: Windows (Igor), AMD 64bits RPM spec file</li>
2730  </ul>
2731  
2732  <h3>2.5.2: Feb 5 2003</h3>
2733  <ul>
2734    <li>First implementation of RelaxNG, added --relaxng flag to xmllint</li>
2735    <li>Schemas support now compiled in by default.</li>
2736    <li>Bug fixes: DTD validation, namespace checking, XInclude and entities,
2737      delegateURI in XML Catalogs, HTML parser, XML reader (Stéphane Bidoul),
2738      XPath parser and evaluation,  UTF8ToUTF8 serialization, XML reader memory
2739      consumption, HTML parser, HTML serialization in the presence of
2740    namespaces</li>
2741    <li>added an HTML API to check elements and attributes.</li>
2742    <li>Documentation improvement, PDF for the tutorial (John Fleck), doc
2743      patches (Stefan Kost)</li>
2744    <li>Portability fixes: NetBSD (Julio Merino), Windows (Igor Zlatkovic)</li>
2745    <li>Added python bindings for XPointer, contextual error reporting
2746      (Stéphane Bidoul)</li>
2747    <li>URI/file escaping problems (Stefano Zacchiroli)</li>
2748  </ul>
2749  
2750  <h3>2.5.1: Jan 8 2003</h3>
2751  <ul>
2752    <li>Fixes a memory leak and configuration/compilation problems in 2.5.0</li>
2753    <li>documentation updates (John)</li>
2754    <li>a couple of XmlTextReader fixes</li>
2755  </ul>
2756  
2757  <h3>2.5.0: Jan 6 2003</h3>
2758  <ul>
2759    <li>New <a href="xmlreader.html">XmltextReader interface</a> based on C#
2760      API (with help of Stéphane Bidoul)</li>
2761    <li>Windows: more exports, including the new API (Igor)</li>
2762    <li>XInclude fallback fix</li>
2763    <li>Python: bindings for the new API, packaging (Stéphane Bidoul),
2764      drv_libxml2.py Python xml.sax driver (Stéphane Bidoul), fixes, speedup
2765      and iterators for Python-2.2 (Hannu Krosing)</li>
2766    <li>Tutorial fixes (john Fleck and Niraj Tolia) xmllint man update
2767    (John)</li>
2768    <li>Fix an XML parser bug raised by Vyacheslav Pindyura</li>
2769    <li>Fix for VMS serialization (Nigel Hall) and config (Craig A. Berry)</li>
2770    <li>Entities handling fixes</li>
2771    <li>new API to optionally track node creation and deletion (Lukas
2772    Schroeder)</li>
2773    <li>Added documentation for the XmltextReader interface and some <a
2774      href="guidelines.html">XML guidelines</a></li>
2775  </ul>
2776  
2777  <h3>2.4.30: Dec 12 2002</h3>
2778  <ul>
2779    <li>2.4.29 broke the python bindings, rereleasing</li>
2780    <li>Improvement/fixes of the XML API generator, and couple of minor code
2781      fixes.</li>
2782  </ul>
2783  
2784  <h3>2.4.29: Dec 11 2002</h3>
2785  <ul>
2786    <li>Windows fixes (Igor): Windows CE port, pthread linking, python bindings
2787      (Stéphane Bidoul), Mingw (Magnus Henoch), and export list updates</li>
2788    <li>Fix for prev in python bindings (ERDI Gergo)</li>
2789    <li>Fix for entities handling (Marcus Clarke)</li>
2790    <li>Refactored the XML and HTML dumps to a single code path, fixed XHTML1
2791      dump</li>
2792    <li>Fix for URI parsing when handling URNs with fragment identifiers</li>
2793    <li>Fix for HTTP URL escaping problem</li>
2794    <li>added an TextXmlReader (C#) like API (work in progress)</li>
2795    <li>Rewrote the API in XML generation script, includes a C parser and saves
2796      more information needed for C# bindings</li>
2797  </ul>
2798  
2799  <h3>2.4.28: Nov 22 2002</h3>
2800  <ul>
2801    <li>a couple of python binding fixes</li>
2802    <li>2 bug fixes in the XML push parser</li>
2803    <li>potential memory leak removed (Martin Stoilov)</li>
2804    <li>fix to the configure script for Unix (Dimitri Papadopoulos)</li>
2805    <li>added encoding support for XInclude parse="text"</li>
2806    <li>autodetection of XHTML1 and specific serialization rules added</li>
2807    <li>nasty threading bug fixed (William Brack)</li>
2808  </ul>
2809  
2810  <h3>2.4.27: Nov 17 2002</h3>
2811  <ul>
2812    <li>fixes for the Python bindings</li>
2813    <li>a number of bug fixes: SGML catalogs, xmlParseBalancedChunkMemory(),
2814      HTML parser,  Schemas (Charles Bozeman), document fragment support
2815      (Christian Glahn), xmlReconciliateNs (Brian Stafford), XPointer,
2816      xmlFreeNode(), xmlSAXParseMemory (Peter Jones), xmlGetNodePath (Petr
2817      Pajas), entities processing</li>
2818    <li>added grep to xmllint --shell</li>
2819    <li>VMS update patch from Craig A. Berry</li>
2820    <li>cleanup of the Windows build with support for more compilers (Igor),
2821      better thread support on Windows</li>
2822    <li>cleanup of Unix Makefiles and spec file</li>
2823    <li>Improvements to the documentation (John Fleck)</li>
2824  </ul>
2825  
2826  <h3>2.4.26: Oct 18 2002</h3>
2827  <ul>
2828    <li>Patches for Windows CE port, improvements on Windows paths handling</li>
2829    <li>Fixes to the validation  code (DTD and Schemas), xmlNodeGetPath() ,
2830      HTML serialization, Namespace compliance,  and a number of small
2831    problems</li>
2832  </ul>
2833  
2834  <h3>2.4.25: Sep 26 2002</h3>
2835  <ul>
2836    <li>A number of bug fixes: XPath, validation, Python bindings, DOM and
2837      tree, xmlI/O,  Html</li>
2838    <li>Serious rewrite of XInclude</li>
2839    <li>Made XML Schemas regexp part of the default build and APIs, small fix
2840      and improvement of the regexp core</li>
2841    <li>Changed the validation code to reuse XML Schemas regexp APIs</li>
2842    <li>Better handling of Windows file paths, improvement of Makefiles (Igor,
2843      Daniel Gehriger, Mark Vakoc)</li>
2844    <li>Improved the python I/O bindings, the tests, added resolver and regexp
2845      APIs</li>
2846    <li>New logos from Marc Liyanage</li>
2847    <li>Tutorial improvements: John Fleck, Christopher Harris</li>
2848    <li>Makefile: Fixes for AMD x86_64 (Mandrake), DESTDIR (Christophe
2849    Merlet)</li>
2850    <li>removal of all stderr/perror use for error reporting</li>
2851    <li>Better error reporting: XPath and DTD validation</li>
2852    <li>update of the trio portability layer (Bjorn Reese)</li>
2853  </ul>
2854  
2855  <p><strong>2.4.24: Aug 22 2002</strong></p>
2856  <ul>
2857    <li>XPath fixes (William), xf:escape-uri() (Wesley Terpstra)</li>
2858    <li>Python binding fixes: makefiles (William), generator, rpm build, x86-64
2859      (fcrozat)</li>
2860    <li>HTML &lt;style&gt; and boolean attributes serializer fixes</li>
2861    <li>C14N improvements by Aleksey</li>
2862    <li>doc cleanups: Rick Jones</li>
2863    <li>Windows compiler makefile updates: Igor and Elizabeth Barham</li>
2864    <li>XInclude: implementation of fallback and xml:base fixup added</li>
2865  </ul>
2866  
2867  <h3>2.4.23: July 6 2002</h3>
2868  <ul>
2869    <li>performances patches: Peter Jacobi</li>
2870    <li>c14n fixes, testsuite and performances: Aleksey Sanin</li>
2871    <li>added xmlDocFormatDump: Chema Celorio</li>
2872    <li>new tutorial: John Fleck</li>
2873    <li>new hash functions and performances: Sander Vesik, portability fix from
2874      Peter Jacobi</li>
2875    <li>a number of bug fixes: XPath (William Brack, Richard Jinks), XML and
2876      HTML parsers, ID lookup function</li>
2877    <li>removal of all remaining sprintf: Aleksey Sanin</li>
2878  </ul>
2879  
2880  <h3>2.4.22: May 27 2002</h3>
2881  <ul>
2882    <li>a number of bug fixes: configure scripts, base handling, parser, memory
2883      usage, HTML parser, XPath, documentation (Christian Cornelssen),
2884      indentation, URI parsing</li>
2885    <li>Optimizations for XMLSec, fixing and making public some of the network
2886      protocol handlers (Aleksey)</li>
2887    <li>performance patch from Gary Pennington</li>
2888    <li>Charles Bozeman provided date and time support for XML Schemas
2889    datatypes</li>
2890  </ul>
2891  
2892  <h3>2.4.21: Apr 29 2002</h3>
2893  
2894  <p>This release is both a bug fix release and also contains the early XML
2895  Schemas <a href="http://www.w3.org/TR/xmlschema-1/">structures</a> and <a
2896  href="http://www.w3.org/TR/xmlschema-2/">datatypes</a> code, beware, all
2897  interfaces are likely to change, there is huge holes, it is clearly a work in
2898  progress and don't even think of putting this code in a production system,
2899  it's actually not compiled in by default. The real fixes are:
2900  </p>
2901  
2902  <ul>
2903    <li>a couple of bugs or limitations introduced in 2.4.20</li>
2904    <li>patches for Borland C++ and MSC by Igor</li>
2905    <li>some fixes on XPath strings and conformance patches by Richard
2906    Jinks</li>
2907    <li>patch from Aleksey for the ExcC14N specification</li>
2908    <li>OSF/1 bug fix by Bjorn</li>
2909  </ul>
2910  
2911  <h3>2.4.20: Apr 15 2002</h3>
2912  <ul>
2913    <li>bug fixes: file descriptor leak, XPath, HTML output, DTD validation</li>
2914    <li>XPath conformance testing by Richard Jinks</li>
2915    <li>Portability fixes: Solaris, MPE/iX, Windows, OSF/1, python bindings,
2916      libxml.m4</li>
2917  </ul>
2918  
2919  <h3>2.4.19: Mar 25 2002</h3>
2920  <ul>
2921    <li>bug fixes: half a dozen XPath bugs, Validation, ISO-Latin to UTF8
2922      encoder</li>
2923    <li>portability fixes in the HTTP code</li>
2924    <li>memory allocation checks using valgrind, and profiling tests</li>
2925    <li>revamp of the Windows build and Makefiles</li>
2926  </ul>
2927  
2928  <h3>2.4.18: Mar 18 2002</h3>
2929  <ul>
2930    <li>bug fixes: tree, SAX, canonicalization, validation, portability,
2931    XPath</li>
2932    <li>removed the --with-buffer option it was becoming unmaintainable</li>
2933    <li>serious cleanup of the Python makefiles</li>
2934    <li>speedup patch to XPath very effective for DocBook stylesheets</li>
2935    <li>Fixes for Windows build, cleanup of the documentation</li>
2936  </ul>
2937  
2938  <h3>2.4.17: Mar 8 2002</h3>
2939  <ul>
2940    <li>a lot of bug fixes, including "namespace nodes have no parents in
2941    XPath"</li>
2942    <li>fixed/improved the Python wrappers, added more examples and more
2943      regression tests, XPath extension functions can now return node-sets</li>
2944    <li>added the XML Canonicalization support from Aleksey Sanin</li>
2945  </ul>
2946  
2947  <h3>2.4.16: Feb 20 2002</h3>
2948  <ul>
2949    <li>a lot of bug fixes, most of them were triggered by the XML Testsuite
2950      from OASIS and W3C. Compliance has been significantly improved.</li>
2951    <li>a couple of portability fixes too.</li>
2952  </ul>
2953  
2954  <h3>2.4.15: Feb 11 2002</h3>
2955  <ul>
2956    <li>Fixed the Makefiles, especially the python module ones</li>
2957    <li>A few bug fixes and cleanup</li>
2958    <li>Includes cleanup</li>
2959  </ul>
2960  
2961  <h3>2.4.14: Feb 8 2002</h3>
2962  <ul>
2963    <li>Change of License to the <a
2964      href="http://www.opensource.org/licenses/mit-license.html">MIT
2965      License</a> basically for integration in XFree86 codebase, and removing
2966      confusion around the previous dual-licensing</li>
2967    <li>added Python bindings, beta software but should already be quite
2968      complete</li>
2969    <li>a large number of fixes and cleanups, especially for all tree
2970      manipulations</li>
2971    <li>cleanup of the headers, generation of a reference API definition in
2972    XML</li>
2973  </ul>
2974  
2975  <h3>2.4.13: Jan 14 2002</h3>
2976  <ul>
2977    <li>update of the documentation: John Fleck and Charlie Bozeman</li>
2978    <li>cleanup of timing code from Justin Fletcher</li>
2979    <li>fixes for Windows and initial thread support on Win32: Igor and Serguei
2980      Narojnyi</li>
2981    <li>Cygwin patch from Robert Collins</li>
2982    <li>added xmlSetEntityReferenceFunc() for Keith Isdale work on xsldbg</li>
2983  </ul>
2984  
2985  <h3>2.4.12: Dec 7 2001</h3>
2986  <ul>
2987    <li>a few bug fixes: thread (Gary Pennington), xmllint (Geert Kloosterman),
2988      XML parser (Robin Berjon), XPointer (Danny Jamshy), I/O cleanups
2989    (robert)</li>
2990    <li>Eric Lavigne contributed project files for MacOS</li>
2991    <li>some makefiles cleanups</li>
2992  </ul>
2993  
2994  <h3>2.4.11: Nov 26 2001</h3>
2995  <ul>
2996    <li>fixed a couple of errors in the includes, fixed a few bugs, some code
2997      cleanups</li>
2998    <li>xmllint man pages improvement by Heiko Rupp</li>
2999    <li>updated VMS build instructions from John A Fotheringham</li>
3000    <li>Windows Makefiles updates from Igor</li>
3001  </ul>
3002  
3003  <h3>2.4.10: Nov 10 2001</h3>
3004  <ul>
3005    <li>URI escaping fix (Joel Young)</li>
3006    <li>added xmlGetNodePath() (for paths or XPointers generation)</li>
3007    <li>Fixes namespace handling problems when using DTD and validation</li>
3008    <li>improvements on xmllint: Morus Walter patches for --format and
3009      --encode, Stefan Kost and Heiko Rupp improvements on the --shell</li>
3010    <li>fixes for xmlcatalog linking pointed by Weiqi Gao</li>
3011    <li>fixes to the HTML parser</li>
3012  </ul>
3013  
3014  <h3>2.4.9: Nov 6 2001</h3>
3015  <ul>
3016    <li>fixes more catalog bugs</li>
3017    <li>avoid a compilation problem, improve xmlGetLineNo()</li>
3018  </ul>
3019  
3020  <h3>2.4.8: Nov 4 2001</h3>
3021  <ul>
3022    <li>fixed SGML catalogs broken in previous release, updated xmlcatalog
3023    tool</li>
3024    <li>fixed a compile errors and some includes troubles.</li>
3025  </ul>
3026  
3027  <h3>2.4.7: Oct 30 2001</h3>
3028  <ul>
3029    <li>exported some debugging interfaces</li>
3030    <li>serious rewrite of the catalog code</li>
3031    <li>integrated Gary Pennington thread safety patch, added configure option
3032      and regression tests</li>
3033    <li>removed an HTML parser bug</li>
3034    <li>fixed a couple of potentially serious validation bugs</li>
3035    <li>integrated the SGML DocBook support in xmllint</li>
3036    <li>changed the nanoftp anonymous login passwd</li>
3037    <li>some I/O cleanup and a couple of interfaces for Perl wrapper</li>
3038    <li>general bug fixes</li>
3039    <li>updated xmllint man page by John Fleck</li>
3040    <li>some VMS and Windows updates</li>
3041  </ul>
3042  
3043  <h3>2.4.6: Oct 10 2001</h3>
3044  <ul>
3045    <li>added an updated man pages by John Fleck</li>
3046    <li>portability and configure fixes</li>
3047    <li>an infinite loop on the HTML parser was removed (William)</li>
3048    <li>Windows makefile patches from Igor</li>
3049    <li>fixed half a dozen bugs reported for libxml or libxslt</li>
3050    <li>updated xmlcatalog to be able to modify SGML super catalogs</li>
3051  </ul>
3052  
3053  <h3>2.4.5: Sep 14 2001</h3>
3054  <ul>
3055    <li>Remove a few annoying bugs in 2.4.4</li>
3056    <li>forces the HTML serializer to output decimal charrefs since some
3057      version of Netscape can't handle hexadecimal ones</li>
3058  </ul>
3059  
3060  <h3>1.8.16: Sep 14 2001</h3>
3061  <ul>
3062    <li>maintenance release of the old libxml1 branch, couple of bug and
3063      portability fixes</li>
3064  </ul>
3065  
3066  <h3>2.4.4: Sep 12 2001</h3>
3067  <ul>
3068    <li>added --convert to xmlcatalog, bug fixes and cleanups of XML
3069    Catalog</li>
3070    <li>a few bug fixes and some portability changes</li>
3071    <li>some documentation cleanups</li>
3072  </ul>
3073  
3074  <h3>2.4.3:  Aug 23 2001</h3>
3075  <ul>
3076    <li>XML Catalog support see the doc</li>
3077    <li>New NaN/Infinity floating point code</li>
3078    <li>A few bug fixes</li>
3079  </ul>
3080  
3081  <h3>2.4.2:  Aug 15 2001</h3>
3082  <ul>
3083    <li>adds xmlLineNumbersDefault() to control line number generation</li>
3084    <li>lot of bug fixes</li>
3085    <li>the Microsoft MSC projects files should now be up to date</li>
3086    <li>inheritance of namespaces from DTD defaulted attributes</li>
3087    <li>fixes a serious potential security bug</li>
3088    <li>added a --format option to xmllint</li>
3089  </ul>
3090  
3091  <h3>2.4.1:  July 24 2001</h3>
3092  <ul>
3093    <li>possibility to keep line numbers in the tree</li>
3094    <li>some computation NaN fixes</li>
3095    <li>extension of the XPath API</li>
3096    <li>cleanup for alpha and ia64 targets</li>
3097    <li>patch to allow saving through HTTP PUT or POST</li>
3098  </ul>
3099  
3100  <h3>2.4.0: July 10 2001</h3>
3101  <ul>
3102    <li>Fixed a few bugs in XPath, validation, and tree handling.</li>
3103    <li>Fixed XML Base implementation, added a couple of examples to the
3104      regression tests</li>
3105    <li>A bit of cleanup</li>
3106  </ul>
3107  
3108  <h3>2.3.14: July 5 2001</h3>
3109  <ul>
3110    <li>fixed some entities problems and reduce memory requirement when
3111      substituting them</li>
3112    <li>lots of improvements in the XPath queries interpreter can be
3113      substantially faster</li>
3114    <li>Makefiles and configure cleanups</li>
3115    <li>Fixes to XPath variable eval, and compare on empty node set</li>
3116    <li>HTML tag closing bug fixed</li>
3117    <li>Fixed an URI reference computation problem when validating</li>
3118  </ul>
3119  
3120  <h3>2.3.13: June 28 2001</h3>
3121  <ul>
3122    <li>2.3.12 configure.in was broken as well as the push mode XML parser</li>
3123    <li>a few more fixes for compilation on Windows MSC by Yon Derek</li>
3124  </ul>
3125  
3126  <h3>1.8.14: June 28 2001</h3>
3127  <ul>
3128    <li>Zbigniew Chyla gave a patch to use the old XML parser in push mode</li>
3129    <li>Small Makefile fix</li>
3130  </ul>
3131  
3132  <h3>2.3.12: June 26 2001</h3>
3133  <ul>
3134    <li>lots of cleanup</li>
3135    <li>a couple of validation fix</li>
3136    <li>fixed line number counting</li>
3137    <li>fixed serious problems in the XInclude processing</li>
3138    <li>added support for UTF8 BOM at beginning of entities</li>
3139    <li>fixed a strange gcc optimizer bugs in xpath handling of float, gcc-3.0
3140      miscompile uri.c (William), Thomas Leitner provided a fix for the
3141      optimizer on Tru64</li>
3142    <li>incorporated Yon Derek and Igor Zlatkovic  fixes and improvements for
3143      compilation on Windows MSC</li>
3144    <li>update of libxml-doc.el (Felix Natter)</li>
3145    <li>fixed 2 bugs in URI normalization code</li>
3146  </ul>
3147  
3148  <h3>2.3.11: June 17 2001</h3>
3149  <ul>
3150    <li>updates to trio, Makefiles and configure should fix some portability
3151      problems (alpha)</li>
3152    <li>fixed some HTML serialization problems (pre, script, and block/inline
3153      handling), added encoding aware APIs, cleanup of this code</li>
3154    <li>added xmlHasNsProp()</li>
3155    <li>implemented a specific PI for encoding support in the DocBook SGML
3156      parser</li>
3157    <li>some XPath fixes (-Infinity, / as a function parameter and namespaces
3158      node selection)</li>
3159    <li>fixed a performance problem and an error in the validation code</li>
3160    <li>fixed XInclude routine to implement the recursive behaviour</li>
3161    <li>fixed xmlFreeNode problem when libxml is included statically twice</li>
3162    <li>added --version to xmllint for bug reports</li>
3163  </ul>
3164  
3165  <h3>2.3.10: June 1 2001</h3>
3166  <ul>
3167    <li>fixed the SGML catalog support</li>
3168    <li>a number of reported bugs got fixed, in XPath, iconv detection,
3169      XInclude processing</li>
3170    <li>XPath string function should now handle unicode correctly</li>
3171  </ul>
3172  
3173  <h3>2.3.9: May 19 2001</h3>
3174  
3175  <p>Lots of bugfixes, and added a basic SGML catalog support:
3176  </p>
3177  <ul>
3178    <li>HTML push bugfix #54891 and another patch from Jonas Borgstrom</li>
3179    <li>some serious speed optimization again</li>
3180    <li>some documentation cleanups</li>
3181    <li>trying to get better linking on Solaris (-R)</li>
3182    <li>XPath API cleanup from Thomas Broyer</li>
3183    <li>Validation bug fixed #54631, added a patch from Gary Pennington, fixed
3184      xmlValidGetValidElements()</li>
3185    <li>Added an INSTALL file</li>
3186    <li>Attribute removal added to API: #54433</li>
3187    <li>added a basic support for SGML catalogs</li>
3188    <li>fixed xmlKeepBlanksDefault(0) API</li>
3189    <li>bugfix in xmlNodeGetLang()</li>
3190    <li>fixed a small configure portability problem</li>
3191    <li>fixed an inversion of SYSTEM and PUBLIC identifier in HTML document</li>
3192  </ul>
3193  
3194  <h3>1.8.13: May 14 2001</h3>
3195  <ul>
3196    <li>bugfixes release of the old libxml1 branch used by Gnome</li>
3197  </ul>
3198  
3199  <h3>2.3.8: May 3 2001</h3>
3200  <ul>
3201    <li>Integrated an SGML DocBook parser for the Gnome project</li>
3202    <li>Fixed a few things in the HTML parser</li>
3203    <li>Fixed some XPath bugs raised by XSLT use, tried to fix the floating
3204      point portability issue</li>
3205    <li>Speed improvement (8M/s for SAX, 3M/s for DOM, 1.5M/s for
3206      DOM+validation using the XML REC as input and a 700MHz celeron).</li>
3207    <li>incorporated more Windows cleanup</li>
3208    <li>added xmlSaveFormatFile()</li>
3209    <li>fixed problems in copying nodes with entities references (gdome)</li>
3210    <li>removed some troubles surrounding the new validation module</li>
3211  </ul>
3212  
3213  <h3>2.3.7: April 22 2001</h3>
3214  <ul>
3215    <li>lots of small bug fixes, corrected XPointer</li>
3216    <li>Non deterministic content model validation support</li>
3217    <li>added xmlDocCopyNode for gdome2</li>
3218    <li>revamped the way the HTML parser handles end of tags</li>
3219    <li>XPath: corrections of namespaces support and number formatting</li>
3220    <li>Windows: Igor Zlatkovic patches for MSC compilation</li>
3221    <li>HTML output fixes from P C Chow and William M. Brack</li>
3222    <li>Improved validation speed sensible for DocBook</li>
3223    <li>fixed a big bug with ID declared in external parsed entities</li>
3224    <li>portability fixes, update of Trio from Bjorn Reese</li>
3225  </ul>
3226  
3227  <h3>2.3.6: April 8 2001</h3>
3228  <ul>
3229    <li>Code cleanup using extreme gcc compiler warning options, found and
3230      cleared half a dozen potential problem</li>
3231    <li>the Eazel team found an XML parser bug</li>
3232    <li>cleaned up the user of some of the string formatting function. used the
3233      trio library code to provide the one needed when the platform is missing
3234      them</li>
3235    <li>xpath: removed a memory leak and fixed the predicate evaluation
3236      problem, extended the testsuite and cleaned up the result. XPointer seems
3237      broken ...</li>
3238  </ul>
3239  
3240  <h3>2.3.5: Mar 23 2001</h3>
3241  <ul>
3242    <li>Biggest change is separate parsing and evaluation of XPath expressions,
3243      there is some new APIs for this too</li>
3244    <li>included a number of bug fixes(XML push parser, 51876, notations,
3245    52299)</li>
3246    <li>Fixed some portability issues</li>
3247  </ul>
3248  
3249  <h3>2.3.4: Mar 10 2001</h3>
3250  <ul>
3251    <li>Fixed bugs #51860 and #51861</li>
3252    <li>Added a global variable xmlDefaultBufferSize to allow default buffer
3253      size to be application tunable.</li>
3254    <li>Some cleanup in the validation code, still a bug left and this part
3255      should probably be rewritten to support ambiguous content model :-\</li>
3256    <li>Fix a couple of serious bugs introduced or raised by changes in 2.3.3
3257      parser</li>
3258    <li>Fixed another bug in xmlNodeGetContent()</li>
3259    <li>Bjorn fixed XPath node collection and Number formatting</li>
3260    <li>Fixed a loop reported in the HTML parsing</li>
3261    <li>blank space are reported even if the Dtd content model proves that they
3262      are formatting spaces, this is for XML conformance</li>
3263  </ul>
3264  
3265  <h3>2.3.3: Mar 1 2001</h3>
3266  <ul>
3267    <li>small change in XPath for XSLT</li>
3268    <li>documentation cleanups</li>
3269    <li>fix in validation by Gary Pennington</li>
3270    <li>serious parsing performances improvements</li>
3271  </ul>
3272  
3273  <h3>2.3.2: Feb 24 2001</h3>
3274  <ul>
3275    <li>chasing XPath bugs, found a bunch, completed some TODO</li>
3276    <li>fixed a Dtd parsing bug</li>
3277    <li>fixed a bug in xmlNodeGetContent</li>
3278    <li>ID/IDREF support partly rewritten by Gary Pennington</li>
3279  </ul>
3280  
3281  <h3>2.3.1: Feb 15 2001</h3>
3282  <ul>
3283    <li>some XPath and HTML bug fixes for XSLT</li>
3284    <li>small extension of the hash table interfaces for DOM gdome2
3285      implementation</li>
3286    <li>A few bug fixes</li>
3287  </ul>
3288  
3289  <h3>2.3.0: Feb 8 2001 (2.2.12 was on 25 Jan but I didn't kept track)</h3>
3290  <ul>
3291    <li>Lots of XPath bug fixes</li>
3292    <li>Add a mode with Dtd lookup but without validation error reporting for
3293      XSLT</li>
3294    <li>Add support for text node without escaping (XSLT)</li>
3295    <li>bug fixes for xmlCheckFilename</li>
3296    <li>validation code bug fixes from Gary Pennington</li>
3297    <li>Patch from Paul D. Smith correcting URI path normalization</li>
3298    <li>Patch to allow simultaneous install of libxml-devel and
3299    libxml2-devel</li>
3300    <li>the example Makefile is now fixed</li>
3301    <li>added HTML to the RPM packages</li>
3302    <li>tree copying bugfixes</li>
3303    <li>updates to Windows makefiles</li>
3304    <li>optimization patch from Bjorn Reese</li>
3305  </ul>
3306  
3307  <h3>2.2.11: Jan 4 2001</h3>
3308  <ul>
3309    <li>bunch of bug fixes (memory I/O, xpath, ftp/http, ...)</li>
3310    <li>added htmlHandleOmittedElem()</li>
3311    <li>Applied Bjorn Reese's IPV6 first patch</li>
3312    <li>Applied Paul D. Smith patches for validation of XInclude results</li>
3313    <li>added XPointer xmlns() new scheme support</li>
3314  </ul>
3315  
3316  <h3>2.2.10: Nov 25 2000</h3>
3317  <ul>
3318    <li>Fix the Windows problems of 2.2.8</li>
3319    <li>integrate OpenVMS patches</li>
3320    <li>better handling of some nasty HTML input</li>
3321    <li>Improved the XPointer implementation</li>
3322    <li>integrate a number of provided patches</li>
3323  </ul>
3324  
3325  <h3>2.2.9: Nov 25 2000</h3>
3326  <ul>
3327    <li>erroneous release :-(</li>
3328  </ul>
3329  
3330  <h3>2.2.8: Nov 13 2000</h3>
3331  <ul>
3332    <li>First version of <a href="http://www.w3.org/TR/xinclude">XInclude</a>
3333      support</li>
3334    <li>Patch in conditional section handling</li>
3335    <li>updated MS compiler project</li>
3336    <li>fixed some XPath problems</li>
3337    <li>added an URI escaping function</li>
3338    <li>some other bug fixes</li>
3339  </ul>
3340  
3341  <h3>2.2.7: Oct 31 2000</h3>
3342  <ul>
3343    <li>added message redirection</li>
3344    <li>XPath improvements (thanks TOM !)</li>
3345    <li>xmlIOParseDTD() added</li>
3346    <li>various small fixes in the HTML, URI, HTTP and XPointer support</li>
3347    <li>some cleanup of the Makefile, autoconf and the distribution content</li>
3348  </ul>
3349  
3350  <h3>2.2.6: Oct 25 2000:</h3>
3351  <ul>
3352    <li>Added an hash table module, migrated a number of internal structure to
3353      those</li>
3354    <li>Fixed a posteriori validation problems</li>
3355    <li>HTTP module cleanups</li>
3356    <li>HTML parser improvements (tag errors, script/style handling, attribute
3357      normalization)</li>
3358    <li>coalescing of adjacent text nodes</li>
3359    <li>couple of XPath bug fixes, exported the internal API</li>
3360  </ul>
3361  
3362  <h3>2.2.5: Oct 15 2000:</h3>
3363  <ul>
3364    <li>XPointer implementation and testsuite</li>
3365    <li>Lot of XPath fixes, added variable and functions registration, more
3366      tests</li>
3367    <li>Portability fixes, lots of enhancements toward an easy Windows build
3368      and release</li>
3369    <li>Late validation fixes</li>
3370    <li>Integrated a lot of contributed patches</li>
3371    <li>added memory management docs</li>
3372    <li>a performance problem when using large buffer seems fixed</li>
3373  </ul>
3374  
3375  <h3>2.2.4: Oct 1 2000:</h3>
3376  <ul>
3377    <li>main XPath problem fixed</li>
3378    <li>Integrated portability patches for Windows</li>
3379    <li>Serious bug fixes on the URI and HTML code</li>
3380  </ul>
3381  
3382  <h3>2.2.3: Sep 17 2000</h3>
3383  <ul>
3384    <li>bug fixes</li>
3385    <li>cleanup of entity handling code</li>
3386    <li>overall review of all loops in the parsers, all sprintf usage has been
3387      checked too</li>
3388    <li>Far better handling of larges Dtd. Validating against DocBook XML Dtd
3389      works smoothly now.</li>
3390  </ul>
3391  
3392  <h3>1.8.10: Sep 6 2000</h3>
3393  <ul>
3394    <li>bug fix release for some Gnome projects</li>
3395  </ul>
3396  
3397  <h3>2.2.2: August 12 2000</h3>
3398  <ul>
3399    <li>mostly bug fixes</li>
3400    <li>started adding routines to access xml parser context options</li>
3401  </ul>
3402  
3403  <h3>2.2.1: July 21 2000</h3>
3404  <ul>
3405    <li>a purely bug fixes release</li>
3406    <li>fixed an encoding support problem when parsing from a memory block</li>
3407    <li>fixed a DOCTYPE parsing problem</li>
3408    <li>removed a bug in the function allowing to override the memory
3409      allocation routines</li>
3410  </ul>
3411  
3412  <h3>2.2.0: July 14 2000</h3>
3413  <ul>
3414    <li>applied a lot of portability fixes</li>
3415    <li>better encoding support/cleanup and saving (content is now always
3416      encoded in UTF-8)</li>
3417    <li>the HTML parser now correctly handles encodings</li>
3418    <li>added xmlHasProp()</li>
3419    <li>fixed a serious problem with &amp;#38;</li>
3420    <li>propagated the fix to FTP client</li>
3421    <li>cleanup, bugfixes, etc ...</li>
3422    <li>Added a page about <a href="encoding.html">libxml Internationalization
3423      support</a></li>
3424  </ul>
3425  
3426  <h3>1.8.9:  July 9 2000</h3>
3427  <ul>
3428    <li>fixed the spec the RPMs should be better</li>
3429    <li>fixed a serious bug in the FTP implementation, released 1.8.9 to solve
3430      rpmfind users problem</li>
3431  </ul>
3432  
3433  <h3>2.1.1: July 1 2000</h3>
3434  <ul>
3435    <li>fixes a couple of bugs in the 2.1.0 packaging</li>
3436    <li>improvements on the HTML parser</li>
3437  </ul>
3438  
3439  <h3>2.1.0 and 1.8.8: June 29 2000</h3>
3440  <ul>
3441    <li>1.8.8 is mostly a commodity package for upgrading to libxml2 according
3442      to <a href="upgrade.html">new instructions</a>. It fixes a nasty problem
3443      about &amp;#38; charref parsing</li>
3444    <li>2.1.0 also ease the upgrade from libxml v1 to the recent version. it
3445      also contains numerous fixes and enhancements:
3446      <ul>
3447        <li>added xmlStopParser() to stop parsing</li>
3448        <li>improved a lot parsing speed when there is large CDATA blocs</li>
3449        <li>includes XPath patches provided by Picdar Technology</li>
3450        <li>tried to fix as much as possible DTD validation and namespace
3451          related problems</li>
3452        <li>output to a given encoding has been added/tested</li>
3453        <li>lot of various fixes</li>
3454      </ul>
3455    </li>
3456  </ul>
3457  
3458  <h3>2.0.0: Apr 12 2000</h3>
3459  <ul>
3460    <li>First public release of libxml2. If you are using libxml, it's a good
3461      idea to check the 1.x to 2.x upgrade instructions. NOTE: while initially
3462      scheduled for Apr 3 the release occurred only on Apr 12 due to massive
3463      workload.</li>
3464    <li>The include are now located under $prefix/include/libxml (instead of
3465      $prefix/include/gnome-xml), they also are referenced by
3466      <pre>#include &lt;libxml/xxx.h&gt;</pre>
3467      <p>instead of</p>
3468      <pre>#include "xxx.h"</pre>
3469    </li>
3470    <li>a new URI module for parsing URIs and following strictly RFC 2396</li>
3471    <li>the memory allocation routines used by libxml can now be overloaded
3472      dynamically by using xmlMemSetup()</li>
3473    <li>The previously CVS only tool tester has been renamed
3474      <strong>xmllint</strong> and is now installed as part of the libxml2
3475      package</li>
3476    <li>The I/O interface has been revamped. There is now ways to plug in
3477      specific I/O modules, either at the URI scheme detection level using
3478      xmlRegisterInputCallbacks()  or by passing I/O functions when creating a
3479      parser context using xmlCreateIOParserCtxt()</li>
3480    <li>there is a C preprocessor macro LIBXML_VERSION providing the version
3481      number of the libxml module in use</li>
3482    <li>a number of optional features of libxml can now be excluded at
3483      configure time (FTP/HTTP/HTML/XPath/Debug)</li>
3484  </ul>
3485  
3486  <h3>2.0.0beta: Mar 14 2000</h3>
3487  <ul>
3488    <li>This is a first Beta release of libxml version 2</li>
3489    <li>It's available only from<a href="ftp://xmlsoft.org/libxml2/">xmlsoft.org
3490      FTP</a>, it's packaged as libxml2-2.0.0beta and available as tar and
3491    RPMs</li>
3492    <li>This version is now the head in the Gnome CVS base, the old one is
3493      available under the tag LIB_XML_1_X</li>
3494    <li>This includes a very large set of changes. From a  programmatic point
3495      of view applications should not have to be modified too much, check the
3496      <a href="upgrade.html">upgrade page</a></li>
3497    <li>Some interfaces may changes (especially a bit about encoding).</li>
3498    <li>the updates includes:
3499      <ul>
3500        <li>fix I18N support. ISO-Latin-x/UTF-8/UTF-16 (nearly) seems correctly
3501          handled now</li>
3502        <li>Better handling of entities, especially well-formedness checking
3503          and proper PEref extensions in external subsets</li>
3504        <li>DTD conditional sections</li>
3505        <li>Validation now correctly handle entities content</li>
3506        <li><a href="http://rpmfind.net/tools/gdome/messages/0039.html">change
3507          structures to accommodate DOM</a></li>
3508      </ul>
3509    </li>
3510    <li>Serious progress were made toward compliance, <a
3511      href="conf/result.html">here are the result of the test</a> against the
3512      OASIS testsuite (except the Japanese tests since I don't support that
3513      encoding yet). This URL is rebuilt every couple of hours using the CVS
3514      head version.</li>
3515  </ul>
3516  
3517  <h3>1.8.7: Mar 6 2000</h3>
3518  <ul>
3519    <li>This is a bug fix release:</li>
3520    <li>It is possible to disable the ignorable blanks heuristic used by
3521      libxml-1.x, a new function  xmlKeepBlanksDefault(0) will allow this. Note
3522      that for adherence to XML spec, this behaviour will be disabled by
3523      default in 2.x . The same function will allow to keep compatibility for
3524      old code.</li>
3525    <li>Blanks in &lt;a&gt;  &lt;/a&gt; constructs are not ignored anymore,
3526      avoiding heuristic is really the Right Way :-\</li>
3527    <li>The unchecked use of snprintf which was breaking libxml-1.8.6
3528      compilation on some platforms has been fixed</li>
3529    <li>nanoftp.c nanohttp.c: Fixed '#' and '?' stripping when processing
3530    URIs</li>
3531  </ul>
3532  
3533  <h3>1.8.6: Jan 31 2000</h3>
3534  <ul>
3535    <li>added a nanoFTP transport module, debugged until the new version of <a
3536      href="http://rpmfind.net/linux/rpm2html/rpmfind.html">rpmfind</a> can use
3537      it without troubles</li>
3538  </ul>
3539  
3540  <h3>1.8.5: Jan 21 2000</h3>
3541  <ul>
3542    <li>adding APIs to parse a well balanced chunk of XML (production <a
3543      href="http://www.w3.org/TR/REC-xml#NT-content">[43] content</a> of the
3544      XML spec)</li>
3545    <li>fixed a hideous bug in xmlGetProp pointed by Rune.Djurhuus@fast.no</li>
3546    <li>Jody Goldberg &lt;jgoldberg@home.com&gt; provided another patch trying
3547      to solve the zlib checks problems</li>
3548    <li>The current state in gnome CVS base is expected to ship as 1.8.5 with
3549      gnumeric soon</li>
3550  </ul>
3551  
3552  <h3>1.8.4: Jan 13 2000</h3>
3553  <ul>
3554    <li>bug fixes, reintroduced xmlNewGlobalNs(), fixed xmlNewNs()</li>
3555    <li>all exit() call should have been removed from libxml</li>
3556    <li>fixed a problem with INCLUDE_WINSOCK on WIN32 platform</li>
3557    <li>added newDocFragment()</li>
3558  </ul>
3559  
3560  <h3>1.8.3: Jan 5 2000</h3>
3561  <ul>
3562    <li>a Push interface for the XML and HTML parsers</li>
3563    <li>a shell-like interface to the document tree (try tester --shell :-)</li>
3564    <li>lots of bug fixes and improvement added over XMas holidays</li>
3565    <li>fixed the DTD parsing code to work with the xhtml DTD</li>
3566    <li>added xmlRemoveProp(), xmlRemoveID() and xmlRemoveRef()</li>
3567    <li>Fixed bugs in xmlNewNs()</li>
3568    <li>External entity loading code has been revamped, now it uses
3569      xmlLoadExternalEntity(), some fix on entities processing were added</li>
3570    <li>cleaned up WIN32 includes of socket stuff</li>
3571  </ul>
3572  
3573  <h3>1.8.2: Dec 21 1999</h3>
3574  <ul>
3575    <li>I got another problem with includes and C++, I hope this issue is fixed
3576      for good this time</li>
3577    <li>Added a few tree modification functions: xmlReplaceNode,
3578      xmlAddPrevSibling, xmlAddNextSibling, xmlNodeSetName and
3579      xmlDocSetRootElement</li>
3580    <li>Tried to improve the HTML output with help from <a
3581      href="mailto:clahey@umich.edu">Chris Lahey</a></li>
3582  </ul>
3583  
3584  <h3>1.8.1: Dec 18 1999</h3>
3585  <ul>
3586    <li>various patches to avoid troubles when using libxml with C++ compilers
3587      the "namespace" keyword and C escaping in include files</li>
3588    <li>a problem in one of the core macros IS_CHAR was corrected</li>
3589    <li>fixed a bug introduced in 1.8.0 breaking default namespace processing,
3590      and more specifically the Dia application</li>
3591    <li>fixed a posteriori validation (validation after parsing, or by using a
3592      Dtd not specified in the original document)</li>
3593    <li>fixed a bug in</li>
3594  </ul>
3595  
3596  <h3>1.8.0: Dec 12 1999</h3>
3597  <ul>
3598    <li>cleanup, especially memory wise</li>
3599    <li>the parser should be more reliable, especially the HTML one, it should
3600      not crash, whatever the input !</li>
3601    <li>Integrated various patches, especially a speedup improvement for large
3602      dataset from <a href="mailto:cnygard@bellatlantic.net">Carl Nygard</a>,
3603      configure with --with-buffers to enable them.</li>
3604    <li>attribute normalization, oops should have been added long ago !</li>
3605    <li>attributes defaulted from DTDs should be available, xmlSetProp() now
3606      does entities escaping by default.</li>
3607  </ul>
3608  
3609  <h3>1.7.4: Oct 25 1999</h3>
3610  <ul>
3611    <li>Lots of HTML improvement</li>
3612    <li>Fixed some errors when saving both XML and HTML</li>
3613    <li>More examples, the regression tests should now look clean</li>
3614    <li>Fixed a bug with contiguous charref</li>
3615  </ul>
3616  
3617  <h3>1.7.3: Sep 29 1999</h3>
3618  <ul>
3619    <li>portability problems fixed</li>
3620    <li>snprintf was used unconditionally, leading to link problems on system
3621      were it's not available, fixed</li>
3622  </ul>
3623  
3624  <h3>1.7.1: Sep 24 1999</h3>
3625  <ul>
3626    <li>The basic type for strings manipulated by libxml has been renamed in
3627      1.7.1 from <strong>CHAR</strong> to <strong>xmlChar</strong>. The reason
3628      is that CHAR was conflicting with a predefined type on Windows. However
3629      on non WIN32 environment, compatibility is provided by the way of  a
3630      <strong>#define </strong>.</li>
3631    <li>Changed another error : the use of a structure field called errno, and
3632      leading to troubles on platforms where it's a macro</li>
3633  </ul>
3634  
3635  <h3>1.7.0: Sep 23 1999</h3>
3636  <ul>
3637    <li>Added the ability to fetch remote DTD or parsed entities, see the <a
3638      href="html/libxml-nanohttp.html">nanohttp</a> module.</li>
3639    <li>Added an errno to report errors by another mean than a simple printf
3640      like callback</li>
3641    <li>Finished ID/IDREF support and checking when validation</li>
3642    <li>Serious memory leaks fixed (there is now a <a
3643      href="html/libxml-xmlmemory.html">memory wrapper</a> module)</li>
3644    <li>Improvement of <a href="http://www.w3.org/TR/xpath">XPath</a>
3645      implementation</li>
3646    <li>Added an HTML parser front-end</li>
3647  </ul>
3648  
3649  <h2><a name="XML">XML</a></h2>
3650  
3651  <p><a href="http://www.w3.org/TR/REC-xml">XML is a standard</a> for
3652  markup-based structured documents. Here is <a name="example">an example XML
3653  document</a>:</p>
3654  <pre>&lt;?xml version="1.0"?&gt;
3655  &lt;EXAMPLE prop1="gnome is great" prop2="&amp;amp; linux too"&gt;
3656    &lt;head&gt;
3657     &lt;title&gt;Welcome to Gnome&lt;/title&gt;
3658    &lt;/head&gt;
3659    &lt;chapter&gt;
3660     &lt;title&gt;The Linux adventure&lt;/title&gt;
3661     &lt;p&gt;bla bla bla ...&lt;/p&gt;
3662     &lt;image href="linus.gif"/&gt;
3663     &lt;p&gt;...&lt;/p&gt;
3664    &lt;/chapter&gt;
3665  &lt;/EXAMPLE&gt;</pre>
3666  
3667  <p>The first line specifies that it is an XML document and gives useful
3668  information about its encoding.  Then the rest of the document is a text
3669  format whose structure is specified by tags between brackets. <strong>Each
3670  tag opened has to be closed</strong>. XML is pedantic about this. However, if
3671  a tag is empty (no content), a single tag can serve as both the opening and
3672  closing tag if it ends with <code>/&gt;</code> rather than with
3673  <code>&gt;</code>. Note that, for example, the image tag has no content (just
3674  an attribute) and is closed by ending the tag with <code>/&gt;</code>.</p>
3675  
3676  <p>XML can be applied successfully to a wide range of tasks, ranging from
3677  long term structured document maintenance (where it follows the steps of
3678  SGML) to simple data encoding mechanisms like configuration file formatting
3679  (glade), spreadsheets (gnumeric), or even shorter lived documents such as
3680  WebDAV where it is used to encode remote calls between a client and a
3681  server.</p>
3682  
3683  <h2><a name="XSLT">XSLT</a></h2>
3684  
3685  <p>Check <a href="http://xmlsoft.org/XSLT">the separate libxslt page</a></p>
3686  
3687  <p><a href="http://www.w3.org/TR/xslt">XSL Transformations</a>,  is a
3688  language for transforming XML documents into other XML documents (or
3689  HTML/textual output).</p>
3690  
3691  <p>A separate library called libxslt is available implementing XSLT-1.0 for
3692  libxml2. This module "libxslt" too can be found in the Gnome SVN base.</p>
3693  
3694  <p>You can check the progresses on the libxslt <a
3695  href="http://xmlsoft.org/XSLT/ChangeLog.html">Changelog</a>.</p>
3696  
3697  <h2><a name="Python">Python and bindings</a></h2>
3698  
3699  <p>There are a number of language bindings and wrappers available for
3700  libxml2, the list below is not exhaustive. Please contact the <a
3701  href="http://mail.gnome.org/mailman/listinfo/xml-bindings">xml-bindings@gnome.org</a>
3702  (<a href="http://mail.gnome.org/archives/xml-bindings/">archives</a>) in
3703  order to get updates to this list or to discuss the specific topic of libxml2
3704  or libxslt wrappers or bindings:</p>
3705  <ul>
3706    <li><a href="http://libxmlplusplus.sourceforge.net/">Libxml++</a> seems the
3707      most up-to-date C++ bindings for libxml2, check the <a
3708      href="http://libxmlplusplus.sourceforge.net/reference/html/hierarchy.html">documentation</a>
3709      and the <a
3710      href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/libxmlplusplus/libxml%2b%2b/examples/">examples</a>.</li>
3711    <li>There is another <a href="http://libgdome-cpp.berlios.de/">C++ wrapper
3712      based on the gdome2 bindings</a> maintained by Tobias Peters.</li>
3713    <li>and a third C++ wrapper by Peter Jones &lt;pjones@pmade.org&gt;
3714      <p>Website: <a
3715      href="http://pmade.org/pjones/software/xmlwrapp/">http://pmade.org/pjones/software/xmlwrapp/</a></p>
3716    </li>
3717    <li>XML::LibXML <a href="http://cpan.uwinnipeg.ca/dist/XML-LibXML">Perl
3718        bindings</a> are available on CPAN, as well as XML::LibXSLT
3719        <a href="http://cpan.uwinnipeg.ca/dist/XML-LibXSLT">Perl libxslt
3720        bindings</a>.</li>
3721    <li>If you're interested into scripting XML processing, have a look at <a
3722      href="http://xsh.sourceforge.net/">XSH</a> an XML editing shell based on
3723      Libxml2 Perl bindings.</li>
3724    <li><a href="mailto:dkuhlman@cutter.rexx.com">Dave Kuhlman</a> provides an
3725      earlier version of the libxml/libxslt <a
3726      href="http://www.rexx.com/~dkuhlman">wrappers for Python</a>.</li>
3727    <li>Gopal.V and Peter Minten develop <a
3728      href="http://savannah.gnu.org/projects/libxmlsharp">libxml#</a>, a set of
3729      C# libxml2 bindings.</li>
3730    <li>Petr Kozelka provides <a
3731      href="http://sourceforge.net/projects/libxml2-pas">Pascal units to glue
3732      libxml2</a> with Kylix, Delphi and other Pascal compilers.</li>
3733    <li>Uwe Fechner also provides <a
3734      href="http://sourceforge.net/projects/idom2-pas/">idom2</a>, a DOM2
3735      implementation for Kylix2/D5/D6 from Borland.</li>
3736    <li>There is <a href="http://libxml.rubyforge.org/">bindings for Ruby</a> 
3737      and libxml2 bindings are also available in Ruby through the <a
3738      href="http://libgdome-ruby.berlios.de/">libgdome-ruby</a> module
3739      maintained by Tobias Peters.</li>
3740    <li>Steve Ball and contributors maintains <a
3741      href="http://tclxml.sourceforge.net/">libxml2 and libxslt bindings for
3742      Tcl</a>.</li>
3743    <li>libxml2 and libxslt are the default XML libraries for PHP5.</li>
3744    <li><a href="http://savannah.gnu.org/projects/classpathx/">LibxmlJ</a> is
3745      an effort to create a 100% JAXP-compatible Java wrapper for libxml2 and
3746      libxslt as part of GNU ClasspathX project.</li>
3747    <li>Patrick McPhee provides Rexx bindings fof libxml2 and libxslt, look for
3748      <a href="http://www.interlog.com/~ptjm/software.html">RexxXML</a>.</li>
3749    <li><a
3750      href="http://www.satimage.fr/software/en/xml_suite.html">Satimage</a>
3751      provides <a
3752      href="http://www.satimage.fr/software/en/downloads_osaxen.html">XMLLib
3753      osax</a>. This is an osax for Mac OS X with a set of commands to
3754      implement in AppleScript the XML DOM, XPATH and XSLT. Also includes
3755      commands for Property-lists (Apple's fast lookup table XML format.)</li>
3756    <li>Francesco Montorsi developped <a
3757      href="https://sourceforge.net/project/showfiles.php?group_id=51305&amp;package_id=45182">wxXml2</a>
3758      wrappers that interface libxml2, allowing wxWidgets applications to
3759      load/save/edit XML instances.</li>
3760  </ul>
3761  
3762  <p>The distribution includes a set of Python bindings, which are guaranteed
3763  to be maintained as part of the library in the future, though the Python
3764  interface have not yet reached the completeness of the C API.</p>
3765  
3766  <p>Note that some of the Python purist dislike the default set of Python
3767  bindings, rather than complaining I suggest they have a look at <a
3768  href="http://lxml.de/">lxml the more pythonic bindings for libxml2
3769  and libxslt</a> and <a
3770  href="http://lxml.de/mailinglist/">check the mailing-list</a>.</p>
3771  
3772  <p><a href="mailto:stephane.bidoul@softwareag.com">Stéphane Bidoul</a>
3773  maintains <a href="http://users.skynet.be/sbi/libxml-python/">a Windows port
3774  of the Python bindings</a>.</p>
3775  
3776  <p>Note to people interested in building bindings, the API is formalized as
3777  <a href="libxml2-api.xml">an XML API description file</a> which allows to
3778  automate a large part of the Python bindings, this includes function
3779  descriptions, enums, structures, typedefs, etc... The Python script used to
3780  build the bindings is python/generator.py in the source distribution.</p>
3781  
3782  <p>To install the Python bindings there are 2 options:</p>
3783  <ul>
3784    <li>If you use an RPM based distribution, simply install the <a
3785      href="http://rpmfind.net/linux/rpm2html/search.php?query=libxml2-python">libxml2-python
3786      RPM</a> (and if needed the <a
3787      href="http://rpmfind.net/linux/rpm2html/search.php?query=libxslt-python">libxslt-python
3788      RPM</a>).</li>
3789    <li>Otherwise use the <a href="ftp://xmlsoft.org/libxml2/python/">libxml2-python
3790      module distribution</a> corresponding to your installed version of
3791      libxml2 and libxslt. Note that to install it you will need both libxml2
3792      and libxslt installed and run "python setup.py build install" in the
3793      module tree.</li>
3794  </ul>
3795  
3796  <p>The distribution includes a set of examples and regression tests for the
3797  python bindings in the <code>python/tests</code> directory. Here are some
3798  excerpts from those tests:</p>
3799  
3800  <h3>tst.py:</h3>
3801  
3802  <p>This is a basic test of the file interface and DOM navigation:</p>
3803  <pre>import libxml2, sys
3804  
3805  doc = libxml2.parseFile("tst.xml")
3806  if doc.name != "tst.xml":
3807      print "doc.name failed"
3808      sys.exit(1)
3809  root = doc.children
3810  if root.name != "doc":
3811      print "root.name failed"
3812      sys.exit(1)
3813  child = root.children
3814  if child.name != "foo":
3815      print "child.name failed"
3816      sys.exit(1)
3817  doc.freeDoc()</pre>
3818  
3819  <p>The Python module is called libxml2; parseFile is the equivalent of
3820  xmlParseFile (most of the bindings are automatically generated, and the xml
3821  prefix is removed and the casing convention are kept). All node seen at the
3822  binding level share the same subset of accessors:</p>
3823  <ul>
3824    <li><code>name</code> : returns the node name</li>
3825    <li><code>type</code> : returns a string indicating the node type</li>
3826    <li><code>content</code> : returns the content of the node, it is based on
3827      xmlNodeGetContent() and hence is recursive.</li>
3828    <li><code>parent</code> , <code>children</code>, <code>last</code>,
3829      <code>next</code>, <code>prev</code>, <code>doc</code>,
3830      <code>properties</code>: pointing to the associated element in the tree,
3831      those may return None in case no such link exists.</li>
3832  </ul>
3833  
3834  <p>Also note the need to explicitly deallocate documents with freeDoc() .
3835  Reference counting for libxml2 trees would need quite a lot of work to
3836  function properly, and rather than risk memory leaks if not implemented
3837  correctly it sounds safer to have an explicit function to free a tree. The
3838  wrapper python objects like doc, root or child are them automatically garbage
3839  collected.</p>
3840  
3841  <h3>validate.py:</h3>
3842  
3843  <p>This test check the validation interfaces and redirection of error
3844  messages:</p>
3845  <pre>import libxml2
3846  
3847  #deactivate error messages from the validation
3848  def noerr(ctx, str):
3849      pass
3850  
3851  libxml2.registerErrorHandler(noerr, None)
3852  
3853  ctxt = libxml2.createFileParserCtxt("invalid.xml")
3854  ctxt.validate(1)
3855  ctxt.parseDocument()
3856  doc = ctxt.doc()
3857  valid = ctxt.isValid()
3858  doc.freeDoc()
3859  if valid != 0:
3860      print "validity check failed"</pre>
3861  
3862  <p>The first thing to notice is the call to registerErrorHandler(), it
3863  defines a new error handler global to the library. It is used to avoid seeing
3864  the error messages when trying to validate the invalid document.</p>
3865  
3866  <p>The main interest of that test is the creation of a parser context with
3867  createFileParserCtxt() and how the behaviour can be changed before calling
3868  parseDocument() . Similarly the information resulting from the parsing phase
3869  is also available using context methods.</p>
3870  
3871  <p>Contexts like nodes are defined as class and the libxml2 wrappers maps the
3872  C function interfaces in terms of objects method as much as possible. The
3873  best to get a complete view of what methods are supported is to look at the
3874  libxml2.py module containing all the wrappers.</p>
3875  
3876  <h3>push.py:</h3>
3877  
3878  <p>This test show how to activate the push parser interface:</p>
3879  <pre>import libxml2
3880  
3881  ctxt = libxml2.createPushParser(None, "&lt;foo", 4, "test.xml")
3882  ctxt.parseChunk("/&gt;", 2, 1)
3883  doc = ctxt.doc()
3884  
3885  doc.freeDoc()</pre>
3886  
3887  <p>The context is created with a special call based on the
3888  xmlCreatePushParser() from the C library. The first argument is an optional
3889  SAX callback object, then the initial set of data, the length and the name of
3890  the resource in case URI-References need to be computed by the parser.</p>
3891  
3892  <p>Then the data are pushed using the parseChunk() method, the last call
3893  setting the third argument terminate to 1.</p>
3894  
3895  <h3>pushSAX.py:</h3>
3896  
3897  <p>this test show the use of the event based parsing interfaces. In this case
3898  the parser does not build a document, but provides callback information as
3899  the parser makes progresses analyzing the data being provided:</p>
3900  <pre>import libxml2
3901  log = ""
3902  
3903  class callback:
3904      def startDocument(self):
3905          global log
3906          log = log + "startDocument:"
3907  
3908      def endDocument(self):
3909          global log
3910          log = log + "endDocument:"
3911  
3912      def startElement(self, tag, attrs):
3913          global log
3914          log = log + "startElement %s %s:" % (tag, attrs)
3915  
3916      def endElement(self, tag):
3917          global log
3918          log = log + "endElement %s:" % (tag)
3919  
3920      def characters(self, data):
3921          global log
3922          log = log + "characters: %s:" % (data)
3923  
3924      def warning(self, msg):
3925          global log
3926          log = log + "warning: %s:" % (msg)
3927  
3928      def error(self, msg):
3929          global log
3930          log = log + "error: %s:" % (msg)
3931  
3932      def fatalError(self, msg):
3933          global log
3934          log = log + "fatalError: %s:" % (msg)
3935  
3936  handler = callback()
3937  
3938  ctxt = libxml2.createPushParser(handler, "&lt;foo", 4, "test.xml")
3939  chunk = " url='tst'&gt;b"
3940  ctxt.parseChunk(chunk, len(chunk), 0)
3941  chunk = "ar&lt;/foo&gt;"
3942  ctxt.parseChunk(chunk, len(chunk), 1)
3943  
3944  reference = "startDocument:startElement foo {'url': 'tst'}:" + \ 
3945              "characters: bar:endElement foo:endDocument:"
3946  if log != reference:
3947      print "Error got: %s" % log
3948      print "Expected: %s" % reference</pre>
3949  
3950  <p>The key object in that test is the handler, it provides a number of entry
3951  points which can be called by the parser as it makes progresses to indicate
3952  the information set obtained. The full set of callback is larger than what
3953  the callback class in that specific example implements (see the SAX
3954  definition for a complete list). The wrapper will only call those supplied by
3955  the object when activated. The startElement receives the names of the element
3956  and a dictionary containing the attributes carried by this element.</p>
3957  
3958  <p>Also note that the reference string generated from the callback shows a
3959  single character call even though the string "bar" is passed to the parser
3960  from 2 different call to parseChunk()</p>
3961  
3962  <h3>xpath.py:</h3>
3963  
3964  <p>This is a basic test of XPath wrappers support</p>
3965  <pre>import libxml2
3966  
3967  doc = libxml2.parseFile("tst.xml")
3968  ctxt = doc.xpathNewContext()
3969  res = ctxt.xpathEval("//*")
3970  if len(res) != 2:
3971      print "xpath query: wrong node set size"
3972      sys.exit(1)
3973  if res[0].name != "doc" or res[1].name != "foo":
3974      print "xpath query: wrong node set value"
3975      sys.exit(1)
3976  doc.freeDoc()
3977  ctxt.xpathFreeContext()</pre>
3978  
3979  <p>This test parses a file, then create an XPath context to evaluate XPath
3980  expression on it. The xpathEval() method execute an XPath query and returns
3981  the result mapped in a Python way. String and numbers are natively converted,
3982  and node sets are returned as a tuple of libxml2 Python nodes wrappers. Like
3983  the document, the XPath context need to be freed explicitly, also not that
3984  the result of the XPath query may point back to the document tree and hence
3985  the document must be freed after the result of the query is used.</p>
3986  
3987  <h3>xpathext.py:</h3>
3988  
3989  <p>This test shows how to extend the XPath engine with functions written in
3990  python:</p>
3991  <pre>import libxml2
3992  
3993  def foo(ctx, x):
3994      return x + 1
3995  
3996  doc = libxml2.parseFile("tst.xml")
3997  ctxt = doc.xpathNewContext()
3998  libxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
3999  res = ctxt.xpathEval("foo(1)")
4000  if res != 2:
4001      print "xpath extension failure"
4002  doc.freeDoc()
4003  ctxt.xpathFreeContext()</pre>
4004  
4005  <p>Note how the extension function is registered with the context (but that
4006  part is not yet finalized, this may change slightly in the future).</p>
4007  
4008  <h3>tstxpath.py:</h3>
4009  
4010  <p>This test is similar to the previous one but shows how the extension
4011  function can access the XPath evaluation context:</p>
4012  <pre>def foo(ctx, x):
4013      global called
4014  
4015      #
4016      # test that access to the XPath evaluation contexts
4017      #
4018      pctxt = libxml2.xpathParserContext(_obj=ctx)
4019      ctxt = pctxt.context()
4020      called = ctxt.function()
4021      return x + 1</pre>
4022  
4023  <p>All the interfaces around the XPath parser(or rather evaluation) context
4024  are not finalized, but it should be sufficient to do contextual work at the
4025  evaluation point.</p>
4026  
4027  <h3>Memory debugging:</h3>
4028  
4029  <p>last but not least, all tests starts with the following prologue:</p>
4030  <pre>#memory debug specific
4031  libxml2.debugMemory(1)</pre>
4032  
4033  <p>and ends with the following epilogue:</p>
4034  <pre>#memory debug specific
4035  libxml2.cleanupParser()
4036  if libxml2.debugMemory(1) == 0:
4037      print "OK"
4038  else:
4039      print "Memory leak %d bytes" % (libxml2.debugMemory(1))
4040      libxml2.dumpMemory()</pre>
4041  
4042  <p>Those activate the memory debugging interface of libxml2 where all
4043  allocated block in the library are tracked. The prologue then cleans up the
4044  library state and checks that all allocated memory has been freed. If not it
4045  calls dumpMemory() which saves that list in a <code>.memdump</code> file.</p>
4046  
4047  <h2><a name="architecture">libxml2 architecture</a></h2>
4048  
4049  <p>Libxml2 is made of multiple components; some of them are optional, and
4050  most of the block interfaces are public. The main components are:</p>
4051  <ul>
4052    <li>an Input/Output layer</li>
4053    <li>FTP and HTTP client layers (optional)</li>
4054    <li>an Internationalization layer managing the encodings support</li>
4055    <li>a URI module</li>
4056    <li>the XML parser and its basic SAX interface</li>
4057    <li>an HTML parser using the same SAX interface (optional)</li>
4058    <li>a SAX tree module to build an in-memory DOM representation</li>
4059    <li>a tree module to manipulate the DOM representation</li>
4060    <li>a validation module using the DOM representation (optional)</li>
4061    <li>an XPath module for global lookup in a DOM representation
4062    (optional)</li>
4063    <li>a debug module (optional)</li>
4064  </ul>
4065  
4066  <p>Graphically this gives the following:</p>
4067  
4068  <p><img src="libxml.gif" alt="a graphical view of the various"></p>
4069  
4070  <p></p>
4071  
4072  <h2><a name="tree">The tree output</a></h2>
4073  
4074  <p>The parser returns a tree built during the document analysis. The value
4075  returned is an <strong>xmlDocPtr</strong> (i.e., a pointer to an
4076  <strong>xmlDoc</strong> structure). This structure contains information such
4077  as the file name, the document type, and a <strong>children</strong> pointer
4078  which is the root of the document (or more exactly the first child under the
4079  root which is the document). The tree is made of <strong>xmlNode</strong>s,
4080  chained in double-linked lists of siblings and with a children&lt;-&gt;parent
4081  relationship. An xmlNode can also carry properties (a chain of xmlAttr
4082  structures). An attribute may have a value which is a list of TEXT or
4083  ENTITY_REF nodes.</p>
4084  
4085  <p>Here is an example (erroneous with respect to the XML spec since there
4086  should be only one ELEMENT under the root):</p>
4087  
4088  <p><img src="structure.gif" alt=" structure.gif "></p>
4089  
4090  <p>In the source package there is a small program (not installed by default)
4091  called <strong>xmllint</strong> which parses XML files given as argument and
4092  prints them back as parsed. This is useful for detecting errors both in XML
4093  code and in the XML parser itself. It has an option <strong>--debug</strong>
4094  which prints the actual in-memory structure of the document; here is the
4095  result with the <a href="#example">example</a> given before:</p>
4096  <pre>DOCUMENT
4097  version=1.0
4098  standalone=true
4099    ELEMENT EXAMPLE
4100      ATTRIBUTE prop1
4101        TEXT
4102        content=gnome is great
4103      ATTRIBUTE prop2
4104        ENTITY_REF
4105        TEXT
4106        content= linux too 
4107      ELEMENT head
4108        ELEMENT title
4109          TEXT
4110          content=Welcome to Gnome
4111      ELEMENT chapter
4112        ELEMENT title
4113          TEXT
4114          content=The Linux adventure
4115        ELEMENT p
4116          TEXT
4117          content=bla bla bla ...
4118        ELEMENT image
4119          ATTRIBUTE href
4120            TEXT
4121            content=linus.gif
4122        ELEMENT p
4123          TEXT
4124          content=...</pre>
4125  
4126  <p>This should be useful for learning the internal representation model.</p>
4127  
4128  <h2><a name="interface">The SAX interface</a></h2>
4129  
4130  <p>Sometimes the DOM tree output is just too large to fit reasonably into
4131  memory. In that case (and if you don't expect to save back the XML document
4132  loaded using libxml), it's better to use the SAX interface of libxml. SAX is
4133  a <strong>callback-based interface</strong> to the parser. Before parsing,
4134  the application layer registers a customized set of callbacks which are
4135  called by the library as it progresses through the XML input.</p>
4136  
4137  <p>To get more detailed step-by-step guidance on using the SAX interface of
4138  libxml, see the <a
4139  href="http://www.jamesh.id.au/articles/libxml-sax/libxml-sax.html">nice
4140  documentation</a>.written by <a href="mailto:james@daa.com.au">James
4141  Henstridge</a>.</p>
4142  
4143  <p>You can debug the SAX behaviour by using the <strong>testSAX</strong>
4144  program located in the gnome-xml module (it's usually not shipped in the
4145  binary packages of libxml, but you can find it in the tar source
4146  distribution). Here is the sequence of callbacks that would be reported by
4147  testSAX when parsing the example XML document shown earlier:</p>
4148  <pre>SAX.setDocumentLocator()
4149  SAX.startDocument()
4150  SAX.getEntity(amp)
4151  SAX.startElement(EXAMPLE, prop1='gnome is great', prop2='&amp;amp; linux too')
4152  SAX.characters(   , 3)
4153  SAX.startElement(head)
4154  SAX.characters(    , 4)
4155  SAX.startElement(title)
4156  SAX.characters(Welcome to Gnome, 16)
4157  SAX.endElement(title)
4158  SAX.characters(   , 3)
4159  SAX.endElement(head)
4160  SAX.characters(   , 3)
4161  SAX.startElement(chapter)
4162  SAX.characters(    , 4)
4163  SAX.startElement(title)
4164  SAX.characters(The Linux adventure, 19)
4165  SAX.endElement(title)
4166  SAX.characters(    , 4)
4167  SAX.startElement(p)
4168  SAX.characters(bla bla bla ..., 15)
4169  SAX.endElement(p)
4170  SAX.characters(    , 4)
4171  SAX.startElement(image, href='linus.gif')
4172  SAX.endElement(image)
4173  SAX.characters(    , 4)
4174  SAX.startElement(p)
4175  SAX.characters(..., 3)
4176  SAX.endElement(p)
4177  SAX.characters(   , 3)
4178  SAX.endElement(chapter)
4179  SAX.characters( , 1)
4180  SAX.endElement(EXAMPLE)
4181  SAX.endDocument()</pre>
4182  
4183  <p>Most of the other interfaces of libxml2 are based on the DOM tree-building
4184  facility, so nearly everything up to the end of this document presupposes the
4185  use of the standard DOM tree build. Note that the DOM tree itself is built by
4186  a set of registered default callbacks, without internal specific
4187  interface.</p>
4188  
4189  <h2><a name="Validation">Validation &amp; DTDs</a></h2>
4190  
4191  <p>Table of Content:</p>
4192  <ol>
4193    <li><a href="#General5">General overview</a></li>
4194    <li><a href="#definition">The definition</a></li>
4195    <li><a href="#Simple">Simple rules</a>
4196      <ol>
4197        <li><a href="#reference">How to reference a DTD from a document</a></li>
4198        <li><a href="#Declaring">Declaring elements</a></li>
4199        <li><a href="#Declaring1">Declaring attributes</a></li>
4200      </ol>
4201    </li>
4202    <li><a href="#Some">Some examples</a></li>
4203    <li><a href="#validate">How to validate</a></li>
4204    <li><a href="#Other">Other resources</a></li>
4205  </ol>
4206  
4207  <h3><a name="General5">General overview</a></h3>
4208  
4209  <p>Well what is validation and what is a DTD ?</p>
4210  
4211  <p>DTD is the acronym for Document Type Definition. This is a description of
4212  the content for a family of XML files. This is part of the XML 1.0
4213  specification, and allows one to describe and verify that a given document
4214  instance conforms to the set of rules detailing its structure and content.</p>
4215  
4216  <p>Validation is the process of checking a document against a DTD (more
4217  generally against a set of construction rules).</p>
4218  
4219  <p>The validation process and building DTDs are the two most difficult parts
4220  of the XML life cycle. Briefly a DTD defines all the possible elements to be
4221  found within your document, what is the formal shape of your document tree
4222  (by defining the allowed content of an element; either text, a regular
4223  expression for the allowed list of children, or mixed content i.e. both text
4224  and children). The DTD also defines the valid attributes for all elements and
4225  the types of those attributes.</p>
4226  
4227  <h3><a name="definition1">The definition</a></h3>
4228  
4229  <p>The <a href="http://www.w3.org/TR/REC-xml">W3C XML Recommendation</a> (<a
4230  href="http://www.xml.com/axml/axml.html">Tim Bray's annotated version of
4231  Rev1</a>):</p>
4232  <ul>
4233    <li><a href="http://www.w3.org/TR/REC-xml#elemdecls">Declaring
4234    elements</a></li>
4235    <li><a href="http://www.w3.org/TR/REC-xml#attdecls">Declaring
4236    attributes</a></li>
4237  </ul>
4238  
4239  <p>(unfortunately) all this is inherited from the SGML world, the syntax is
4240  ancient...</p>
4241  
4242  <h3><a name="Simple1">Simple rules</a></h3>
4243  
4244  <p>Writing DTDs can be done in many ways. The rules to build them if you need
4245  something permanent or something which can evolve over time can be radically
4246  different. Really complex DTDs like DocBook ones are flexible but quite
4247  harder to design. I will just focus on DTDs for a formats with a fixed simple
4248  structure. It is just a set of basic rules, and definitely not exhaustive nor
4249  usable for complex DTD design.</p>
4250  
4251  <h4><a name="reference1">How to reference a DTD from a document</a>:</h4>
4252  
4253  <p>Assuming the top element of the document is <code>spec</code> and the dtd
4254  is placed in the file <code>mydtd</code> in the subdirectory
4255  <code>dtds</code> of the directory from where the document were loaded:</p>
4256  
4257  <p><code>&lt;!DOCTYPE spec SYSTEM "dtds/mydtd"&gt;</code></p>
4258  
4259  <p>Notes:</p>
4260  <ul>
4261    <li>The system string is actually an URI-Reference (as defined in <a
4262      href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>) so you can use a
4263      full URL string indicating the location of your DTD on the Web. This is a
4264      really good thing to do if you want others to validate your document.</li>
4265    <li>It is also possible to associate a <code>PUBLIC</code> identifier (a
4266      magic string) so that the DTD is looked up in catalogs on the client side
4267      without having to locate it on the web.</li>
4268    <li>A DTD contains a set of element and attribute declarations, but they
4269      don't define what the root of the document should be. This is explicitly
4270      told to the parser/validator as the first element of the
4271      <code>DOCTYPE</code> declaration.</li>
4272  </ul>
4273  
4274  <h4><a name="Declaring2">Declaring elements</a>:</h4>
4275  
4276  <p>The following declares an element <code>spec</code>:</p>
4277  
4278  <p><code>&lt;!ELEMENT spec (front, body, back?)&gt;</code></p>
4279  
4280  <p>It also expresses that the spec element contains one <code>front</code>,
4281  one <code>body</code> and one optional <code>back</code> children elements in
4282  this order. The declaration of one element of the structure and its content
4283  are done in a single declaration. Similarly the following declares
4284  <code>div1</code> elements:</p>
4285  
4286  <p><code>&lt;!ELEMENT div1 (head, (p | list | note)*, div2?)&gt;</code></p>
4287  
4288  <p>which means div1 contains one <code>head</code> then a series of optional
4289  <code>p</code>, <code>list</code>s and <code>note</code>s and then an
4290  optional <code>div2</code>. And last but not least an element can contain
4291  text:</p>
4292  
4293  <p><code>&lt;!ELEMENT b (#PCDATA)&gt;</code></p>
4294  
4295  <p><code>b</code> contains text or being of mixed content (text and elements
4296  in no particular order):</p>
4297  
4298  <p><code>&lt;!ELEMENT p (#PCDATA|a|ul|b|i|em)*&gt;</code></p>
4299  
4300  <p><code>p </code>can contain text or <code>a</code>, <code>ul</code>,
4301  <code>b</code>, <code>i </code>or <code>em</code> elements in no particular
4302  order.</p>
4303  
4304  <h4><a name="Declaring1">Declaring attributes</a>:</h4>
4305  
4306  <p>Again the attributes declaration includes their content definition:</p>
4307  
4308  <p><code>&lt;!ATTLIST termdef name CDATA #IMPLIED&gt;</code></p>
4309  
4310  <p>means that the element <code>termdef</code> can have a <code>name</code>
4311  attribute containing text (<code>CDATA</code>) and which is optional
4312  (<code>#IMPLIED</code>). The attribute value can also be defined within a
4313  set:</p>
4314  
4315  <p><code>&lt;!ATTLIST list type (bullets|ordered|glossary)
4316  "ordered"&gt;</code></p>
4317  
4318  <p>means <code>list</code> element have a <code>type</code> attribute with 3
4319  allowed values "bullets", "ordered" or "glossary" and which default to
4320  "ordered" if the attribute is not explicitly specified.</p>
4321  
4322  <p>The content type of an attribute can be text (<code>CDATA</code>),
4323  anchor/reference/references
4324  (<code>ID</code>/<code>IDREF</code>/<code>IDREFS</code>), entity(ies)
4325  (<code>ENTITY</code>/<code>ENTITIES</code>) or name(s)
4326  (<code>NMTOKEN</code>/<code>NMTOKENS</code>). The following defines that a
4327  <code>chapter</code> element can have an optional <code>id</code> attribute
4328  of type <code>ID</code>, usable for reference from attribute of type
4329  IDREF:</p>
4330  
4331  <p><code>&lt;!ATTLIST chapter id ID #IMPLIED&gt;</code></p>
4332  
4333  <p>The last value of an attribute definition can be <code>#REQUIRED
4334  </code>meaning that the attribute has to be given, <code>#IMPLIED</code>
4335  meaning that it is optional, or the default value (possibly prefixed by
4336  <code>#FIXED</code> if it is the only allowed).</p>
4337  
4338  <p>Notes:</p>
4339  <ul>
4340    <li>Usually the attributes pertaining to a given element are declared in a
4341      single expression, but it is just a convention adopted by a lot of DTD
4342      writers:
4343      <pre>&lt;!ATTLIST termdef
4344            id      ID      #REQUIRED
4345            name    CDATA   #IMPLIED&gt;</pre>
4346      <p>The previous construct defines both <code>id</code> and
4347      <code>name</code> attributes for the element <code>termdef</code>.</p>
4348    </li>
4349  </ul>
4350  
4351  <h3><a name="Some1">Some examples</a></h3>
4352  
4353  <p>The directory <code>test/valid/dtds/</code> in the libxml2 distribution
4354  contains some complex DTD examples. The example in the file
4355  <code>test/valid/dia.xml</code> shows an XML file where the simple DTD is
4356  directly included within the document.</p>
4357  
4358  <h3><a name="validate1">How to validate</a></h3>
4359  
4360  <p>The simplest way is to use the xmllint program included with libxml. The
4361  <code>--valid</code> option turns-on validation of the files given as input.
4362  For example the following validates a copy of the first revision of the XML
4363  1.0 specification:</p>
4364  
4365  <p><code>xmllint --valid --noout test/valid/REC-xml-19980210.xml</code></p>
4366  
4367  <p>the -- noout is used to disable output of the resulting tree.</p>
4368  
4369  <p>The <code>--dtdvalid dtd</code> allows validation of the document(s)
4370  against a given DTD.</p>
4371  
4372  <p>Libxml2 exports an API to handle DTDs and validation, check the <a
4373  href="http://xmlsoft.org/html/libxml-valid.html">associated
4374  description</a>.</p>
4375  
4376  <h3><a name="Other1">Other resources</a></h3>
4377  
4378  <p>DTDs are as old as SGML. So there may be a number of examples on-line, I
4379  will just list one for now, others pointers welcome:</p>
4380  <ul>
4381    <li><a href="http://www.xml101.com:8081/dtd/">XML-101 DTD</a></li>
4382  </ul>
4383  
4384  <p>I suggest looking at the examples found under test/valid/dtd and any of
4385  the large number of books available on XML. The dia example in test/valid
4386  should be both simple and complete enough to allow you to build your own.</p>
4387  
4388  <p></p>
4389  
4390  <h2><a name="Memory">Memory Management</a></h2>
4391  
4392  <p>Table of Content:</p>
4393  <ol>
4394    <li><a href="#General3">General overview</a></li>
4395    <li><a href="#setting">Setting libxml2 set of memory routines</a></li>
4396    <li><a href="#cleanup">Cleaning up after using the library</a></li>
4397    <li><a href="#Debugging">Debugging routines</a></li>
4398    <li><a href="#General4">General memory requirements</a></li>
4399    <li><a href="#Compacting">Returning memory to the kernel</a></li>
4400  </ol>
4401  
4402  <h3><a name="General3">General overview</a></h3>
4403  
4404  <p>The module <code><a
4405  href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlmemory.h</a></code>
4406  provides the interfaces to the libxml2 memory system:</p>
4407  <ul>
4408    <li>libxml2 does not use the libc memory allocator directly but xmlFree(),
4409      xmlMalloc() and xmlRealloc()</li>
4410    <li>those routines can be reallocated to a specific set of routine, by
4411      default the libc ones i.e. free(), malloc() and realloc()</li>
4412    <li>the xmlmemory.c module includes a set of debugging routine</li>
4413  </ul>
4414  
4415  <h3><a name="setting">Setting libxml2 set of memory routines</a></h3>
4416  
4417  <p>It is sometimes useful to not use the default memory allocator, either for
4418  debugging, analysis or to implement a specific behaviour on memory management
4419  (like on embedded systems). Two function calls are available to do so:</p>
4420  <ul>
4421    <li><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemGet
4422      ()</a> which return the current set of functions in use by the parser</li>
4423    <li><a
4424      href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemSetup()</a>
4425      which allow to set up a new set of memory allocation functions</li>
4426  </ul>
4427  
4428  <p>Of course a call to xmlMemSetup() should probably be done before calling
4429  any other libxml2 routines (unless you are sure your allocations routines are
4430  compatibles).</p>
4431  
4432  <h3><a name="cleanup">Cleaning up after using the library</a></h3>
4433  
4434  <p>Libxml2 is not stateless, there is a few set of memory structures needing
4435  allocation before the parser is fully functional (some encoding structures
4436  for example). This also mean that once parsing is finished there is a tiny
4437  amount of memory (a few hundred bytes) which can be recollected if you don't
4438  reuse the library or any document built with it:</p>
4439  <ul>
4440    <li><a href="http://xmlsoft.org/html/libxml-parser.html">xmlCleanupParser
4441      ()</a> is a centralized routine to free the library state and data. Note
4442      that it won't deallocate any produced tree if any (use the xmlFreeDoc()
4443      and related routines for this). This should be called only when the library
4444      is not used anymore.</li>
4445    <li><a href="http://xmlsoft.org/html/libxml-parser.html">xmlInitParser
4446      ()</a> is the dual routine allowing to preallocate the parsing state
4447      which can be useful for example to avoid initialization reentrancy
4448      problems when using libxml2 in multithreaded applications</li>
4449  </ul>
4450  
4451  <p>Generally xmlCleanupParser() is safe assuming no parsing is ongoing and
4452  no document is still being used, if needed the state will be rebuild at the
4453  next invocation of parser routines (or by xmlInitParser()), but be careful
4454  of the consequences in multithreaded applications.</p>
4455  
4456  <h3><a name="Debugging">Debugging routines</a></h3>
4457  
4458  <p>When configured using --with-mem-debug flag (off by default), libxml2 uses
4459  a set of memory allocation debugging routines keeping track of all allocated
4460  blocks and the location in the code where the routine was called. A couple of
4461  other debugging routines allow to dump the memory allocated infos to a file
4462  or call a specific routine when a given block number is allocated:</p>
4463  <ul>
4464    <li><a
4465      href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMallocLoc()</a>
4466      <a
4467      href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlReallocLoc()</a>
4468      and <a
4469      href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemStrdupLoc()</a>
4470      are the memory debugging replacement allocation routines</li>
4471    <li><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemoryDump
4472      ()</a> dumps all the information about the allocated memory block lefts
4473      in the <code>.memdump</code> file</li>
4474  </ul>
4475  
4476  <p>When developing libxml2 memory debug is enabled, the tests programs call
4477  xmlMemoryDump () and the "make test" regression tests will check for any
4478  memory leak during the full regression test sequence, this helps a lot
4479  ensuring that libxml2  does not leak memory and bullet proof memory
4480  allocations use (some libc implementations are known to be far too permissive
4481  resulting in major portability problems!).</p>
4482  
4483  <p>If the .memdump reports a leak, it displays the allocation function and
4484  also tries to give some information about the content and structure of the
4485  allocated blocks left. This is sufficient in most cases to find the culprit,
4486  but not always. Assuming the allocation problem is reproducible, it is
4487  possible to find more easily:</p>
4488  <ol>
4489    <li>write down the block number xxxx not allocated</li>
4490    <li>export the environment variable XML_MEM_BREAKPOINT=xxxx , the easiest
4491      when using GDB is to simply give the command
4492      <p><code>set environment XML_MEM_BREAKPOINT xxxx</code></p>
4493      <p>before running the program.</p>
4494    </li>
4495    <li>run the program under a debugger and set a breakpoint on
4496      xmlMallocBreakpoint() a specific function called when this precise block
4497      is allocated</li>
4498    <li>when the breakpoint is reached you can then do a fine analysis of the
4499      allocation an step  to see the condition resulting in the missing
4500      deallocation.</li>
4501  </ol>
4502  
4503  <p>I used to use a commercial tool to debug libxml2 memory problems but after
4504  noticing that it was not detecting memory leaks that simple mechanism was
4505  used and proved extremely efficient until now. Lately I have also used <a
4506  href="http://developer.kde.org/~sewardj/">valgrind</a> with quite some
4507  success, it is tied to the i386 architecture since it works by emulating the
4508  processor and instruction set, it is slow but  extremely efficient, i.e. it
4509  spot memory usage errors in a very precise way.</p>
4510  
4511  <h3><a name="General4">General memory requirements</a></h3>
4512  
4513  <p>How much libxml2 memory require ? It's hard to tell in average it depends
4514  of a number of things:</p>
4515  <ul>
4516    <li>the parser itself should work  in a fixed amount of memory, except for
4517      information maintained about the stacks of names and  entities locations.
4518      The I/O and encoding handlers will probably account for a few KBytes.
4519      This is true for both the XML and HTML parser (though the HTML parser
4520      need more state).</li>
4521    <li>If you are generating the DOM tree then memory requirements will grow
4522      nearly linear with the size of the data. In general for a balanced
4523      textual document the internal memory requirement is about 4 times the
4524      size of the UTF8 serialization of this document (example the XML-1.0
4525      recommendation is a bit more of 150KBytes and takes 650KBytes of main
4526      memory when parsed). Validation will add a amount of memory required for
4527      maintaining the external Dtd state which should be linear with the
4528      complexity of the content model defined by the Dtd</li>
4529    <li>If you need to work with fixed memory requirements or don't need the
4530      full DOM tree then using the <a href="xmlreader.html">xmlReader
4531      interface</a> is probably the best way to proceed, it still allows to
4532      validate or operate on subset of the tree if needed.</li>
4533    <li>If you don't care about the advanced features of libxml2 like
4534      validation, DOM, XPath or XPointer, don't use entities, need to work with
4535      fixed memory requirements, and try to get the fastest parsing possible
4536      then the SAX interface should be used, but it has known restrictions.</li>
4537  </ul>
4538  
4539  <p></p>
4540  <h3><a name="Compacting">Returning memory to the kernel</a></h3>
4541  
4542  <p>You may encounter that your process using libxml2 does not have a
4543  reduced memory usage although you freed the trees. This is because
4544  libxml2 allocates memory in a number of small chunks. When freeing one
4545  of those chunks, the OS may decide that giving this little memory back
4546  to the kernel will cause too much overhead and delay the operation. As
4547  all chunks are this small, they get actually freed but not returned to
4548  the kernel. On systems using glibc, there is a function call
4549  "malloc_trim" from malloc.h which does this missing operation (note that
4550  it is allowed to fail). Thus, after freeing your tree you may simply try
4551  "malloc_trim(0);" to really get the memory back. If your OS does not
4552  provide malloc_trim, try searching for a similar function.</p>
4553  <p></p>
4554  
4555  <h2><a name="Encodings">Encodings support</a></h2>
4556  
4557  <p>If you are not really familiar with Internationalization (usual shortcut
4558  is I18N) , Unicode, characters and glyphs, I suggest you read a <a
4559  href="http://www.tbray.org/ongoing/When/200x/2003/04/06/Unicode">presentation</a>
4560  by Tim Bray on Unicode and why you should care about it.</p>
4561  
4562  <p>If you don't understand why <b>it does not make sense to have a string
4563  without knowing what encoding it uses</b>, then as Joel Spolsky said <a
4564  href="http://www.joelonsoftware.com/articles/Unicode.html">please do not
4565  write another line of code until you finish reading that article.</a>. It is
4566  a prerequisite to understand this page, and avoid a lot of problems with
4567  libxml2, XML or text processing in general.</p>
4568  
4569  <p>Table of Content:</p>
4570  <ol>
4571    <li><a href="encoding.html#What">What does internationalization support
4572      mean ?</a></li>
4573    <li><a href="encoding.html#internal">The internal encoding, how and
4574    why</a></li>
4575    <li><a href="encoding.html#implemente">How is it implemented ?</a></li>
4576    <li><a href="encoding.html#Default">Default supported encodings</a></li>
4577    <li><a href="encoding.html#extend">How to extend the existing
4578    support</a></li>
4579  </ol>
4580  
4581  <h3><a name="What">What does internationalization support mean ?</a></h3>
4582  
4583  <p>XML was designed from the start to allow the support of any character set
4584  by using Unicode. Any conformant XML parser has to support the UTF-8 and
4585  UTF-16 default encodings which can both express the full unicode ranges. UTF8
4586  is a variable length encoding whose greatest points are to reuse the same
4587  encoding for ASCII and to save space for Western encodings, but it is a bit
4588  more complex to handle in practice. UTF-16 use 2 bytes per character (and
4589  sometimes combines two pairs), it makes implementation easier, but looks a
4590  bit overkill for Western languages encoding. Moreover the XML specification
4591  allows the document to be encoded in other encodings at the condition that
4592  they are clearly labeled as such. For example the following is a wellformed
4593  XML document encoded in ISO-8859-1 and using accentuated letters that we
4594  French like for both markup and content:</p>
4595  <pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
4596  &lt;tr&egrave;s&gt;l&agrave; &lt;/tr&egrave;s&gt;</pre>
4597  
4598  <p>Having internationalization support in libxml2 means the following:</p>
4599  <ul>
4600    <li>the document is properly parsed</li>
4601    <li>information about it's encoding is saved</li>
4602    <li>it can be modified</li>
4603    <li>it can be saved in its original encoding</li>
4604    <li>it can also be saved in another encoding supported by libxml2 (for
4605      example straight UTF8 or even an ASCII form)</li>
4606  </ul>
4607  
4608  <p>Another very important point is that the whole libxml2 API, with the
4609  exception of a few routines to read with a specific encoding or save to a
4610  specific encoding, is completely agnostic about the original encoding of the
4611  document.</p>
4612  
4613  <p>It should be noted too that the HTML parser embedded in libxml2 now obey
4614  the same rules too, the following document will be (as of 2.2.2) handled  in
4615  an internationalized fashion by libxml2 too:</p>
4616  <pre>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
4617                        "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
4618  &lt;html lang="fr"&gt;
4619  &lt;head&gt;
4620    &lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"&gt;
4621  &lt;/head&gt;
4622  &lt;body&gt;
4623  &lt;p&gt;W3C cr&eacute;e des standards pour le Web.&lt;/body&gt;
4624  &lt;/html&gt;</pre>
4625  
4626  <h3><a name="internal">The internal encoding, how and why</a></h3>
4627  
4628  <p>One of the core decisions was to force all documents to be converted to a
4629  default internal encoding, and that encoding to be UTF-8, here are the
4630  rationales for those choices:</p>
4631  <ul>
4632    <li>keeping the native encoding in the internal form would force the libxml
4633      users (or the code associated) to be fully aware of the encoding of the
4634      original document, for examples when adding a text node to a document,
4635      the content would have to be provided in the document encoding, i.e. the
4636      client code would have to check it before hand, make sure it's conformant
4637      to the encoding, etc ... Very hard in practice, though in some specific
4638      cases this may make sense.</li>
4639    <li>the second decision was which encoding. From the XML spec only UTF8 and
4640      UTF16 really makes sense as being the two only encodings for which there
4641      is mandatory support. UCS-4 (32 bits fixed size encoding) could be
4642      considered an intelligent choice too since it's a direct Unicode mapping
4643      support. I selected UTF-8 on the basis of efficiency and compatibility
4644      with surrounding software:
4645      <ul>
4646        <li>UTF-8 while a bit more complex to convert from/to (i.e. slightly
4647          more costly to import and export CPU wise) is also far more compact
4648          than UTF-16 (and UCS-4) for a majority of the documents I see it used
4649          for right now (RPM RDF catalogs, advogato data, various configuration
4650          file formats, etc.) and the key point for today's computer
4651          architecture is efficient uses of caches. If one nearly double the
4652          memory requirement to store the same amount of data, this will trash
4653          caches (main memory/external caches/internal caches) and my take is
4654          that this harms the system far more than the CPU requirements needed
4655          for the conversion to UTF-8</li>
4656        <li>Most of libxml2 version 1 users were using it with straight ASCII
4657          most of the time, doing the conversion with an internal encoding
4658          requiring all their code to be rewritten was a serious show-stopper
4659          for using UTF-16 or UCS-4.</li>
4660        <li>UTF-8 is being used as the de-facto internal encoding standard for
4661          related code like the <a href="http://www.pango.org/">pango</a>
4662          upcoming Gnome text widget, and a lot of Unix code (yet another place
4663          where Unix programmer base takes a different approach from Microsoft
4664          - they are using UTF-16)</li>
4665      </ul>
4666    </li>
4667  </ul>
4668  
4669  <p>What does this mean in practice for the libxml2 user:</p>
4670  <ul>
4671    <li>xmlChar, the libxml2 data type is a byte, those bytes must be assembled
4672      as UTF-8 valid strings. The proper way to terminate an xmlChar * string
4673      is simply to append 0 byte, as usual.</li>
4674    <li>One just need to make sure that when using chars outside the ASCII set,
4675      the values has been properly converted to UTF-8</li>
4676  </ul>
4677  
4678  <h3><a name="implemente">How is it implemented ?</a></h3>
4679  
4680  <p>Let's describe how all this works within libxml, basically the I18N
4681  (internationalization) support get triggered only during I/O operation, i.e.
4682  when reading a document or saving one. Let's look first at the reading
4683  sequence:</p>
4684  <ol>
4685    <li>when a document is processed, we usually don't know the encoding, a
4686      simple heuristic allows to detect UTF-16 and UCS-4 from encodings where
4687      the ASCII range (0-0x7F) maps with ASCII</li>
4688    <li>the xml declaration if available is parsed, including the encoding
4689      declaration. At that point, if the autodetected encoding is different
4690      from the one declared a call to xmlSwitchEncoding() is issued.</li>
4691    <li>If there is no encoding declaration, then the input has to be in either
4692      UTF-8 or UTF-16, if it is not then at some point when processing the
4693      input, the converter/checker of UTF-8 form will raise an encoding error.
4694      You may end-up with a garbled document, or no document at all ! Example:
4695      <pre>~/XML -&gt; ./xmllint err.xml 
4696  err.xml:1: error: Input is not proper UTF-8, indicate encoding !
4697  &lt;tr&egrave;s&gt;l&agrave; &lt;/tr&egrave;s&gt;
4698     ^
4699  err.xml:1: error: Bytes: 0xE8 0x73 0x3E 0x6C
4700  &lt;tr&egrave;s&gt;l&agrave; &lt;/tr&egrave;s&gt;
4701     ^</pre>
4702    </li>
4703    <li>xmlSwitchEncoding() does an encoding name lookup, canonicalize it, and
4704      then search the default registered encoding converters for that encoding.
4705      If it's not within the default set and iconv() support has been compiled
4706      it, it will ask iconv for such an encoder. If this fails then the parser
4707      will report an error and stops processing:
4708      <pre>~/XML -&gt; ./xmllint err2.xml 
4709  err2.xml:1: error: Unsupported encoding UnsupportedEnc
4710  &lt;?xml version="1.0" encoding="UnsupportedEnc"?&gt;
4711                                               ^</pre>
4712    </li>
4713    <li>From that point the encoder processes progressively the input (it is
4714      plugged as a front-end to the I/O module) for that entity. It captures
4715      and converts on-the-fly the document to be parsed to UTF-8. The parser
4716      itself just does UTF-8 checking of this input and process it
4717      transparently. The only difference is that the encoding information has
4718      been added to the parsing context (more precisely to the input
4719      corresponding to this entity).</li>
4720    <li>The result (when using DOM) is an internal form completely in UTF-8
4721      with just an encoding information on the document node.</li>
4722  </ol>
4723  
4724  <p>Ok then what happens when saving the document (assuming you
4725  collected/built an xmlDoc DOM like structure) ? It depends on the function
4726  called, xmlSaveFile() will just try to save in the original encoding, while
4727  xmlSaveFileTo() and xmlSaveFileEnc() can optionally save to a given
4728  encoding:</p>
4729  <ol>
4730    <li>if no encoding is given, libxml2 will look for an encoding value
4731      associated to the document and if it exists will try to save to that
4732      encoding,
4733      <p>otherwise everything is written in the internal form, i.e. UTF-8</p>
4734    </li>
4735    <li>so if an encoding was specified, either at the API level or on the
4736      document, libxml2 will again canonicalize the encoding name, lookup for a
4737      converter in the registered set or through iconv. If not found the
4738      function will return an error code</li>
4739    <li>the converter is placed before the I/O buffer layer, as another kind of
4740      buffer, then libxml2 will simply push the UTF-8 serialization to through
4741      that buffer, which will then progressively be converted and pushed onto
4742      the I/O layer.</li>
4743    <li>It is possible that the converter code fails on some input, for example
4744      trying to push an UTF-8 encoded Chinese character through the UTF-8 to
4745      ISO-8859-1 converter won't work. Since the encoders are progressive they
4746      will just report the error and the number of bytes converted, at that
4747      point libxml2 will decode the offending character, remove it from the
4748      buffer and replace it with the associated charRef encoding &amp;#123; and
4749      resume the conversion. This guarantees that any document will be saved
4750      without losses (except for markup names where this is not legal, this is
4751      a problem in the current version, in practice avoid using non-ascii
4752      characters for tag or attribute names). A special "ascii" encoding name
4753      is used to save documents to a pure ascii form can be used when
4754      portability is really crucial</li>
4755  </ol>
4756  
4757  <p>Here are a few examples based on the same test document and assumin a
4758  terminal using ISO-8859-1 as the text encoding:</p>
4759  <pre>~/XML -&gt; ./xmllint isolat1 
4760  &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
4761  &lt;tr&egrave;s&gt;là&lt;/tr&egrave;s&gt;
4762  ~/XML -&gt; ./xmllint --encode UTF-8 isolat1 
4763  &lt;?xml version="1.0" encoding="UTF-8"?&gt;
4764  &lt;très&gt;là &nbsp;&lt;/très&gt;
4765  ~/XML -&gt; </pre>
4766  
4767  <p>The same processing is applied (and reuse most of the code) for HTML I18N
4768  processing. Looking up and modifying the content encoding is a bit more
4769  difficult since it is located in a &lt;meta&gt; tag under the &lt;head&gt;,
4770  so a couple of functions htmlGetMetaEncoding() and htmlSetMetaEncoding() have
4771  been provided. The parser also attempts to switch encoding on the fly when
4772  detecting such a tag on input. Except for that the processing is the same
4773  (and again reuses the same code).</p>
4774  
4775  <h3><a name="Default">Default supported encodings</a></h3>
4776  
4777  <p>libxml2 has a set of default converters for the following encodings
4778  (located in encoding.c):</p>
4779  <ol>
4780    <li>UTF-8 is supported by default (null handlers)</li>
4781    <li>UTF-16, both little and big endian</li>
4782    <li>ISO-Latin-1 (ISO-8859-1) covering most western languages</li>
4783    <li>ASCII, useful mostly for saving</li>
4784    <li>HTML, a specific handler for the conversion of UTF-8 to ASCII with HTML
4785      predefined entities like &amp;copy; for the Copyright sign.</li>
4786  </ol>
4787  
4788  <p>More over when compiled on an Unix platform with iconv support the full
4789  set of encodings supported by iconv can be instantly be used by libxml. On a
4790  linux machine with glibc-2.1 the list of supported encodings and aliases fill
4791  3 full pages, and include UCS-4, the full set of ISO-Latin encodings, and the
4792  various Japanese ones.</p>
4793  
4794  <p>To convert from the UTF-8 values returned from the API to another encoding
4795  then it is possible to use the function provided from <a
4796  href="html/libxml-encoding.html">the encoding module</a> like <a
4797  href="html/libxml-encoding.html#UTF8Toisolat1">UTF8Toisolat1</a>, or use the
4798  POSIX <a
4799  href="http://www.opengroup.org/onlinepubs/009695399/functions/iconv.html">iconv()</a>
4800  API directly.</p>
4801  
4802  <h4>Encoding aliases</h4>
4803  
4804  <p>From 2.2.3, libxml2 has support to register encoding names aliases. The
4805  goal is to be able to parse document whose encoding is supported but where
4806  the name differs (for example from the default set of names accepted by
4807  iconv). The following functions allow to register and handle new aliases for
4808  existing encodings. Once registered libxml2 will automatically lookup the
4809  aliases when handling a document:</p>
4810  <ul>
4811    <li>int xmlAddEncodingAlias(const char *name, const char *alias);</li>
4812    <li>int xmlDelEncodingAlias(const char *alias);</li>
4813    <li>const char * xmlGetEncodingAlias(const char *alias);</li>
4814    <li>void xmlCleanupEncodingAliases(void);</li>
4815  </ul>
4816  
4817  <h3><a name="extend">How to extend the existing support</a></h3>
4818  
4819  <p>Well adding support for new encoding, or overriding one of the encoders
4820  (assuming it is buggy) should not be hard, just write input and output
4821  conversion routines to/from UTF-8, and register them using
4822  xmlNewCharEncodingHandler(name, xxxToUTF8, UTF8Toxxx),  and they will be
4823  called automatically if the parser(s) encounter such an encoding name
4824  (register it uppercase, this will help). The description of the encoders,
4825  their arguments and expected return values are described in the encoding.h
4826  header.</p>
4827  
4828  <h2><a name="IO">I/O Interfaces</a></h2>
4829  
4830  <p>Table of Content:</p>
4831  <ol>
4832    <li><a href="#General1">General overview</a></li>
4833    <li><a href="#basic">The basic buffer type</a></li>
4834    <li><a href="#Input">Input I/O handlers</a></li>
4835    <li><a href="#Output">Output I/O handlers</a></li>
4836    <li><a href="#entities">The entities loader</a></li>
4837    <li><a href="#Example2">Example of customized I/O</a></li>
4838  </ol>
4839  
4840  <h3><a name="General1">General overview</a></h3>
4841  
4842  <p>The module <code><a
4843  href="http://xmlsoft.org/html/libxml-xmlio.html">xmlIO.h</a></code> provides
4844  the interfaces to the libxml2 I/O system. This consists of 4 main parts:</p>
4845  <ul>
4846    <li>Entities loader, this is a routine which tries to fetch the entities
4847      (files) based on their PUBLIC and SYSTEM identifiers. The default loader
4848      don't look at the public identifier since libxml2 do not maintain a
4849      catalog. You can redefine you own entity loader by using
4850      <code>xmlGetExternalEntityLoader()</code> and
4851      <code>xmlSetExternalEntityLoader()</code>. <a href="#entities">Check the
4852      example</a>.</li>
4853    <li>Input I/O buffers which are a commodity structure used by the parser(s)
4854      input layer to handle fetching the information to feed the parser. This
4855      provides buffering and is also a placeholder where the encoding
4856      converters to UTF8 are piggy-backed.</li>
4857    <li>Output I/O buffers are similar to the Input ones and fulfill similar
4858      task but when generating a serialization from a tree.</li>
4859    <li>A mechanism to register sets of I/O callbacks and associate them with
4860      specific naming schemes like the protocol part of the URIs.
4861      <p>This affect the default I/O operations and allows to use specific I/O
4862      handlers for certain names.</p>
4863    </li>
4864  </ul>
4865  
4866  <p>The general mechanism used when loading http://rpmfind.net/xml.html for
4867  example in the HTML parser is the following:</p>
4868  <ol>
4869    <li>The default entity loader calls <code>xmlNewInputFromFile()</code> with
4870      the parsing context and the URI string.</li>
4871    <li>the URI string is checked against the existing registered handlers
4872      using their match() callback function, if the HTTP module was compiled
4873      in, it is registered and its match() function will succeeds</li>
4874    <li>the open() function of the handler is called and if successful will
4875      return an I/O Input buffer</li>
4876    <li>the parser will the start reading from this buffer and progressively
4877      fetch information from the resource, calling the read() function of the
4878      handler until the resource is exhausted</li>
4879    <li>if an encoding change is detected it will be installed on the input
4880      buffer, providing buffering and efficient use of the conversion
4881    routines</li>
4882    <li>once the parser has finished, the close() function of the handler is
4883      called once and the Input buffer and associated resources are
4884    deallocated.</li>
4885  </ol>
4886  
4887  <p>The user defined callbacks are checked first to allow overriding of the
4888  default libxml2 I/O routines.</p>
4889  
4890  <h3><a name="basic">The basic buffer type</a></h3>
4891  
4892  <p>All the buffer manipulation handling is done using the
4893  <code>xmlBuffer</code> type define in <code><a
4894  href="http://xmlsoft.org/html/libxml-tree.html">tree.h</a> </code>which is a
4895  resizable memory buffer. The buffer allocation strategy can be selected to be
4896  either best-fit or use an exponential doubling one (CPU vs. memory use
4897  trade-off). The values are <code>XML_BUFFER_ALLOC_EXACT</code> and
4898  <code>XML_BUFFER_ALLOC_DOUBLEIT</code>, and can be set individually or on a
4899  system wide basis using <code>xmlBufferSetAllocationScheme()</code>. A number
4900  of functions allows to manipulate buffers with names starting with the
4901  <code>xmlBuffer...</code> prefix.</p>
4902  
4903  <h3><a name="Input">Input I/O handlers</a></h3>
4904  
4905  <p>An Input I/O handler is a simple structure
4906  <code>xmlParserInputBuffer</code> containing a context associated to the
4907  resource (file descriptor, or pointer to a protocol handler), the read() and
4908  close() callbacks to use and an xmlBuffer. And extra xmlBuffer and a charset
4909  encoding handler are also present to support charset conversion when
4910  needed.</p>
4911  
4912  <h3><a name="Output">Output I/O handlers</a></h3>
4913  
4914  <p>An Output handler <code>xmlOutputBuffer</code> is completely similar to an
4915  Input one except the callbacks are write() and close().</p>
4916  
4917  <h3><a name="entities">The entities loader</a></h3>
4918  
4919  <p>The entity loader resolves requests for new entities and create inputs for
4920  the parser. Creating an input from a filename or an URI string is done
4921  through the xmlNewInputFromFile() routine.  The default entity loader do not
4922  handle the PUBLIC identifier associated with an entity (if any). So it just
4923  calls xmlNewInputFromFile() with the SYSTEM identifier (which is mandatory in
4924  XML).</p>
4925  
4926  <p>If you want to hook up a catalog mechanism then you simply need to
4927  override the default entity loader, here is an example:</p>
4928  <pre>#include &lt;libxml/xmlIO.h&gt;
4929  
4930  xmlExternalEntityLoader defaultLoader = NULL;
4931  
4932  xmlParserInputPtr
4933  xmlMyExternalEntityLoader(const char *URL, const char *ID,
4934                                 xmlParserCtxtPtr ctxt) {
4935      xmlParserInputPtr ret;
4936      const char *fileID = NULL;
4937      /* lookup for the fileID depending on ID */
4938  
4939      ret = xmlNewInputFromFile(ctxt, fileID);
4940      if (ret != NULL)
4941          return(ret);
4942      if (defaultLoader != NULL)
4943          ret = defaultLoader(URL, ID, ctxt);
4944      return(ret);
4945  }
4946  
4947  int main(..) {
4948      ...
4949  
4950      /*
4951       * Install our own entity loader
4952       */
4953      defaultLoader = xmlGetExternalEntityLoader();
4954      xmlSetExternalEntityLoader(xmlMyExternalEntityLoader);
4955  
4956      ...
4957  }</pre>
4958  
4959  <h3><a name="Example2">Example of customized I/O</a></h3>
4960  
4961  <p>This example come from <a href="http://xmlsoft.org/messages/0708.html">a
4962  real use case</a>,  xmlDocDump() closes the FILE * passed by the application
4963  and this was a problem. The <a
4964  href="http://xmlsoft.org/messages/0711.html">solution</a> was to redefine a
4965  new output handler with the closing call deactivated:</p>
4966  <ol>
4967    <li>First define a new I/O output allocator where the output don't close
4968      the file:
4969      <pre>xmlOutputBufferPtr
4970  xmlOutputBufferCreateOwn(FILE *file, xmlCharEncodingHandlerPtr encoder) {
4971  &nbsp;&nbsp;&nbsp;&nbsp;xmlOutputBufferPtr ret;
4972  &nbsp;&nbsp;&nbsp;&nbsp;
4973  &nbsp;&nbsp;&nbsp;&nbsp;if (xmlOutputCallbackInitialized == 0)
4974  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlRegisterDefaultOutputCallbacks();
4975  
4976  &nbsp;&nbsp;&nbsp;&nbsp;if (file == NULL) return(NULL);
4977  &nbsp;&nbsp;&nbsp;&nbsp;ret = xmlAllocOutputBuffer(encoder);
4978  &nbsp;&nbsp;&nbsp;&nbsp;if (ret != NULL) {
4979  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret-&gt;context = file;
4980  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret-&gt;writecallback = xmlFileWrite;
4981  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret-&gt;closecallback = NULL;  /* No close callback */
4982  &nbsp;&nbsp;&nbsp;&nbsp;}
4983  &nbsp;&nbsp;&nbsp;&nbsp;return(ret);
4984  } </pre>
4985    </li>
4986    <li>And then use it to save the document:
4987      <pre>FILE *f;
4988  xmlOutputBufferPtr output;
4989  xmlDocPtr doc;
4990  int res;
4991  
4992  f = ...
4993  doc = ....
4994  
4995  output = xmlOutputBufferCreateOwn(f, NULL);
4996  res = xmlSaveFileTo(output, doc, NULL);
4997      </pre>
4998    </li>
4999  </ol>
5000  
5001  <h2><a name="Catalog">Catalog support</a></h2>
5002  
5003  <p>Table of Content:</p>
5004  <ol>
5005    <li><a href="General2">General overview</a></li>
5006    <li><a href="#definition">The definition</a></li>
5007    <li><a href="#Simple">Using catalogs</a></li>
5008    <li><a href="#Some">Some examples</a></li>
5009    <li><a href="#reference">How to tune  catalog usage</a></li>
5010    <li><a href="#validate">How to debug catalog processing</a></li>
5011    <li><a href="#Declaring">How to create and maintain catalogs</a></li>
5012    <li><a href="#implemento">The implementor corner quick review of the
5013    API</a></li>
5014    <li><a href="#Other">Other resources</a></li>
5015  </ol>
5016  
5017  <h3><a name="General2">General overview</a></h3>
5018  
5019  <p>What is a catalog? Basically it's a lookup mechanism used when an entity
5020  (a file or a remote resource) references another entity. The catalog lookup
5021  is inserted between the moment the reference is recognized by the software
5022  (XML parser, stylesheet processing, or even images referenced for inclusion
5023  in a rendering) and the time where loading that resource is actually
5024  started.</p>
5025  
5026  <p>It is basically used for 3 things:</p>
5027  <ul>
5028    <li>mapping from "logical" names, the public identifiers and a more
5029      concrete name usable for download (and URI). For example it can associate
5030      the logical name
5031      <p>"-//OASIS//DTD DocBook XML V4.1.2//EN"</p>
5032      <p>of the DocBook 4.1.2 XML DTD with the actual URL where it can be
5033      downloaded</p>
5034      <p>http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd</p>
5035    </li>
5036    <li>remapping from a given URL to another one, like an HTTP indirection
5037      saying that
5038      <p>"http://www.oasis-open.org/committes/tr.xsl"</p>
5039      <p>should really be looked at</p>
5040      <p>"http://www.oasis-open.org/committes/entity/stylesheets/base/tr.xsl"</p>
5041    </li>
5042    <li>providing a local cache mechanism allowing to load the entities
5043      associated to public identifiers or remote resources, this is a really
5044      important feature for any significant deployment of XML or SGML since it
5045      allows to avoid the aleas and delays associated to fetching remote
5046      resources.</li>
5047  </ul>
5048  
5049  <h3><a name="definition">The definitions</a></h3>
5050  
5051  <p>Libxml, as of 2.4.3 implements 2 kind of catalogs:</p>
5052  <ul>
5053    <li>the older SGML catalogs, the official spec is  SGML Open Technical
5054      Resolution TR9401:1997, but is better understood by reading <a
5055      href="http://www.jclark.com/sp/catalog.htm">the SP Catalog page</a> from
5056      James Clark. This is relatively old and not the preferred mode of
5057      operation of libxml.</li>
5058    <li><a href="http://www.oasis-open.org/committees/entity/spec.html">XML
5059      Catalogs</a> is far more flexible, more recent, uses an XML syntax and
5060      should scale quite better. This is the default option of libxml.</li>
5061  </ul>
5062  
5063  <p></p>
5064  
5065  <h3><a name="Simple">Using catalog</a></h3>
5066  
5067  <p>In a normal environment libxml2 will by default check the presence of a
5068  catalog in /etc/xml/catalog, and assuming it has been correctly populated,
5069  the processing is completely transparent to the document user. To take a
5070  concrete example, suppose you are authoring a DocBook document, this one
5071  starts with the following DOCTYPE definition:</p>
5072  <pre>&lt;?xml version='1.0'?&gt;
5073  &lt;!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V3.1.4//EN"
5074            "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd"&gt;</pre>
5075  
5076  <p>When validating the document with libxml, the catalog will be
5077  automatically consulted to lookup the public identifier "-//Norman Walsh//DTD
5078  DocBk XML V3.1.4//EN" and the system identifier
5079  "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd", and if these entities have
5080  been installed on your system and the catalogs actually point to them, libxml
5081  will fetch them from the local disk.</p>
5082  
5083  <p style="font-size: 10pt"><strong>Note</strong>: Really don't use this
5084  DOCTYPE example it's a really old version, but is fine as an example.</p>
5085  
5086  <p>Libxml2 will check the catalog each time that it is requested to load an
5087  entity, this includes DTD, external parsed entities, stylesheets, etc ... If
5088  your system is correctly configured all the authoring phase and processing
5089  should use only local files, even if your document stays portable because it
5090  uses the canonical public and system ID, referencing the remote document.</p>
5091  
5092  <h3><a name="Some">Some examples:</a></h3>
5093  
5094  <p>Here is a couple of fragments from XML Catalogs used in libxml2 early
5095  regression tests in <code>test/catalogs</code> :</p>
5096  <pre>&lt;?xml version="1.0"?&gt;
5097  &lt;!DOCTYPE catalog PUBLIC 
5098     "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
5099     "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"&gt;
5100  &lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"&gt;
5101    &lt;public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
5102     uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/&gt;
5103  ...</pre>
5104  
5105  <p>This is the beginning of a catalog for DocBook 4.1.2, XML Catalogs are
5106  written in XML,  there is a specific namespace for catalog elements
5107  "urn:oasis:names:tc:entity:xmlns:xml:catalog". The first entry in this
5108  catalog is a <code>public</code> mapping it allows to associate a Public
5109  Identifier with an URI.</p>
5110  <pre>...
5111      &lt;rewriteSystem systemIdStartString="http://www.oasis-open.org/docbook/"
5112                     rewritePrefix="file:///usr/share/xml/docbook/"/&gt;
5113  ...</pre>
5114  
5115  <p>A <code>rewriteSystem</code> is a very powerful instruction, it says that
5116  any URI starting with a given prefix should be looked at another  URI
5117  constructed by replacing the prefix with an new one. In effect this acts like
5118  a cache system for a full area of the Web. In practice it is extremely useful
5119  with a file prefix if you have installed a copy of those resources on your
5120  local system.</p>
5121  <pre>...
5122  &lt;delegatePublic publicIdStartString="-//OASIS//DTD XML Catalog //"
5123                  catalog="file:///usr/share/xml/docbook.xml"/&gt;
5124  &lt;delegatePublic publicIdStartString="-//OASIS//ENTITIES DocBook XML"
5125                  catalog="file:///usr/share/xml/docbook.xml"/&gt;
5126  &lt;delegatePublic publicIdStartString="-//OASIS//DTD DocBook XML"
5127                  catalog="file:///usr/share/xml/docbook.xml"/&gt;
5128  &lt;delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/"
5129                  catalog="file:///usr/share/xml/docbook.xml"/&gt;
5130  &lt;delegateURI uriStartString="http://www.oasis-open.org/docbook/"
5131                  catalog="file:///usr/share/xml/docbook.xml"/&gt;
5132  ...</pre>
5133  
5134  <p>Delegation is the core features which allows to build a tree of catalogs,
5135  easier to maintain than a single catalog, based on Public Identifier, System
5136  Identifier or URI prefixes it instructs the catalog software to look up
5137  entries in another resource. This feature allow to build hierarchies of
5138  catalogs, the set of entries presented should be sufficient to redirect the
5139  resolution of all DocBook references to the specific catalog in
5140  <code>/usr/share/xml/docbook.xml</code> this one in turn could delegate all
5141  references for DocBook 4.2.1 to a specific catalog installed at the same time
5142  as the DocBook resources on the local machine.</p>
5143  
5144  <h3><a name="reference">How to tune catalog usage:</a></h3>
5145  
5146  <p>The user can change the default catalog behaviour by redirecting queries
5147  to its own set of catalogs, this can be done by setting the
5148  <code>XML_CATALOG_FILES</code> environment variable to a list of catalogs, an
5149  empty one should deactivate loading the default <code>/etc/xml/catalog</code>
5150  default catalog</p>
5151  
5152  <h3><a name="validate">How to debug catalog processing:</a></h3>
5153  
5154  <p>Setting up the <code>XML_DEBUG_CATALOG</code> environment variable will
5155  make libxml2 output debugging information for each catalog operations, for
5156  example:</p>
5157  <pre>orchis:~/XML -&gt; xmllint --memory --noout test/ent2
5158  warning: failed to load external entity "title.xml"
5159  orchis:~/XML -&gt; export XML_DEBUG_CATALOG=
5160  orchis:~/XML -&gt; xmllint --memory --noout test/ent2
5161  Failed to parse catalog /etc/xml/catalog
5162  Failed to parse catalog /etc/xml/catalog
5163  warning: failed to load external entity "title.xml"
5164  Catalogs cleanup
5165  orchis:~/XML -&gt; </pre>
5166  
5167  <p>The test/ent2 references an entity, running the parser from memory makes
5168  the base URI unavailable and the the "title.xml" entity cannot be loaded.
5169  Setting up the debug environment variable allows to detect that an attempt is
5170  made to load the <code>/etc/xml/catalog</code> but since it's not present the
5171  resolution fails.</p>
5172  
5173  <p>But the most advanced way to debug XML catalog processing is to use the
5174  <strong>xmlcatalog</strong> command shipped with libxml2, it allows to load
5175  catalogs and make resolution queries to see what is going on. This is also
5176  used for the regression tests:</p>
5177  <pre>orchis:~/XML -&gt; ./xmlcatalog test/catalogs/docbook.xml \
5178                     "-//OASIS//DTD DocBook XML V4.1.2//EN"
5179  http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
5180  orchis:~/XML -&gt; </pre>
5181  
5182  <p>For debugging what is going on, adding one -v flags increase the verbosity
5183  level to indicate the processing done (adding a second flag also indicate
5184  what elements are recognized at parsing):</p>
5185  <pre>orchis:~/XML -&gt; ./xmlcatalog -v test/catalogs/docbook.xml \
5186                     "-//OASIS//DTD DocBook XML V4.1.2//EN"
5187  Parsing catalog test/catalogs/docbook.xml's content
5188  Found public match -//OASIS//DTD DocBook XML V4.1.2//EN
5189  http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
5190  Catalogs cleanup
5191  orchis:~/XML -&gt; </pre>
5192  
5193  <p>A shell interface is also available to debug and process multiple queries
5194  (and for regression tests):</p>
5195  <pre>orchis:~/XML -&gt; ./xmlcatalog -shell test/catalogs/docbook.xml \
5196                     "-//OASIS//DTD DocBook XML V4.1.2//EN"
5197  &gt; help   
5198  Commands available:
5199  public PublicID: make a PUBLIC identifier lookup
5200  system SystemID: make a SYSTEM identifier lookup
5201  resolve PublicID SystemID: do a full resolver lookup
5202  add 'type' 'orig' 'replace' : add an entry
5203  del 'values' : remove values
5204  dump: print the current catalog state
5205  debug: increase the verbosity level
5206  quiet: decrease the verbosity level
5207  exit:  quit the shell
5208  &gt; public "-//OASIS//DTD DocBook XML V4.1.2//EN"
5209  http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd
5210  &gt; quit
5211  orchis:~/XML -&gt; </pre>
5212  
5213  <p>This should be sufficient for most debugging purpose, this was actually
5214  used heavily to debug the XML Catalog implementation itself.</p>
5215  
5216  <h3><a name="Declaring">How to create and maintain</a> catalogs:</h3>
5217  
5218  <p>Basically XML Catalogs are XML files, you can either use XML tools to
5219  manage them or use  <strong>xmlcatalog</strong> for this. The basic step is
5220  to create a catalog the -create option provide this facility:</p>
5221  <pre>orchis:~/XML -&gt; ./xmlcatalog --create tst.xml
5222  &lt;?xml version="1.0"?&gt;
5223  &lt;!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
5224           "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"&gt;
5225  &lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/&gt;
5226  orchis:~/XML -&gt; </pre>
5227  
5228  <p>By default xmlcatalog does not overwrite the original catalog and save the
5229  result on the standard output, this can be overridden using the -noout
5230  option. The <code>-add</code> command allows to add entries in the
5231  catalog:</p>
5232  <pre>orchis:~/XML -&gt; ./xmlcatalog --noout --create --add "public" \
5233    "-//OASIS//DTD DocBook XML V4.1.2//EN" \
5234    http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd tst.xml
5235  orchis:~/XML -&gt; cat tst.xml
5236  &lt;?xml version="1.0"?&gt;
5237  &lt;!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" \
5238    "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"&gt;
5239  &lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"&gt;
5240  &lt;public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN"
5241          uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/&gt;
5242  &lt;/catalog&gt;
5243  orchis:~/XML -&gt; </pre>
5244  
5245  <p>The <code>-add</code> option will always take 3 parameters even if some of
5246  the XML Catalog constructs (like nextCatalog) will have only a single
5247  argument, just pass a third empty string, it will be ignored.</p>
5248  
5249  <p>Similarly the <code>-del</code> option remove matching entries from the
5250  catalog:</p>
5251  <pre>orchis:~/XML -&gt; ./xmlcatalog --del \
5252    "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" tst.xml
5253  &lt;?xml version="1.0"?&gt;
5254  &lt;!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
5255      "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"&gt;
5256  &lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/&gt;
5257  orchis:~/XML -&gt; </pre>
5258  
5259  <p>The catalog is now empty. Note that the matching of <code>-del</code> is
5260  exact and would have worked in a similar fashion with the Public ID
5261  string.</p>
5262  
5263  <p>This is rudimentary but should be sufficient to manage a not too complex
5264  catalog tree of resources.</p>
5265  
5266  <h3><a name="implemento">The implementor corner quick review of the
5267  API:</a></h3>
5268  
5269  <p>First, and like for every other module of libxml, there is an
5270  automatically generated <a href="html/libxml-catalog.html">API page for
5271  catalog support</a>.</p>
5272  
5273  <p>The header for the catalog interfaces should be included as:</p>
5274  <pre>#include &lt;libxml/catalog.h&gt;</pre>
5275  
5276  <p>The API is voluntarily kept very simple. First it is not obvious that
5277  applications really need access to it since it is the default behaviour of
5278  libxml2 (Note: it is possible to completely override libxml2 default catalog
5279  by using <a href="html/libxml-parser.html">xmlSetExternalEntityLoader</a> to
5280  plug an application specific resolver).</p>
5281  
5282  <p>Basically libxml2 support 2 catalog lists:</p>
5283  <ul>
5284    <li>the default one, global shared by all the application</li>
5285    <li>a per-document catalog, this one is built if the document uses the
5286      <code>oasis-xml-catalog</code> PIs to specify its own catalog list, it is
5287      associated to the parser context and destroyed when the parsing context
5288      is destroyed.</li>
5289  </ul>
5290  
5291  <p>the document one will be used first if it exists.</p>
5292  
5293  <h4>Initialization routines:</h4>
5294  
5295  <p>xmlInitializeCatalog(), xmlLoadCatalog() and xmlLoadCatalogs() should be
5296  used at startup to initialize the catalog, if the catalog should be
5297  initialized with specific values xmlLoadCatalog()  or xmlLoadCatalogs()
5298  should be called before xmlInitializeCatalog() which would otherwise do a
5299  default initialization first.</p>
5300  
5301  <p>The xmlCatalogAddLocal() call is used by the parser to grow the document
5302  own catalog list if needed.</p>
5303  
5304  <h4>Preferences setup:</h4>
5305  
5306  <p>The XML Catalog spec requires the possibility to select default
5307  preferences between  public and system delegation,
5308  xmlCatalogSetDefaultPrefer() allows this, xmlCatalogSetDefaults() and
5309  xmlCatalogGetDefaults() allow to control  if XML Catalogs resolution should
5310  be forbidden, allowed for global catalog, for document catalog or both, the
5311  default is to allow both.</p>
5312  
5313  <p>And of course xmlCatalogSetDebug() allows to generate debug messages
5314  (through the xmlGenericError() mechanism).</p>
5315  
5316  <h4>Querying routines:</h4>
5317  
5318  <p>xmlCatalogResolve(), xmlCatalogResolveSystem(), xmlCatalogResolvePublic()
5319  and xmlCatalogResolveURI() are relatively explicit if you read the XML
5320  Catalog specification they correspond to section 7 algorithms, they should
5321  also work if you have loaded an SGML catalog with a simplified semantic.</p>
5322  
5323  <p>xmlCatalogLocalResolve() and xmlCatalogLocalResolveURI() are the same but
5324  operate on the document catalog list</p>
5325  
5326  <h4>Cleanup and Miscellaneous:</h4>
5327  
5328  <p>xmlCatalogCleanup() free-up the global catalog, xmlCatalogFreeLocal() is
5329  the per-document equivalent.</p>
5330  
5331  <p>xmlCatalogAdd() and xmlCatalogRemove() are used to dynamically modify the
5332  first catalog in the global list, and xmlCatalogDump() allows to dump a
5333  catalog state, those routines are primarily designed for xmlcatalog, I'm not
5334  sure that exposing more complex interfaces (like navigation ones) would be
5335  really useful.</p>
5336  
5337  <p>The xmlParseCatalogFile() is a function used to load XML Catalog files,
5338  it's similar as xmlParseFile() except it bypass all catalog lookups, it's
5339  provided because this functionality may be useful for client tools.</p>
5340  
5341  <h4>threaded environments:</h4>
5342  
5343  <p>Since the catalog tree is built progressively, some care has been taken to
5344  try to avoid troubles in multithreaded environments. The code is now thread
5345  safe assuming that the libxml2 library has been compiled with threads
5346  support.</p>
5347  
5348  <p></p>
5349  
5350  <h3><a name="Other">Other resources</a></h3>
5351  
5352  <p>The XML Catalog specification is relatively recent so there isn't much
5353  literature to point at:</p>
5354  <ul>
5355    <li>You can find a good rant from Norm Walsh about <a
5356      href="http://www.arbortext.com/Think_Tank/XML_Resources/Issue_Three/issue_three.html">the
5357      need for catalogs</a>, it provides a lot of context information even if
5358      I don't agree with everything presented. Norm also wrote a more recent
5359      article <a
5360      href="http://wwws.sun.com/software/xml/developers/resolver/article/">XML
5361      entities and URI resolvers</a> describing them.</li>
5362    <li>An <a href="http://home.ccil.org/~cowan/XML/XCatalog.html">old XML
5363      catalog proposal</a> from John Cowan</li>
5364    <li>The <a href="http://www.rddl.org/">Resource Directory Description
5365      Language</a> (RDDL) another catalog system but more oriented toward
5366      providing metadata for XML namespaces.</li>
5367    <li>the page from the OASIS Technical <a
5368      href="http://www.oasis-open.org/committees/entity/">Committee on Entity
5369      Resolution</a> who maintains XML Catalog, you will find pointers to the
5370      specification update, some background and pointers to others tools
5371      providing XML Catalog support</li>
5372    <li>There is a <a href="buildDocBookCatalog">shell script</a> to generate
5373      XML Catalogs for DocBook 4.1.2 . If it can write to the /etc/xml/
5374      directory, it will set-up /etc/xml/catalog and /etc/xml/docbook based on
5375      the resources found on the system. Otherwise it will just create
5376      ~/xmlcatalog and ~/dbkxmlcatalog and doing:
5377      <p><code>export XML_CATALOG_FILES=$HOME/xmlcatalog</code></p>
5378      <p>should allow to process DocBook documentations without requiring
5379      network accesses for the DTD or stylesheets</p>
5380    </li>
5381    <li>I have uploaded <a href="ftp://xmlsoft.org/libxml2/test/dbk412catalog.tar.gz">a
5382      small tarball</a> containing XML Catalogs for DocBook 4.1.2 which seems
5383      to work fine for me too</li>
5384    <li>The <a href="http://www.xmlsoft.org/xmlcatalog_man.html">xmlcatalog
5385      manual page</a></li>
5386  </ul>
5387  
5388  <p>If you have suggestions for corrections or additions, simply contact
5389  me:</p>
5390  
5391  <h2><a name="library">The parser interfaces</a></h2>
5392  
5393  <p>This section is directly intended to help programmers getting bootstrapped
5394  using the XML tollkit from the C language. It is not intended to be
5395  extensive. I hope the automatically generated documents will provide the
5396  completeness required, but as a separate set of documents. The interfaces of
5397  the XML parser are by principle low level, Those interested in a higher level
5398  API should <a href="#DOM">look at DOM</a>.</p>
5399  
5400  <p>The <a href="html/libxml-parser.html">parser interfaces for XML</a> are
5401  separated from the <a href="html/libxml-htmlparser.html">HTML parser
5402  interfaces</a>.  Let's have a look at how the XML parser can be called:</p>
5403  
5404  <h3><a name="Invoking">Invoking the parser : the pull method</a></h3>
5405  
5406  <p>Usually, the first thing to do is to read an XML input. The parser accepts
5407  documents either from in-memory strings or from files.  The functions are
5408  defined in "parser.h":</p>
5409  <dl>
5410    <dt><code>xmlDocPtr xmlParseMemory(char *buffer, int size);</code></dt>
5411      <dd><p>Parse a null-terminated string containing the document.</p>
5412      </dd>
5413  </dl>
5414  <dl>
5415    <dt><code>xmlDocPtr xmlParseFile(const char *filename);</code></dt>
5416      <dd><p>Parse an XML document contained in a (possibly compressed)
5417        file.</p>
5418      </dd>
5419  </dl>
5420  
5421  <p>The parser returns a pointer to the document structure (or NULL in case of
5422  failure).</p>
5423  
5424  <h3 id="Invoking1">Invoking the parser: the push method</h3>
5425  
5426  <p>In order for the application to keep the control when the document is
5427  being fetched (which is common for GUI based programs) libxml2 provides a
5428  push interface, too, as of version 1.8.3. Here are the interface
5429  functions:</p>
5430  <pre>xmlParserCtxtPtr xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax,
5431                                           void *user_data,
5432                                           const char *chunk,
5433                                           int size,
5434                                           const char *filename);
5435  int              xmlParseChunk          (xmlParserCtxtPtr ctxt,
5436                                           const char *chunk,
5437                                           int size,
5438                                           int terminate);</pre>
5439  
5440  <p>and here is a simple example showing how to use the interface:</p>
5441  <pre>            FILE *f;
5442  
5443              f = fopen(filename, "r");
5444              if (f != NULL) {
5445                  int res, size = 1024;
5446                  char chars[1024];
5447                  xmlParserCtxtPtr ctxt;
5448  
5449                  res = fread(chars, 1, 4, f);
5450                  if (res &gt; 0) {
5451                      ctxt = xmlCreatePushParserCtxt(NULL, NULL,
5452                                  chars, res, filename);
5453                      while ((res = fread(chars, 1, size, f)) &gt; 0) {
5454                          xmlParseChunk(ctxt, chars, res, 0);
5455                      }
5456                      xmlParseChunk(ctxt, chars, 0, 1);
5457                      doc = ctxt-&gt;myDoc;
5458                      xmlFreeParserCtxt(ctxt);
5459                  }
5460              }</pre>
5461  
5462  <p>The HTML parser embedded into libxml2 also has a push interface; the
5463  functions are just prefixed by "html" rather than "xml".</p>
5464  
5465  <h3 id="Invoking2">Invoking the parser: the SAX interface</h3>
5466  
5467  <p>The tree-building interface makes the parser memory-hungry, first loading
5468  the document in memory and then building the tree itself. Reading a document
5469  without building the tree is possible using the SAX interfaces (see SAX.h and
5470  <a href="http://www.daa.com.au/~james/gnome/xml-sax/xml-sax.html">James
5471  Henstridge's documentation</a>). Note also that the push interface can be
5472  limited to SAX: just use the two first arguments of
5473  <code>xmlCreatePushParserCtxt()</code>.</p>
5474  
5475  <h3><a name="Building">Building a tree from scratch</a></h3>
5476  
5477  <p>The other way to get an XML tree in memory is by building it. Basically
5478  there is a set of functions dedicated to building new elements. (These are
5479  also described in &lt;libxml/tree.h&gt;.) For example, here is a piece of
5480  code that produces the XML document used in the previous examples:</p>
5481  <pre>    #include &lt;libxml/tree.h&gt;
5482      xmlDocPtr doc;
5483      xmlNodePtr tree, subtree;
5484  
5485      doc = xmlNewDoc("1.0");
5486      doc-&gt;children = xmlNewDocNode(doc, NULL, "EXAMPLE", NULL);
5487      xmlSetProp(doc-&gt;children, "prop1", "gnome is great");
5488      xmlSetProp(doc-&gt;children, "prop2", "&amp; linux too");
5489      tree = xmlNewChild(doc-&gt;children, NULL, "head", NULL);
5490      subtree = xmlNewChild(tree, NULL, "title", "Welcome to Gnome");
5491      tree = xmlNewChild(doc-&gt;children, NULL, "chapter", NULL);
5492      subtree = xmlNewChild(tree, NULL, "title", "The Linux adventure");
5493      subtree = xmlNewChild(tree, NULL, "p", "bla bla bla ...");
5494      subtree = xmlNewChild(tree, NULL, "image", NULL);
5495      xmlSetProp(subtree, "href", "linus.gif");</pre>
5496  
5497  <p>Not really rocket science ...</p>
5498  
5499  <h3><a name="Traversing">Traversing the tree</a></h3>
5500  
5501  <p>Basically by <a href="html/libxml-tree.html">including "tree.h"</a> your
5502  code has access to the internal structure of all the elements of the tree.
5503  The names should be somewhat simple like <strong>parent</strong>,
5504  <strong>children</strong>, <strong>next</strong>, <strong>prev</strong>,
5505  <strong>properties</strong>, etc... For example, still with the previous
5506  example:</p>
5507  <pre><code>doc-&gt;children-&gt;children-&gt;children</code></pre>
5508  
5509  <p>points to the title element,</p>
5510  <pre>doc-&gt;children-&gt;children-&gt;next-&gt;children-&gt;children</pre>
5511  
5512  <p>points to the text node containing the chapter title "The Linux
5513  adventure".</p>
5514  
5515  <p><strong>NOTE</strong>: XML allows <em>PI</em>s and <em>comments</em> to be
5516  present before the document root, so <code>doc-&gt;children</code> may point
5517  to an element which is not the document Root Element; a function
5518  <code>xmlDocGetRootElement()</code> was added for this purpose.</p>
5519  
5520  <h3><a name="Modifying">Modifying the tree</a></h3>
5521  
5522  <p>Functions are provided for reading and writing the document content. Here
5523  is an excerpt from the <a href="html/libxml-tree.html">tree API</a>:</p>
5524  <dl>
5525    <dt><code>xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar *name, const
5526    xmlChar *value);</code></dt>
5527      <dd><p>This sets (or changes) an attribute carried by an ELEMENT node.
5528        The value can be NULL.</p>
5529      </dd>
5530  </dl>
5531  <dl>
5532    <dt><code>const xmlChar *xmlGetProp(xmlNodePtr node, const xmlChar
5533    *name);</code></dt>
5534      <dd><p>This function returns a pointer to new copy of the property
5535        content. Note that the user must deallocate the result.</p>
5536      </dd>
5537  </dl>
5538  
5539  <p>Two functions are provided for reading and writing the text associated
5540  with elements:</p>
5541  <dl>
5542    <dt><code>xmlNodePtr xmlStringGetNodeList(xmlDocPtr doc, const xmlChar
5543    *value);</code></dt>
5544      <dd><p>This function takes an "external" string and converts it to one
5545        text node or possibly to a list of entity and text nodes. All
5546        non-predefined entity references like &amp;Gnome; will be stored
5547        internally as entity nodes, hence the result of the function may not be
5548        a single node.</p>
5549      </dd>
5550  </dl>
5551  <dl>
5552    <dt><code>xmlChar *xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int
5553    inLine);</code></dt>
5554      <dd><p>This function is the inverse of
5555        <code>xmlStringGetNodeList()</code>. It generates a new string
5556        containing the content of the text and entity nodes. Note the extra
5557        argument inLine. If this argument is set to 1, the function will expand
5558        entity references.  For example, instead of returning the &amp;Gnome;
5559        XML encoding in the string, it will substitute it with its value (say,
5560        "GNU Network Object Model Environment").</p>
5561      </dd>
5562  </dl>
5563  
5564  <h3><a name="Saving">Saving a tree</a></h3>
5565  
5566  <p>Basically 3 options are possible:</p>
5567  <dl>
5568    <dt><code>void xmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int
5569    *size);</code></dt>
5570      <dd><p>Returns a buffer into which the document has been saved.</p>
5571      </dd>
5572  </dl>
5573  <dl>
5574    <dt><code>extern void xmlDocDump(FILE *f, xmlDocPtr doc);</code></dt>
5575      <dd><p>Dumps a document to an open file descriptor.</p>
5576      </dd>
5577  </dl>
5578  <dl>
5579    <dt><code>int xmlSaveFile(const char *filename, xmlDocPtr cur);</code></dt>
5580      <dd><p>Saves the document to a file. In this case, the compression
5581        interface is triggered if it has been turned on.</p>
5582      </dd>
5583  </dl>
5584  
5585  <h3><a name="Compressio">Compression</a></h3>
5586  
5587  <p>The library transparently handles compression when doing file-based
5588  accesses. The level of compression on saves can be turned on either globally
5589  or individually for one file:</p>
5590  <dl>
5591    <dt><code>int  xmlGetDocCompressMode (xmlDocPtr doc);</code></dt>
5592      <dd><p>Gets the document compression ratio (0-9).</p>
5593      </dd>
5594  </dl>
5595  <dl>
5596    <dt><code>void xmlSetDocCompressMode (xmlDocPtr doc, int mode);</code></dt>
5597      <dd><p>Sets the document compression ratio.</p>
5598      </dd>
5599  </dl>
5600  <dl>
5601    <dt><code>int  xmlGetCompressMode(void);</code></dt>
5602      <dd><p>Gets the default compression ratio.</p>
5603      </dd>
5604  </dl>
5605  <dl>
5606    <dt><code>void xmlSetCompressMode(int mode);</code></dt>
5607      <dd><p>Sets the default compression ratio.</p>
5608      </dd>
5609  </dl>
5610  
5611  <h2><a name="Entities">Entities or no entities</a></h2>
5612  
5613  <p>Entities in principle are similar to simple C macros. An entity defines an
5614  abbreviation for a given string that you can reuse many times throughout the
5615  content of your document. Entities are especially useful when a given string
5616  may occur frequently within a document, or to confine the change needed to a
5617  document to a restricted area in the internal subset of the document (at the
5618  beginning). Example:</p>
5619  <pre>1 &lt;?xml version="1.0"?&gt;
5620  2 &lt;!DOCTYPE EXAMPLE SYSTEM "example.dtd" [
5621  3 &lt;!ENTITY xml "Extensible Markup Language"&gt;
5622  4 ]&gt;
5623  5 &lt;EXAMPLE&gt;
5624  6    &amp;xml;
5625  7 &lt;/EXAMPLE&gt;</pre>
5626  
5627  <p>Line 3 declares the xml entity. Line 6 uses the xml entity, by prefixing
5628  its name with '&amp;' and following it by ';' without any spaces added. There
5629  are 5 predefined entities in libxml2 allowing you to escape characters with
5630  predefined meaning in some parts of the xml document content:
5631  <strong>&amp;lt;</strong> for the character '&lt;', <strong>&amp;gt;</strong>
5632  for the character '&gt;',  <strong>&amp;apos;</strong> for the character ''',
5633  <strong>&amp;quot;</strong> for the character '"', and
5634  <strong>&amp;amp;</strong> for the character '&amp;'.</p>
5635  
5636  <p>One of the problems related to entities is that you may want the parser to
5637  substitute an entity's content so that you can see the replacement text in
5638  your application. Or you may prefer to keep entity references as such in the
5639  content to be able to save the document back without losing this usually
5640  precious information (if the user went through the pain of explicitly
5641  defining entities, he may have a a rather negative attitude if you blindly
5642  substitute them as saving time). The <a
5643  href="html/libxml-parser.html#xmlSubstituteEntitiesDefault">xmlSubstituteEntitiesDefault()</a>
5644  function allows you to check and change the behaviour, which is to not
5645  substitute entities by default.</p>
5646  
5647  <p>Here is the DOM tree built by libxml2 for the previous document in the
5648  default case:</p>
5649  <pre>/gnome/src/gnome-xml -&gt; ./xmllint --debug test/ent1
5650  DOCUMENT
5651  version=1.0
5652     ELEMENT EXAMPLE
5653       TEXT
5654       content=
5655       ENTITY_REF
5656         INTERNAL_GENERAL_ENTITY xml
5657         content=Extensible Markup Language
5658       TEXT
5659       content=</pre>
5660  
5661  <p>And here is the result when substituting entities:</p>
5662  <pre>/gnome/src/gnome-xml -&gt; ./tester --debug --noent test/ent1
5663  DOCUMENT
5664  version=1.0
5665     ELEMENT EXAMPLE
5666       TEXT
5667       content=     Extensible Markup Language</pre>
5668  
5669  <p>So, entities or no entities? Basically, it depends on your use case. I
5670  suggest that you keep the non-substituting default behaviour and avoid using
5671  entities in your XML document or data if you are not willing to handle the
5672  entity references elements in the DOM tree.</p>
5673  
5674  <p>Note that at save time libxml2 enforces the conversion of the predefined
5675  entities where necessary to prevent well-formedness problems, and will also
5676  transparently replace those with chars (i.e. it will not generate entity
5677  reference elements in the DOM tree or call the reference() SAX callback when
5678  finding them in the input).</p>
5679  
5680  <p><span style="background-color: #FF0000">WARNING</span>: handling entities
5681  on top of the libxml2 SAX interface is difficult!!! If you plan to use
5682  non-predefined entities in your documents, then the learning curve to handle
5683  then using the SAX API may be long. If you plan to use complex documents, I
5684  strongly suggest you consider using the DOM interface instead and let libxml
5685  deal with the complexity rather than trying to do it yourself.</p>
5686  
5687  <h2><a name="Namespaces">Namespaces</a></h2>
5688  
5689  <p>The libxml2 library implements <a
5690  href="http://www.w3.org/TR/REC-xml-names/">XML namespaces</a> support by
5691  recognizing namespace constructs in the input, and does namespace lookup
5692  automatically when building the DOM tree. A namespace declaration is
5693  associated with an in-memory structure and all elements or attributes within
5694  that namespace point to it. Hence testing the namespace is a simple and fast
5695  equality operation at the user level.</p>
5696  
5697  <p>I suggest that people using libxml2 use a namespace, and declare it in the
5698  root element of their document as the default namespace. Then they don't need
5699  to use the prefix in the content but we will have a basis for future semantic
5700  refinement and  merging of data from different sources. This doesn't increase
5701  the size of the XML output significantly, but significantly increases its
5702  value in the long-term. Example:</p>
5703  <pre>&lt;mydoc xmlns="http://mydoc.example.org/schemas/"&gt;
5704     &lt;elem1&gt;...&lt;/elem1&gt;
5705     &lt;elem2&gt;...&lt;/elem2&gt;
5706  &lt;/mydoc&gt;</pre>
5707  
5708  <p>The namespace value has to be an absolute URL, but the URL doesn't have to
5709  point to any existing resource on the Web. It will bind all the element and
5710  attributes with that URL. I suggest to use an URL within a domain you
5711  control, and that the URL should contain some kind of version information if
5712  possible. For example, <code>"http://www.gnome.org/gnumeric/1.0/"</code> is a
5713  good namespace scheme.</p>
5714  
5715  <p>Then when you load a file, make sure that a namespace carrying the
5716  version-independent prefix is installed on the root element of your document,
5717  and if the version information don't match something you know, warn the user
5718  and be liberal in what you accept as the input. Also do *not* try to base
5719  namespace checking on the prefix value. &lt;foo:text&gt; may be exactly the
5720  same as &lt;bar:text&gt; in another document. What really matters is the URI
5721  associated with the element or the attribute, not the prefix string (which is
5722  just a shortcut for the full URI). In libxml, element and attributes have an
5723  <code>ns</code> field pointing to an xmlNs structure detailing the namespace
5724  prefix and its URI.</p>
5725  
5726  <p>@@Interfaces@@</p>
5727  <pre>xmlNodePtr node;
5728  if(!strncmp(node-&gt;name,"mytag",5)
5729    &amp;&amp; node-&gt;ns
5730    &amp;&amp; !strcmp(node-&gt;ns-&gt;href,"http://www.mysite.com/myns/1.0")) {
5731    ...
5732  }</pre>
5733  
5734  <p>Usually people object to using namespaces together with validity checking.
5735  I will try to make sure that using namespaces won't break validity checking,
5736  so even if you plan to use or currently are using validation I strongly
5737  suggest adding namespaces to your document. A default namespace scheme
5738  <code>xmlns="http://...."</code> should not break validity even on less
5739  flexible parsers. Using namespaces to mix and differentiate content coming
5740  from multiple DTDs will certainly break current validation schemes. To check
5741  such documents one needs to use schema-validation, which is supported in
5742  libxml2 as well. See <a href="http://www.relaxng.org/">relagx-ng</a> and <a
5743  href="http://www.w3c.org/XML/Schema">w3c-schema</a>.</p>
5744  
5745  <h2><a name="Upgrading">Upgrading 1.x code</a></h2>
5746  
5747  <p>Incompatible changes:</p>
5748  
5749  <p>Version 2 of libxml2 is the first version introducing serious backward
5750  incompatible changes. The main goals were:</p>
5751  <ul>
5752    <li>a general cleanup. A number of mistakes inherited from the very early
5753      versions couldn't be changed due to compatibility constraints. Example
5754      the "childs" element in the nodes.</li>
5755    <li>Uniformization of the various nodes, at least for their header and link
5756      parts (doc, parent, children, prev, next), the goal is a simpler
5757      programming model and simplifying the task of the DOM implementors.</li>
5758    <li>better conformances to the XML specification, for example version 1.x
5759      had an heuristic to try to detect ignorable white spaces. As a result the
5760      SAX event generated were ignorableWhitespace() while the spec requires
5761      character() in that case. This also mean that a number of DOM node
5762      containing blank text may populate the DOM tree which were not present
5763      before.</li>
5764  </ul>
5765  
5766  <h3>How to fix libxml-1.x code:</h3>
5767  
5768  <p>So client code of libxml designed to run with version 1.x may have to be
5769  changed to compile against version 2.x of libxml. Here is a list of changes
5770  that I have collected, they may not be sufficient, so in case you find other
5771  change which are required, <a href="mailto:Daniel.Veillard@w3.org">drop me a
5772  mail</a>:</p>
5773  <ol>
5774    <li>The package name have changed from libxml to libxml2, the library name
5775      is now -lxml2 . There is a new xml2-config script which should be used to
5776      select the right parameters libxml2</li>
5777    <li>Node <strong>childs</strong> field has been renamed
5778      <strong>children</strong> so s/childs/children/g should be  applied
5779      (probability of having "childs" anywhere else is close to 0+</li>
5780    <li>The document don't have anymore a <strong>root</strong> element it has
5781      been replaced by <strong>children</strong> and usually you will get a
5782      list of element here. For example a Dtd element for the internal subset
5783      and it's declaration may be found in that list, as well as processing
5784      instructions or comments found before or after the document root element.
5785      Use <strong>xmlDocGetRootElement(doc)</strong> to get the root element of
5786      a document. Alternatively if you are sure to not reference DTDs nor have
5787      PIs or comments before or after the root element
5788      s/-&gt;root/-&gt;children/g will probably do it.</li>
5789    <li>The white space issue, this one is more complex, unless special case of
5790      validating parsing, the line breaks and spaces usually used for indenting
5791      and formatting the document content becomes significant. So they are
5792      reported by SAX and if your using the DOM tree, corresponding nodes are
5793      generated. Too approach can be taken:
5794      <ol>
5795        <li>lazy one, use the compatibility call
5796          <strong>xmlKeepBlanksDefault(0)</strong> but be aware that you are
5797          relying on a special (and possibly broken) set of heuristics of
5798          libxml to detect ignorable blanks. Don't complain if it breaks or
5799          make your application not 100% clean w.r.t. to it's input.</li>
5800        <li>the Right Way: change you code to accept possibly insignificant
5801          blanks characters, or have your tree populated with weird blank text
5802          nodes. You can spot them using the commodity function
5803          <strong>xmlIsBlankNode(node)</strong> returning 1 for such blank
5804          nodes.</li>
5805      </ol>
5806      <p>Note also that with the new default the output functions don't add any
5807      extra indentation when saving a tree in order to be able to round trip
5808      (read and save) without inflating the document with extra formatting
5809      chars.</p>
5810    </li>
5811    <li>The include path has changed to $prefix/libxml/ and the includes
5812      themselves uses this new prefix in includes instructions... If you are
5813      using (as expected) the
5814      <pre>xml2-config --cflags</pre>
5815      <p>output to generate you compile commands this will probably work out of
5816      the box</p>
5817    </li>
5818    <li>xmlDetectCharEncoding takes an extra argument indicating the length in
5819      byte of the head of the document available for character detection.</li>
5820  </ol>
5821  
5822  <h3>Ensuring both libxml-1.x and libxml-2.x compatibility</h3>
5823  
5824  <p>Two new version of libxml (1.8.11) and libxml2 (2.3.4) have been released
5825  to allow smooth upgrade of existing libxml v1code while retaining
5826  compatibility. They offers the following:</p>
5827  <ol>
5828    <li>similar include naming, one should use
5829      <strong>#include&lt;libxml/...&gt;</strong> in both cases.</li>
5830    <li>similar identifiers defined via macros for the child and root fields:
5831      respectively <strong>xmlChildrenNode</strong> and
5832      <strong>xmlRootNode</strong></li>
5833    <li>a new macro <strong>LIBXML_TEST_VERSION</strong> which should be
5834      inserted once in the client code</li>
5835  </ol>
5836  
5837  <p>So the roadmap to upgrade your existing libxml applications is the
5838  following:</p>
5839  <ol>
5840    <li>install the  libxml-1.8.8 (and libxml-devel-1.8.8) packages</li>
5841    <li>find all occurrences where the xmlDoc <strong>root</strong> field is
5842      used and change it to <strong>xmlRootNode</strong></li>
5843    <li>similarly find all occurrences where the xmlNode
5844      <strong>childs</strong> field is used and change it to
5845      <strong>xmlChildrenNode</strong></li>
5846    <li>add a <strong>LIBXML_TEST_VERSION</strong> macro somewhere in your
5847      <strong>main()</strong> or in the library init entry point</li>
5848    <li>Recompile, check compatibility, it should still work</li>
5849    <li>Change your configure script to look first for xml2-config and fall
5850      back using xml-config . Use the --cflags and --libs output of the command
5851      as the Include and Linking parameters needed to use libxml.</li>
5852    <li>install libxml2-2.3.x and  libxml2-devel-2.3.x (libxml-1.8.y and
5853      libxml-devel-1.8.y can be kept simultaneously)</li>
5854    <li>remove your config.cache, relaunch your configuration mechanism, and
5855      recompile, if steps 2 and 3 were done right it should compile as-is</li>
5856    <li>Test that your application is still running correctly, if not this may
5857      be due to extra empty nodes due to formating spaces being kept in libxml2
5858      contrary to libxml1, in that case insert xmlKeepBlanksDefault(1) in your
5859      code before calling the parser (next to
5860      <strong>LIBXML_TEST_VERSION</strong> is a fine place).</li>
5861  </ol>
5862  
5863  <p>Following those steps should work. It worked for some of my own code.</p>
5864  
5865  <p>Let me put some emphasis on the fact that there is far more changes from
5866  libxml 1.x to 2.x than the ones you may have to patch for. The overall code
5867  has been considerably cleaned up and the conformance to the XML specification
5868  has been drastically improved too. Don't take those changes as an excuse to
5869  not upgrade, it may cost a lot on the long term ...</p>
5870  
5871  <h2><a name="Thread">Thread safety</a></h2>
5872  
5873  <p>Starting with 2.4.7, libxml2 makes provisions to ensure that concurrent
5874  threads can safely work in parallel parsing different documents. There is
5875  however a couple of things to do to ensure it:</p>
5876  <ul>
5877    <li>configure the library accordingly using the --with-threads options</li>
5878    <li>call xmlInitParser() in the "main" thread before using any of the
5879      libxml2 API (except possibly selecting a different memory allocator)</li>
5880  </ul>
5881  
5882  <p>Note that the thread safety cannot be ensured for multiple threads sharing
5883  the same document, the locking must be done at the application level, libxml
5884  exports a basic mutex and reentrant mutexes API in &lt;libxml/threads.h&gt;.
5885  The parts of the library checked for thread safety are:</p>
5886  <ul>
5887    <li>concurrent loading</li>
5888    <li>file access resolution</li>
5889    <li>catalog access</li>
5890    <li>catalog building</li>
5891    <li>entities lookup/accesses</li>
5892    <li>validation</li>
5893    <li>global variables per-thread override</li>
5894    <li>memory handling</li>
5895  </ul>
5896  
5897  <p>XPath has been tested for threaded usage on non-modified document
5898     for example when using libxslt, but make 100% sure the documents
5899     are accessed read-only !</p>
5900  
5901  <h2><a name="DOM"></a><a name="Principles">DOM Principles</a></h2>
5902  
5903  <p><a href="http://www.w3.org/DOM/">DOM</a> stands for the <em>Document
5904  Object Model</em>; this is an API for accessing XML or HTML structured
5905  documents. Native support for DOM in Gnome is on the way (module gnome-dom),
5906  and will be based on gnome-xml. This will be a far cleaner interface to
5907  manipulate XML files within Gnome since it won't expose the internal
5908  structure.</p>
5909  
5910  <p>The current DOM implementation on top of libxml2 is the <a
5911  href="http://svn.gnome.org/viewvc/gdome2/trunk/">gdome2 Gnome module</a>, this
5912  is a full DOM interface, thanks to Paolo Casarini, check the <a
5913  href="http://gdome2.cs.unibo.it/">Gdome2 homepage</a> for more
5914  information.</p>
5915  
5916  <h2><a name="Example"></a><a name="real">A real example</a></h2>
5917  
5918  <p>Here is a real size example, where the actual content of the application
5919  data is not kept in the DOM tree but uses internal structures. It is based on
5920  a proposal to keep a database of jobs related to Gnome, with an XML based
5921  storage structure. Here is an <a href="gjobs.xml">XML encoded jobs
5922  base</a>:</p>
5923  <pre>&lt;?xml version="1.0"?&gt;
5924  &lt;gjob:Helping xmlns:gjob="http://www.gnome.org/some-location"&gt;
5925    &lt;gjob:Jobs&gt;
5926  
5927      &lt;gjob:Job&gt;
5928        &lt;gjob:Project ID="3"/&gt;
5929        &lt;gjob:Application&gt;GBackup&lt;/gjob:Application&gt;
5930        &lt;gjob:Category&gt;Development&lt;/gjob:Category&gt;
5931  
5932        &lt;gjob:Update&gt;
5933          &lt;gjob:Status&gt;Open&lt;/gjob:Status&gt;
5934          &lt;gjob:Modified&gt;Mon, 07 Jun 1999 20:27:45 -0400 MET DST&lt;/gjob:Modified&gt;
5935          &lt;gjob:Salary&gt;USD 0.00&lt;/gjob:Salary&gt;
5936        &lt;/gjob:Update&gt;
5937  
5938        &lt;gjob:Developers&gt;
5939          &lt;gjob:Developer&gt;
5940          &lt;/gjob:Developer&gt;
5941        &lt;/gjob:Developers&gt;
5942  
5943        &lt;gjob:Contact&gt;
5944          &lt;gjob:Person&gt;Nathan Clemons&lt;/gjob:Person&gt;
5945          &lt;gjob:Email&gt;nathan@windsofstorm.net&lt;/gjob:Email&gt;
5946          &lt;gjob:Company&gt;
5947          &lt;/gjob:Company&gt;
5948          &lt;gjob:Organisation&gt;
5949          &lt;/gjob:Organisation&gt;
5950          &lt;gjob:Webpage&gt;
5951          &lt;/gjob:Webpage&gt;
5952          &lt;gjob:Snailmail&gt;
5953          &lt;/gjob:Snailmail&gt;
5954          &lt;gjob:Phone&gt;
5955          &lt;/gjob:Phone&gt;
5956        &lt;/gjob:Contact&gt;
5957  
5958        &lt;gjob:Requirements&gt;
5959        The program should be released as free software, under the GPL.
5960        &lt;/gjob:Requirements&gt;
5961  
5962        &lt;gjob:Skills&gt;
5963        &lt;/gjob:Skills&gt;
5964  
5965        &lt;gjob:Details&gt;
5966        A GNOME based system that will allow a superuser to configure 
5967        compressed and uncompressed files and/or file systems to be backed 
5968        up with a supported media in the system.  This should be able to 
5969        perform via find commands generating a list of files that are passed 
5970        to tar, dd, cpio, cp, gzip, etc., to be directed to the tape machine 
5971        or via operations performed on the filesystem itself. Email 
5972        notification and GUI status display very important.
5973        &lt;/gjob:Details&gt;
5974  
5975      &lt;/gjob:Job&gt;
5976  
5977    &lt;/gjob:Jobs&gt;
5978  &lt;/gjob:Helping&gt;</pre>
5979  
5980  <p>While loading the XML file into an internal DOM tree is a matter of
5981  calling only a couple of functions, browsing the tree to gather the data and
5982  generate the internal structures is harder, and more error prone.</p>
5983  
5984  <p>The suggested principle is to be tolerant with respect to the input
5985  structure. For example, the ordering of the attributes is not significant,
5986  the XML specification is clear about it. It's also usually a good idea not to
5987  depend on the order of the children of a given node, unless it really makes
5988  things harder. Here is some code to parse the information for a person:</p>
5989  <pre>/*
5990   * A person record
5991   */
5992  typedef struct person {
5993      char *name;
5994      char *email;
5995      char *company;
5996      char *organisation;
5997      char *smail;
5998      char *webPage;
5999      char *phone;
6000  } person, *personPtr;
6001  
6002  /*
6003   * And the code needed to parse it
6004   */
6005  personPtr parsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
6006      personPtr ret = NULL;
6007  
6008  DEBUG("parsePerson\n");
6009      /*
6010       * allocate the struct
6011       */
6012      ret = (personPtr) malloc(sizeof(person));
6013      if (ret == NULL) {
6014          fprintf(stderr,"out of memory\n");
6015          return(NULL);
6016      }
6017      memset(ret, 0, sizeof(person));
6018  
6019      /* We don't care what the top level element name is */
6020      cur = cur-&gt;xmlChildrenNode;
6021      while (cur != NULL) {
6022          if ((!strcmp(cur-&gt;name, "Person")) &amp;&amp; (cur-&gt;ns == ns))
6023              ret-&gt;name = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
6024          if ((!strcmp(cur-&gt;name, "Email")) &amp;&amp; (cur-&gt;ns == ns))
6025              ret-&gt;email = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
6026          cur = cur-&gt;next;
6027      }
6028  
6029      return(ret);
6030  }</pre>
6031  
6032  <p>Here are a couple of things to notice:</p>
6033  <ul>
6034    <li>Usually a recursive parsing style is the more convenient one: XML data
6035      is by nature subject to repetitive constructs and usually exhibits highly
6036      structured patterns.</li>
6037    <li>The two arguments of type <em>xmlDocPtr</em> and <em>xmlNsPtr</em>,
6038      i.e. the pointer to the global XML document and the namespace reserved to
6039      the application. Document wide information are needed for example to
6040      decode entities and it's a good coding practice to define a namespace for
6041      your application set of data and test that the element and attributes
6042      you're analyzing actually pertains to your application space. This is
6043      done by a simple equality test (cur-&gt;ns == ns).</li>
6044    <li>To retrieve text and attributes value, you can use the function
6045      <em>xmlNodeListGetString</em> to gather all the text and entity reference
6046      nodes generated by the DOM output and produce an single text string.</li>
6047  </ul>
6048  
6049  <p>Here is another piece of code used to parse another level of the
6050  structure:</p>
6051  <pre>#include &lt;libxml/tree.h&gt;
6052  /*
6053   * a Description for a Job
6054   */
6055  typedef struct job {
6056      char *projectID;
6057      char *application;
6058      char *category;
6059      personPtr contact;
6060      int nbDevelopers;
6061      personPtr developers[100]; /* using dynamic alloc is left as an exercise */
6062  } job, *jobPtr;
6063  
6064  /*
6065   * And the code needed to parse it
6066   */
6067  jobPtr parseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
6068      jobPtr ret = NULL;
6069  
6070  DEBUG("parseJob\n");
6071      /*
6072       * allocate the struct
6073       */
6074      ret = (jobPtr) malloc(sizeof(job));
6075      if (ret == NULL) {
6076          fprintf(stderr,"out of memory\n");
6077          return(NULL);
6078      }
6079      memset(ret, 0, sizeof(job));
6080  
6081      /* We don't care what the top level element name is */
6082      cur = cur-&gt;xmlChildrenNode;
6083      while (cur != NULL) {
6084          
6085          if ((!strcmp(cur-&gt;name, "Project")) &amp;&amp; (cur-&gt;ns == ns)) {
6086              ret-&gt;projectID = xmlGetProp(cur, "ID");
6087              if (ret-&gt;projectID == NULL) {
6088                  fprintf(stderr, "Project has no ID\n");
6089              }
6090          }
6091          if ((!strcmp(cur-&gt;name, "Application")) &amp;&amp; (cur-&gt;ns == ns))
6092              ret-&gt;application = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
6093          if ((!strcmp(cur-&gt;name, "Category")) &amp;&amp; (cur-&gt;ns == ns))
6094              ret-&gt;category = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
6095          if ((!strcmp(cur-&gt;name, "Contact")) &amp;&amp; (cur-&gt;ns == ns))
6096              ret-&gt;contact = parsePerson(doc, ns, cur);
6097          cur = cur-&gt;next;
6098      }
6099  
6100      return(ret);
6101  }</pre>
6102  
6103  <p>Once you are used to it, writing this kind of code is quite simple, but
6104  boring. Ultimately, it could be possible to write stubbers taking either C
6105  data structure definitions, a set of XML examples or an XML DTD and produce
6106  the code needed to import and export the content between C data and XML
6107  storage. This is left as an exercise to the reader :-)</p>
6108  
6109  <p>Feel free to use <a href="example/gjobread.c">the code for the full C
6110  parsing example</a> as a template, it is also available with Makefile in the
6111  Gnome SVN base under libxml2/example</p>
6112  
6113  <h2><a name="Contributi">Contributions</a></h2>
6114  <ul>
6115    <li>Bjorn Reese, William Brack and Thomas Broyer have provided a number of
6116      patches, Gary Pennington worked on the validation API, threading support
6117      and Solaris port.</li>
6118    <li>John Fleck helps maintaining the documentation and man pages.</li>
6119    <li><a href="mailto:igor@zlatkovic.com">Igor  Zlatkovic</a> is now the
6120      maintainer of the Windows port, <a
6121      href="http://www.zlatkovic.com/projects/libxml/index.html">he provides
6122      binaries</a></li>
6123    <li><a href="mailto:Gary.Pennington@sun.com">Gary Pennington</a> provides
6124      <a href="http://garypennington.net/libxml2/">Solaris binaries</a></li>
6125    <li><a
6126      href="http://mail.gnome.org/archives/xml/2001-March/msg00014.html">Matt
6127      Sergeant</a> developed <a
6128      href="http://axkit.org/download/">XML::LibXSLT</a>, a Perl wrapper for
6129      libxml2/libxslt as part of the <a href="http://axkit.com/">AxKit XML
6130      application server</a></li>
6131    <li><a href="mailto:fnatter@gmx.net">Felix Natter</a> and <a
6132      href="mailto:geertk@ai.rug.nl">Geert Kloosterman</a> provide <a
6133      href="libxml-doc.el">an emacs module</a> to lookup libxml(2) functions
6134      documentation</li>
6135    <li><a href="mailto:sherwin@nlm.nih.gov">Ziying Sherwin</a> provided <a
6136      href="http://xmlsoft.org/messages/0488.html">man pages</a></li>
6137    <li>there is a module for <a
6138      href="http://acs-misc.sourceforge.net/nsxml.html">libxml/libxslt support
6139      in OpenNSD/AOLServer</a></li>
6140    <li><a href="mailto:dkuhlman@cutter.rexx.com">Dave Kuhlman</a> provided the
6141      first version of libxml/libxslt <a
6142      href="http://www.rexx.com/~dkuhlman">wrappers for Python</a></li>
6143    <li>Petr Kozelka provides <a
6144      href="http://sourceforge.net/projects/libxml2-pas">Pascal units to glue
6145      libxml2</a> with Kylix and Delphi and other Pascal compilers</li>
6146    <li><a href="mailto:aleksey@aleksey.com">Aleksey Sanin</a> implemented the
6147      <a href="http://www.w3.org/Signature/">XML Canonicalization and XML
6148      Digital Signature</a> <a
6149      href="http://www.aleksey.com/xmlsec/">implementations for libxml2</a></li>
6150    <li><a href="mailto:Steve.Ball@explain.com.au">Steve Ball</a> and
6151      contributors maintain <a href="http://tclxml.sourceforge.net/">tcl
6152      bindings for libxml2 and libxslt</a>, as well as <a
6153      href="http://tclxml.sf.net/tkxmllint.html">tkxmllint</a> a GUI for
6154      xmllint and <a href="http://tclxml.sf.net/tkxsltproc.html">tkxsltproc</a>
6155      a GUI for xsltproc.</li>
6156  </ul>
6157  
6158  <p></p>
6159  </body>
6160  </html>