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