<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
                      "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
  <title>Libxml Frequently asqued Questions</title>
  <meta name="GENERATOR" content="amaya V2.1">
  <meta http-equiv="Content-Type" content="text/html">
</head>

<body bgcolor="#ffffff">
<h1 align="center">Libxml Frequently Asqued Questions</h1>

<p>Location: <a
href="http://xmlsoft.org/FAQ.html">http://xmlsoft.org/FAQ.html</a></p>

<p>Libxml home page: <a href="http://xmlsoft.org/">http://xmlsoft.org/</a></p>

<p>Mailing-list archive:  <a
href="http://xmlsoft.org/messages/">http://xmlsoft.org/messages/</a></p>

<p>Version: $Revision$</p>

<p>Table of Content:</p>
<ul>
  <li><a href="#Licence">Licence(s)</a></li>
  <li><a href="#Installati">Installation</a></li>
  <li><a href="#Compilatio">Compilation</a></li>
  <li><a href="#Developper">Developper corner</a></li>
</ul>

<h2><a name="Licence">Licence</a>(s)</h2>
<ol>
  <li><em>Licensing Terms for libxml</em>
    <p>libxml is released under 2 (compatible) licences:</p>
    <ul>
      <li>the <a href="http://www.gnu.org/copyleft/lgpl.html">LGPL</a>: GNU
        Library General Public License</li>
      <li>the <a
        href="http://www.w3.org/Consortium/Legal/copyright-software-19980720.html">W3C
        IPR</a>: very similar to the XWindow licence</li>
    </ul>
  </li>
  <li><em>Can I embed libxml in a proprietary application ?</em>
    <p>Yes. The W3C IPR allows you to also keep proprietary the changes you
    made to libxml, but it would be graceful to provide back bugfixes and
    improvements as patches for possible incorporation in the main
    developement tree</p>
  </li>
</ol>

<h2><a name="Installati">Installation</a></h2>
<ol>
  <li><em>Where can I get libxml</em> ?
    <p>The original distribution comes from <a
    href="ftp://rpmfind.net/pub/libxml/">rpmfind.net</a> or <a
    href="ftp://ftp.gnome.org/pub/GNOME/stable/sources/libxml/">gnome.org</a></p>
    <p>Most linux and Bsd distribution includes libxml, this is probably the
    safer way for end-users</p>
    <p>David Doolin provides precompiled Windows versions at <a
    href="http://www.ce.berkeley.edu/~doolin/code/libxmlwin32/    
    ">http://www.ce.berkeley.edu/~doolin/code/libxmlwin32/</a></p>
  </li>
  <li><em>I see libxml and libxml2 releases, which one should I install ?</em>
    <ul>
      <li>If you are not concerned by any existing backward compatibility with
        existing application, install libxml2 only</li>
      <li>If you are not doing development, you can safely install both.
        usually the packages <a
        href="http://rpmfind.net/linux/RPM/libxml.html">libxml</a> and <a
        href="http://rpmfind.net/linux/RPM/libxml2.html">libxml2</a> are
        compatible (this is not the case for development packages)</li>
      <li>If you are a developper and your system provides separate packaging
        for shared libraries and the development components, it is possible to
        install libxml and libxml2, and depending on your development needs
        have either <a
        href="http://rpmfind.net/linux/RPM/libxml-devel.html">libxml-devel</a>
        or <a
        href="http://rpmfind.net/linux/RPM/libxml2-devel.html">libxml2-devel</a>
        too</li>
      <li>If you are developping a new application, please develop against
        libxml2(-devel)</li>
    </ul>
  </li>
  <li><em>I can't install the libxml package it conflicts with libxml0</em>
    <p>You probably have an old libxml0 package used to provide the shared
    library for libxml.so.0, you can probably safely remove it. Anyway the
    libxml packages provided on <a
    href="ftp://rpmfind.net/pub/libxml/">rpmfind.net</a> provides
    libxml.so.0</p>
  </li>
</ol>

<h2><a name="Compilatio">Compilation</a></h2>
<ol>
  <li><em>What is the process to compile libxml ?</em>
    <p>As most UNIX libraries libxml follows the "standard":</p>
    <p><code>gunzip -c xxx.tar.gz | tar xvf -</code></p>
    <p><code>cd libxml-xxxx</code></p>
    <p><code>./configure --help</code></p>
    <p>to see the options, then the compilation/installation proper</p>
    <p><code>./configure [possible options]</code></p>
    <p><code>make</code></p>
    <p><code>make install</code></p>
    <p>At that point you may have to rerun ldconfig or similar utility to
    update your list of installed shared libs.</p>
  </li>
  <li><em>What other libraries are needed to compile/install libxml ?</em>
    <p>Libxml does not requires any other library, the normal C ANSI API
    should be sufficient (please report any violation to this rule you may
    find).</p>
    <p>However if found at configuration time libxml will deect and use the
    following libs:</p>
    <ul>
      <li><a href="http://www.info-zip.org/pub/infozip/zlib/">libz</a>: a
        highly portable and available widely compression library</li>
      <li>iconv: a powerful character encoding conversion library. It's
        included by default on recent glibc libraries, so it doesn't need to
        be installed specifically on linux. It seems it's now <a
        href="http://www.opennc.org/onlinepubs/7908799/xsh/iconv.html">part of
        the official UNIX</a> specification, though I could not find a home
        page for the project.</li>
    </ul>
  </li>
  <li><em>The Makefile for the example gjobread is not generated</em>
    <p>This is due to a circular dependancy in automake. No solution found so
    far (if you know how to fix this the patch will be very welcome), that
    failure won't affect the actually building of the xml library. You can
    later go in and create the example Makefile by hand or reuse the
    following:</p>
    <pre>CC=gcc
        CFLAGS=`xml-config --cflags`
        LDFLAGS=`xml-config --libs`

        all: gjobread

        clean:
        &lt;TAB>@(rm -f gjobread gjobread.o)

        gjobread.o : gjobread.c
        &lt;TAB>$(CC) $(CFLAGS) -c gjobread.c

        gjobread: gjobread.o
        &lt;TAB>$(CC) -o gjobread gjobread.o $(LDFLAGS)</pre>
  </li>
  <li><em>libxml does not compile with HP-UX's optional ANSI-C compiler</em>
    <p>this is due to macro limitations. Try to add " -Wp,-H16800 -Ae" to the
    CFLAGS</p>
    <p>you can also install and use gcc instead or use a precompiled version
    of libxml, both available from the <a
    href="http://hpux.cae.wisc.edu/hppd/auto/summary_all.html">HP-UX Porting
    and Archive Centre</a></p>
  </li>
  <li><em>make check fails on some platforms</em>
    <p>Sometime the regression tests results don't completely match the value
    produced by the parser, and the makefile uses diff to print the delta. On
    some platforms the diff return breaks the compilation process, if the diff
    is small this is probably not a serious problem</p>
  </li>
</ol>

<h2><a name="Developper">Developper</a> corner</h2>
<ol>
  <li><em>I get compilation errors of existing code like when accessing
    <strong>root</strong> or <strong>childs fields</strong> of nodes</em>
    <p>You are compiling code developped for libxml version 1 and using a
    libxml2 developement environment. Either switch back to libxml v1 devel or
    even better fix the code to compile with libxml2 (or both) by <a
    href="upgrade.html">following the instructions</a>.</p>
  </li>
  <li><em>I get compilation errors about non existing
    <strong>xmlRootNode</strong> or <strong>xmlChildrenNode</strong>
    fields</em>
    <p>The source code you are using has been <a
    href="upgrade.html">upgraded</a> to be able to compile with both libxml
    and libxml2, but you need to install a more recent version: libxml(-devel)
    >= 1.8.8 or libxml2(-devel) >= 2.1.0</p>
  </li>
  <li><em>XPath implementation looks seriously broken</em>
    <p>True, it's incomplete and the version released in 2.0.0 was nearly
    unusable. A set of patches from <a href="http://www.picdar.co.uk/">Picdar
    Technology</a> have been integrated in 2.1.0 fixing the most nasty bugs.
    But there is still bugs and its incomplete. Patches and bug reports are
    welcome. This will be worked out, XPath implementation is not abandonned,
    just a momentary lack of time.</p>
  </li>
  <li><em>The example provided in the web page does not compile</em>
    <p>It's hard to maintain the documentation in sync with the code
    &lt;grin/> ...</p>
    <p>Check the previous points 1/ and 2/ raised before, and send
    patches.</p>
  </li>
  <li><em>Where can I get more examples and informations than in the web
    page</em>
    <p>Ideally a libxml book would be nice. I have no such plan ... But you
    can:</p>
    <ul>
      <li>check more deeply the <a href="html/libxml-lib.html">existing generated
        doc</a></li>
      <li>looks for examples of use for libxml function using the Gnome code
        for example the following will query the full Gnome CVs base for the
        use of the <strong>xmlAddChild()</strong> function:
        <p><a
        href="http://cvs.gnome.org/lxr/search?string=xmlAddChild">http://cvs.gnome.org/lxr/search?string=xmlAddChild</a></p>
        <p>This may be slow, a large hardware donation to the gnome project
        could cure this :-)</p>
      </li>
      <li><a
        href="http://cvs.gnome.org/bonsai/rview.cgi?cvsroot=/cvs/gnome&dir=gnome-xml">Browse
        the libxml source</a>, I try to write code as clean and documented as
        possible, so looking at it may be helpful</li>
    </ul>
  </li>
  <li>What about C++ ?
    <p>libxml is written in pure C in order to allow easy reuse on a number of
    platforms, including embedded systems. I don't intend to convert to
    C++.</p>
    <p>There is however a C++ wrapper provided by Ari Johnson
    &lt;ari@btigate.com> which may fullfill your needs:</p>
    <p>Website: <a
    href="http://lusis.org/~ari/xml++/">http://lusis.org/~ari/xml++/</a></p>
    <p>Download: <a
    href="http://lusis.org/~ari/xml++/libxml++.tar.gz">http://lusis.org/~ari/xml++/libxml++.tar.gz</a></p>
  </li>
  <li>How to validate a document a posteriori ?
    <p>It is possible to validate documents which had not been validated at
    initial parsing time or documents who have been built from scratch using
    the API. Use the <a
    href="http://xmlsoft.org/html/gnome-xml-valid.html#XMLVALIDATEDTD">xmlValidateDtd()</a>
    function. It is also possible to simply add a Dtd to an existing
    document:</p>
    <pre>xmlDocPtr doc; /* your existing document */
        xmlDtdPtr dtd = xmlParseDTD(NULL, filename_of_dtd); /* parse the DTD */
        dtd->name = xmlStrDup((xmlChar*)"root_name"); /* use the given root */

        doc->intSubset = dtd;
        if (doc->children == NULL) xmlAddChild((xmlNodePtr)doc, (xmlNodePtr)dtd);
        else xmlAddPrevSibling(doc->children, (xmlNodePtr)dtd);
          </pre>
  </li>
  <li>etc ...</li>
</ol>

<p><a href="mailto:Daniel.Veillard@w3.org">Daniel Veillard</a></p>

<p>$Id$</p>
</body>
</html>
