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