upgrade.html revision 61f6fb66add2c6a39e89cdeab466c8518bfa56ff
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> 2<html> 3<head> 4<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type"> 5<link rel="SHORTCUT ICON" href="/favicon.ico"> 6<style type="text/css"><!-- 7TD {font-family: Verdana,Arial,Helvetica} 8BODY {font-family: Verdana,Arial,Helvetica; margin-top: 2em; margin-left: 0em; margin-right: 0em} 9H1 {font-family: Verdana,Arial,Helvetica} 10H2 {font-family: Verdana,Arial,Helvetica} 11H3 {font-family: Verdana,Arial,Helvetica} 12A:link, A:visited, A:active { text-decoration: underline } 13--></style> 14<title>Upgrading 1.x code</title> 15</head> 16<body bgcolor="#8b7765" text="#000000" link="#000000" vlink="#000000"> 17<table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr> 18<td width="180"> 19<a href="http://www.gnome.org/"><img src="gnome2.png" alt="Gnome2 Logo"></a><a href="http://www.w3.org/Status"><img src="w3c.png" alt="W3C Logo"></a><a href="http://www.redhat.com/"><img src="redhat.gif" alt="Red Hat Logo"></a><div align="left"><a href="http://xmlsoft.org/"><img src="Libxml2-Logo-180x168.gif" alt="Made with Libxml2 Logo"></a></div> 20</td> 21<td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"> 22<h1>The XML C library for Gnome</h1> 23<h2>Upgrading 1.x code</h2> 24</td></tr></table></td></tr></table></td> 25</tr></table> 26<table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr> 27<td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td> 28<table width="100%" border="0" cellspacing="1" cellpadding="3"> 29<tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Main Menu</b></center></td></tr> 30<tr><td bgcolor="#fffacd"><ul> 31<li><a href="index.html">Home</a></li> 32<li><a href="intro.html">Introduction</a></li> 33<li><a href="FAQ.html">FAQ</a></li> 34<li><a href="docs.html">Documentation</a></li> 35<li><a href="bugs.html">Reporting bugs and getting help</a></li> 36<li><a href="help.html">How to help</a></li> 37<li><a href="downloads.html">Downloads</a></li> 38<li><a href="news.html">News</a></li> 39<li><a href="XMLinfo.html">XML</a></li> 40<li><a href="XSLT.html">XSLT</a></li> 41<li><a href="python.html">Python and bindings</a></li> 42<li><a href="architecture.html">libxml architecture</a></li> 43<li><a href="tree.html">The tree output</a></li> 44<li><a href="interface.html">The SAX interface</a></li> 45<li><a href="xmldtd.html">Validation & DTDs</a></li> 46<li><a href="xmlmem.html">Memory Management</a></li> 47<li><a href="encoding.html">Encodings support</a></li> 48<li><a href="xmlio.html">I/O Interfaces</a></li> 49<li><a href="catalog.html">Catalog support</a></li> 50<li><a href="library.html">The parser interfaces</a></li> 51<li><a href="entities.html">Entities or no entities</a></li> 52<li><a href="namespaces.html">Namespaces</a></li> 53<li><a href="upgrade.html">Upgrading 1.x code</a></li> 54<li><a href="threads.html">Thread safety</a></li> 55<li><a href="DOM.html">DOM Principles</a></li> 56<li><a href="example.html">A real example</a></li> 57<li><a href="contribs.html">Contributions</a></li> 58<li><a href="tutorial/index.html">Tutorial</a></li> 59<li> 60<a href="xml.html">flat page</a>, <a href="site.xsl">stylesheet</a> 61</li> 62</ul></td></tr> 63</table> 64<table width="100%" border="0" cellspacing="1" cellpadding="3"> 65<tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr> 66<tr><td bgcolor="#fffacd"> 67<form action="search.php" enctype="application/x-www-form-urlencoded" method="GET"> 68<input name="query" type="TEXT" size="20" value=""><input name="submit" type="submit" value="Search ..."> 69</form> 70<ul> 71<li><a href="APIchunk0.html">Alphabetic</a></li> 72<li><a href="APIconstructors.html">Constructors</a></li> 73<li><a href="APIfunctions.html">Functions/Types</a></li> 74<li><a href="APIfiles.html">Modules</a></li> 75<li><a href="APIsymbols.html">Symbols</a></li> 76</ul> 77</td></tr> 78</table> 79<table width="100%" border="0" cellspacing="1" cellpadding="3"> 80<tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr> 81<tr><td bgcolor="#fffacd"><ul> 82<li><a href="http://mail.gnome.org/archives/xml/">Mail archive</a></li> 83<li><a href="http://xmlsoft.org/XSLT/">XSLT libxslt</a></li> 84<li><a href="http://phd.cs.unibo.it/gdome2/">DOM gdome2</a></li> 85<li><a href="http://www.aleksey.com/xmlsec/">XML-DSig xmlsec</a></li> 86<li><a href="ftp://xmlsoft.org/">FTP</a></li> 87<li><a href="http://www.fh-frankfurt.de/~igor/projects/libxml/">Windows binaries</a></li> 88<li><a href="http://garypennington.net/libxml2/">Solaris binaries</a></li> 89<li><a href="http://www.zveno.com/open_source/libxml2xslt.html">MacOsX binaries</a></li> 90<li><a href="http://sourceforge.net/projects/libxml2-pas/">Pascal bindings</a></li> 91<li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxml&product=libxml2">Bug Tracker</a></li> 92</ul></td></tr> 93</table> 94</td></tr></table></td> 95<td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"> 96<p>Incompatible changes:</p> 97<p>Version 2 of libxml is the first version introducing serious backward 98incompatible changes. The main goals were:</p> 99<ul> 100<li>a general cleanup. A number of mistakes inherited from the very early 101 versions couldn't be changed due to compatibility constraints. Example 102 the "childs" element in the nodes.</li> 103 <li>Uniformization of the various nodes, at least for their header and link 104 parts (doc, parent, children, prev, next), the goal is a simpler 105 programming model and simplifying the task of the DOM implementors.</li> 106 <li>better conformances to the XML specification, for example version 1.x 107 had an heuristic to try to detect ignorable white spaces. As a result the 108 SAX event generated were ignorableWhitespace() while the spec requires 109 character() in that case. This also mean that a number of DOM node 110 containing blank text may populate the DOM tree which were not present 111 before.</li> 112</ul> 113<h3>How to fix libxml-1.x code:</h3> 114<p>So client code of libxml designed to run with version 1.x may have to be 115changed to compile against version 2.x of libxml. Here is a list of changes 116that I have collected, they may not be sufficient, so in case you find other 117change which are required, <a href="mailto:Daniel.%C3%8Feillardw3.org">drop me a 118mail</a>:</p> 119<ol> 120<li>The package name have changed from libxml to libxml2, the library name 121 is now -lxml2 . There is a new xml2-config script which should be used to 122 select the right parameters libxml2</li> 123 <li>Node <strong>childs</strong> field has been renamed 124 <strong>children</strong> so s/childs/children/g should be applied 125 (probability of having "childs" anywhere else is close to 0+</li> 126 <li>The document don't have anymore a <strong>root</strong> element it has 127 been replaced by <strong>children</strong> and usually you will get a 128 list of element here. For example a Dtd element for the internal subset 129 and it's declaration may be found in that list, as well as processing 130 instructions or comments found before or after the document root element. 131 Use <strong>xmlDocGetRootElement(doc)</strong> to get the root element of 132 a document. Alternatively if you are sure to not reference DTDs nor have 133 PIs or comments before or after the root element 134 s/->root/->children/g will probably do it.</li> 135 <li>The white space issue, this one is more complex, unless special case of 136 validating parsing, the line breaks and spaces usually used for indenting 137 and formatting the document content becomes significant. So they are 138 reported by SAX and if your using the DOM tree, corresponding nodes are 139 generated. Too approach can be taken: 140 <ol> 141<li>lazy one, use the compatibility call 142 <strong>xmlKeepBlanksDefault(0)</strong> but be aware that you are 143 relying on a special (and possibly broken) set of heuristics of 144 libxml to detect ignorable blanks. Don't complain if it breaks or 145 make your application not 100% clean w.r.t. to it's input.</li> 146 <li>the Right Way: change you code to accept possibly insignificant 147 blanks characters, or have your tree populated with weird blank text 148 nodes. You can spot them using the commodity function 149 <strong>xmlIsBlankNode(node)</strong> returning 1 for such blank 150 nodes.</li> 151 </ol> 152<p>Note also that with the new default the output functions don't add any 153 extra indentation when saving a tree in order to be able to round trip 154 (read and save) without inflating the document with extra formatting 155 chars.</p> 156 </li> 157 <li>The include path has changed to $prefix/libxml/ and the includes 158 themselves uses this new prefix in includes instructions... If you are 159 using (as expected) the 160 <pre>xml2-config --cflags</pre> 161 <p>output to generate you compile commands this will probably work out of 162 the box</p> 163 </li> 164 <li>xmlDetectCharEncoding takes an extra argument indicating the length in 165 byte of the head of the document available for character detection.</li> 166</ol> 167<h3>Ensuring both libxml-1.x and libxml-2.x compatibility</h3> 168<p>Two new version of libxml (1.8.11) and libxml2 (2.3.4) have been released 169to allow smooth upgrade of existing libxml v1code while retaining 170compatibility. They offers the following:</p> 171<ol> 172<li>similar include naming, one should use 173 <strong>#include<libxml/...></strong> in both cases.</li> 174 <li>similar identifiers defined via macros for the child and root fields: 175 respectively <strong>xmlChildrenNode</strong> and 176 <strong>xmlRootNode</strong> 177</li> 178 <li>a new macro <strong>LIBXML_TEST_VERSION</strong> which should be 179 inserted once in the client code</li> 180</ol> 181<p>So the roadmap to upgrade your existing libxml applications is the 182following:</p> 183<ol> 184<li>install the libxml-1.8.8 (and libxml-devel-1.8.8) packages</li> 185 <li>find all occurrences where the xmlDoc <strong>root</strong> field is 186 used and change it to <strong>xmlRootNode</strong> 187</li> 188 <li>similarly find all occurrences where the xmlNode 189 <strong>childs</strong> field is used and change it to 190 <strong>xmlChildrenNode</strong> 191</li> 192 <li>add a <strong>LIBXML_TEST_VERSION</strong> macro somewhere in your 193 <strong>main()</strong> or in the library init entry point</li> 194 <li>Recompile, check compatibility, it should still work</li> 195 <li>Change your configure script to look first for xml2-config and fall 196 back using xml-config . Use the --cflags and --libs output of the command 197 as the Include and Linking parameters needed to use libxml.</li> 198 <li>install libxml2-2.3.x and libxml2-devel-2.3.x (libxml-1.8.y and 199 libxml-devel-1.8.y can be kept simultaneously)</li> 200 <li>remove your config.cache, relaunch your configuration mechanism, and 201 recompile, if steps 2 and 3 were done right it should compile as-is</li> 202 <li>Test that your application is still running correctly, if not this may 203 be due to extra empty nodes due to formating spaces being kept in libxml2 204 contrary to libxml1, in that case insert xmlKeepBlanksDefault(1) in your 205 code before calling the parser (next to 206 <strong>LIBXML_TEST_VERSION</strong> is a fine place).</li> 207</ol> 208<p>Following those steps should work. It worked for some of my own code.</p> 209<p>Let me put some emphasis on the fact that there is far more changes from 210libxml 1.x to 2.x than the ones you may have to patch for. The overall code 211has been considerably cleaned up and the conformance to the XML specification 212has been drastically improved too. Don't take those changes as an excuse to 213not upgrade, it may cost a lot on the long term ...</p> 214<p><a href="bugs.html">Daniel Veillard</a></p> 215</td></tr></table></td></tr></table></td></tr></table></td> 216</tr></table></td></tr></table> 217</body> 218</html> 219