<?xml version="1.0"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
    "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY KEYWORD SYSTEM "includekeyword.c">
<!ENTITY XPATH SYSTEM "includexpath.c">
<!ENTITY STORY SYSTEM "includestory.xml">
<!ENTITY ADDKEYWORD SYSTEM "includeaddkeyword.c">
<!ENTITY ADDATTRIBUTE SYSTEM "includeaddattribute.c">
<!ENTITY GETATTRIBUTE SYSTEM "includegetattribute.c">
<!ENTITY CONVERT SYSTEM "includeconvert.c">
]>
<article lang="en">
  <articleinfo>
    <title>Libxml Tutorial</title>
    <author>
      <firstname>John</firstname>
      <surname>Fleck</surname>
      <email>jfleck@inkstain.net</email>
    </author>
    <copyright>
      <year>2002, 2003</year>
      <holder>John Fleck</holder>
    </copyright>
    <revhistory>
      <revision>
	<revnumber>1</revnumber>
	<date>June 4, 2002</date>
	<revremark>Initial draft</revremark>
      </revision>
      <revision>
	<revnumber>2</revnumber>
	<date>June 12, 2002</date>
	<revremark>retrieving attribute value added</revremark>
      </revision>
      <revision>
	<revnumber>3</revnumber>
	<date>Aug. 31, 2002</date>
	<revremark>freeing memory fix</revremark>
      </revision>
      <revision>
	<revnumber>4</revnumber>
	<date>Nov. 10, 2002</date>
	<revremark>encoding discussion added</revremark>
      </revision>
      <revision>
	<revnumber>5</revnumber>
	<date>Dec. 15, 2002</date>
	<revremark>more memory freeing changes</revremark>
      </revision>
      <revision>
	<revnumber>6</revnumber>
	<date>Jan. 26. 2003</date>
	<revremark>add index</revremark>
      </revision>
      <revision>
	<revnumber>7</revnumber>
	<date>April 25, 2003</date>
	<revremark>add compilation appendix</revremark>
      </revision>
      <revision>
	<revnumber>8</revnumber>
	<date>July 24, 2003</date>
	<revremark>add XPath example</revremark>
      </revision>
      <revision>
	<revnumber>9</revnumber>
	<date>Feb. 14, 2004</date>
	<revremark>Fix bug in XPath example</revremark>
      </revision>
    </revhistory>
  </articleinfo>
  <abstract>
    <para>Libxml is a freely licensed C language library for handling
    <acronym>XML</acronym>, portable across a large number of platforms. This
    tutorial provides examples of its basic functions.</para>
  </abstract>
  <sect1 id="introduction">
    <title>Introduction</title>
    <para>Libxml is a C language library implementing functions for reading,
      creating and manipulating <acronym>XML</acronym> data. This tutorial
    provides example code and explanations of its basic functionality.</para>
    <para>Libxml and more details about its use are available on <ulink
									url="http://www.xmlsoft.org/">the project home page</ulink>. Included there is complete <ulink url="http://xmlsoft.org/html/libxml-lib.html">
	<acronym>API</acronym> documentation</ulink>. This tutorial is not meant
    to substitute for that complete documentation, but to illustrate the
    functions needed to use the library to perform basic operations.
<!--
 Links to
      other resources can be found in <xref linkend="furtherresources" />.
-->
</para>
    <para>The tutorial is based on a simple <acronym>XML</acronym> application I
    use for articles I write. The format includes metadata and the body
    of the article.</para>
    <para>The example code in this tutorial demonstrates how to:
      <itemizedlist>
	<listitem>
	  <para>Parse the document.</para>
	</listitem>
	<listitem>
	  <para>Extract the text within a specified element.</para>
	</listitem>
	<listitem>
	  <para>Add an element and its content.</para>
	</listitem>
	<listitem>
	  <para>Add an attribute.</para>
	</listitem>      
	<listitem>
	  <para>Extract the value of an attribute.</para>
	</listitem>
      </itemizedlist>
    </para>
    <para>Full code for the examples is included in the appendices.</para>

  </sect1>

  <sect1 id="xmltutorialdatatypes">
    <title>Data Types</title>
    <para><application>Libxml</application> declares a number of data types we
    will encounter repeatedly, hiding the messy stuff so you do not have to deal
    with it unless you have some specific need.</para>
    <para>
      <variablelist>
	<varlistentry>
	  <term><indexterm>
	      <primary>xmlChar</primary>
	    </indexterm>
<ulink
	  url="http://xmlsoft.org/html/libxml-tree.html#XMLCHAR">xmlChar</ulink></term>
	  <listitem>
	    <para>A basic replacement for char, a byte in a UTF-8 encoded
	    string. If your data uses another encoding, it must be converted to
	      UTF-8 for use with <application>libxml's</application>
	      functions. More information on encoding is available on the <ulink
		url="http://www.xmlsoft.org/encoding.html"><application>libxml</application> encoding support web page</ulink>.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><indexterm>
	      <primary>xmlDoc</primary>
	    </indexterm>
	    <ulink url="http://xmlsoft.org/html/libxml-tree.html#XMLDOC">xmlDoc</ulink></term>
	  <listitem>
	    <para>A structure containing the tree created by a parsed doc. <ulink
	  url="http://xmlsoft.org/html/libxml-tree.html#XMLDOCPTR">xmlDocPtr</ulink>
	  is a pointer to the structure.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><indexterm>
	      <primary>xmlNodePtr</primary>
	    </indexterm>
<ulink
	  url="http://xmlsoft.org/html/libxml-tree.html#XMLNODEPTR">xmlNodePtr</ulink>
	    and <ulink url="http://xmlsoft.org/html/libxml-tree.html#XMLNODE">xmlNode</ulink></term>
	  <listitem>
	    <para>A structure containing a single node. <ulink
	  url="http://xmlsoft.org/html/libxml-tree.html#XMLNODEPTR">xmlNodePtr</ulink>
	  is a pointer to the structure, and is used in traversing the document tree.</para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </para>

  </sect1>

  <sect1 id="xmltutorialparsing">
    <title>Parsing the file</title>
    <para><indexterm id="fileparsing" class="startofrange">
	<primary>file</primary>
	<secondary>parsing</secondary>
      </indexterm>
Parsing the file requires only the name of the file and a single
      function call, plus error checking. Full code: <xref
    linkend="keywordappendix" /></para>
    <para>
    <programlisting>
        <co id="declaredoc" /> xmlDocPtr doc;
	<co id="declarenode" /> xmlNodePtr cur;

	<co id="parsefile" /> doc = xmlParseFile(docname);
	
	<co id="checkparseerror" /> if (doc == NULL ) {
		fprintf(stderr,"Document not parsed successfully. \n");
		return;
	}

	<co id="getrootelement" /> cur = xmlDocGetRootElement(doc);
	
	<co id="checkemptyerror" /> if (cur == NULL) {
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return;
	}
	
	<co id="checkroottype" /> if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
		fprintf(stderr,"document of the wrong type, root node != story");
		xmlFreeDoc(doc);
		return;
	}

    </programlisting>
      <calloutlist>
	<callout arearefs="declaredoc">
	  <para>Declare the pointer that will point to your parsed document.</para>
	</callout>
	<callout arearefs="declarenode">
	  <para>Declare a node pointer (you'll need this in order to
	  interact with individual nodes).</para>
	</callout>
	<callout arearefs="checkparseerror">
	  <para>Check to see that the document was successfully parsed. If it
	    was not, <application>libxml</application> will at this point
	    register an error and stop. 
	    <note>
	      <para><indexterm>
		  <primary>encoding</primary>
		</indexterm>
One common example of an error at this point is improper
	    handling of encoding. The <acronym>XML</acronym> standard requires
	    documents stored with an encoding other than UTF-8 or UTF-16 to
	    contain an explicit declaration of their encoding. If the
	    declaration is there, <application>libxml</application> will
	    automatically perform the necessary conversion to UTF-8 for
		you. More information on <acronym>XML's</acronym> encoding
		requirements is contained in the <ulink
		  url="http://www.w3.org/TR/REC-xml#charencoding">standard</ulink>.</para>
	    </note>
	  </para>
	</callout>
	<callout arearefs="getrootelement">
	  <para>Retrieve the document's root element.</para>
	</callout>
	<callout arearefs="checkemptyerror">
	  <para>Check to make sure the document actually contains something.</para>
	</callout>
	<callout arearefs="checkroottype">
	  <para>In our case, we need to make sure the document is the right
	  type. &quot;story&quot; is the root type of the documents used in this
	  tutorial.</para>
	</callout>
      </calloutlist>
      <indexterm startref="fileparsing" class="endofrange" />
    </para>
  </sect1>

  <sect1 id="xmltutorialgettext">
    <title>Retrieving Element Content</title>
    <para><indexterm>
	<primary>element</primary>
	<secondary>retrieving content</secondary>
      </indexterm>
Retrieving the content of an element involves traversing the document
    tree until you find what you are looking for. In this case, we are looking
    for an element called &quot;keyword&quot; contained within element called &quot;story&quot;. The
    process to find the node we are interested in involves tediously walking the
    tree. We assume you already have an xmlDocPtr called <varname>doc</varname>
    and an xmlNodPtr called <varname>cur</varname>.</para>

    <para>
      <programlisting>
	<co id="getchildnode" />cur = cur->xmlChildrenNode;
	<co id="huntstoryinfo" />while (cur != NULL) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
			parseStory (doc, cur);
		}
		 
	cur = cur->next;
	}
      </programlisting>

      <calloutlist>
	<callout arearefs="getchildnode">
	  <para>Get the first child node of <varname>cur</varname>. At this
	    point, <varname>cur</varname> points at the document root, which is
	    the element &quot;story&quot;.</para>
	</callout>
	<callout arearefs="huntstoryinfo">
	  <para>This loop iterates through the elements that are children of
	  &quot;story&quot;, looking for one called &quot;storyinfo&quot;. That
	  is the element that will contain the &quot;keywords&quot; we are
	    looking for. It uses the <application>libxml</application> string
	  comparison
	    function, <function><ulink
				       url="http://xmlsoft.org/html/libxml-parser.html#XMLSTRCMP">xmlStrcmp</ulink></function>. If there is a match, it calls the function <function>parseStory</function>.</para>
	</callout>
      </calloutlist>
    </para>

    <para>
      <programlisting>
void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *key;
	<co id="anothergetchild" /> cur = cur->xmlChildrenNode;
	<co id="findkeyword" /> while (cur != NULL) {
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
	<co id="foundkeyword" />	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
		    printf("keyword: %s\n", key);
		    xmlFree(key);
 	    }
	cur = cur->next;
	}
    return;
}
      </programlisting>
      <calloutlist>
	<callout arearefs="anothergetchild">
	  <para>Again we get the first child node.</para>
	</callout>
	<callout arearefs="findkeyword">
	  <para>Like the loop above, we then iterate through the nodes, looking
	  for one that matches the element we're interested in, in this case
	  &quot;keyword&quot;.</para>
	</callout>
	<callout arearefs="foundkeyword">
	  <para>When we find the &quot;keyword&quot; element, we need to print
	    its contents. Remember that in <acronym>XML</acronym>, the text
	    contained within an element is a child node of that element, so we
	    turn to <varname>cur-&gt;xmlChildrenNode</varname>. To retrieve it, we
	    use the function <function><ulink
					      url="http://xmlsoft.org/html/libxml-tree.html#XMLNODELISTGETSTRING">xmlNodeListGetString</ulink></function>, which also takes the <varname>doc</varname> pointer as an argument. In this case, we just print it out.</para>
	  <note>
	    <para>Because <function>xmlNodeListGetString</function> allocates
	      memory for the string it returns, you must use
	      <function>xmlFree</function> to free it.</para>
	  </note>
	</callout>
      </calloutlist>
    </para>

  </sect1>
  <sect1 id="xmltutorialxpath">
    <title>Using XPath to Retrieve Element Content</title>
    <para>In addition to walking the document tree to find an element,
    <application>Libxml2</application> includes support for
      use of <application>XPath</application> expressions to retrieve sets of
      nodes that match a specified criteria. Full documentation of the
      <application>XPath</application> <acronym>API</acronym> is <ulink
	url="http://xmlsoft.org/html/libxml-xpath.html">here</ulink>.
    </para>
    <para><application>XPath</application> allows searching through a document
    for nodes that match specified criteria. In the example below we search
      through a document for the contents of all <varname>keyword</varname>
    elements.
      <note>
	<para>A full discussion of <application>XPath</application> is beyond
	  the scope of this document. For details on its use, see the <ulink
	    url="http://www.w3.org/TR/xpath">XPath specification</ulink>.</para>
      </note>
      Full code for this example is at <xref linkend="xpathappendix" />.
    </para>
    <para>Using <application>XPath</application> requires setting up an
      xmlXPathContext and then supplying the <application>XPath</application>
      expression and the context to the
      <function>xmlXPathEvalExpression</function> function. The function returns
      an xmlXPathObjectPtr, which includes the set of nodes satisfying the
      <application>XPath</application> expression.</para>
    <para>
      <programlisting>
	xmlXPathObjectPtr
	getnodeset (xmlDocPtr doc, xmlChar *xpath){
	
	<co id="cocontext" />xmlXPathContextPtr context;
	xmlXPathObjectPtr result;

	<co id="cocreatecontext" />context = xmlXPathNewContext(doc);
	<co id="corunxpath" />result = xmlXPathEvalExpression(xpath, context);
	<co id="cocheckxpathresult" />if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
                printf("No result\n");
                return NULL;
	}
	xmlXPathFreeContext(context);
	return result;
      </programlisting>
      <calloutlist>
	<callout arearefs="cocontext">
	  <para>First we declare our variables.</para>
	</callout>
	<callout arearefs="cocreatecontext">
	  <para>Initialize the <varname>context</varname> variable.</para>
	</callout>
	<callout arearefs="corunxpath">
	  <para>Apply the <application>XPath</application> expression.</para>
	</callout>
	<callout arearefs="cocheckxpathresult">
	  <para>Check the result.</para>
	</callout>
      </calloutlist>
    </para>
    <para>The xmlPathObjectPtr returned by the function contains a set of nodes
    and other information needed to iterate through the set and act on the
      results. For this example, our functions returns the
    <varname>xmlXPathObjectPtr</varname>. We use it to print the contents of
      <varname>keyword</varname> nodes in our document. The node set object
      includes the number of elements in the set (<varname>nodeNr</varname>) and
      an array of nodes (<varname>nodeTab</varname>):
      <programlisting>
	<co id="conodesetcounter" />for (i=0; i &lt; nodeset->nodeNr; i++) {
	<co id="coprintkeywords" />keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
		printf("keyword: %s\n", keyword);
	        xmlFree(keyword);
	}
      </programlisting>
      <calloutlist>
	<callout arearefs="conodesetcounter">
	  <para>The value of <varname>nodeset->Nr</varname> holds the number of
	  elements in the node set. Here we use it to iterate through the array.</para>
	</callout>
	<callout arearefs="coprintkeywords">
	  <para>Here we print the contents of each of the nodes returned.
	    <note>
	      <para>Note that we are printing the child node of the node that is
		returned, because the contents of the <varname>keyword</varname>
		element are a child text node.</para>
	    </note>
	  </para>
	</callout>
      </calloutlist>
    </para>
  </sect1>
<sect1 id="xmltutorialwritingcontent">
    <title>Writing element content</title>
    <para><indexterm>
	<primary>element</primary>
	<secondary>writing content</secondary>
      </indexterm>
      Writing element content uses many of the same steps we used above
      &mdash; parsing the document and walking the tree. We parse the document,
      then traverse the tree to find the place we want to insert our element. For
      this example, we want to again find the &quot;storyinfo&quot; element and
      this time insert a keyword. Then we'll write the file to disk. Full code:
      <xref linkend="addkeywordappendix" /></para>
    <para>
      The main difference in this example is in
      <function>parseStory</function>:

      <programlisting>
void
parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {

	<co id="addkeyword" /> xmlNewTextChild (cur, NULL, "keyword", keyword);
    return;
}
      </programlisting>
      <calloutlist>
	<callout arearefs="addkeyword">
	  <para>The <function><ulink
				     url="http://xmlsoft.org/html/libxml-tree.html#XMLNEWTEXTCHILD">xmlNewTextChild</ulink></function>
				     function adds a new child element at the
				     current node pointer's location in the
	    tree, specified by <varname>cur</varname>.</para>
	</callout>
      </calloutlist>
         </para>

    <para>
      <indexterm>
	<primary>file</primary>
	<secondary>saving</secondary>
      </indexterm>
      Once the node has been added, we would like to write the document to
      file. Is you want the element to have a namespace, you can add it here as
      well. In our case, the namespace is NULL.
      <programlisting>
	xmlSaveFormatFile (docname, doc, 1);
      </programlisting>
      The first parameter is the name of the file to be written. You'll notice
      it is the same as the file we just read. In this case, we just write over
      the old file. The second parameter is a pointer to the xmlDoc
      structure. Setting the third parameter equal to one ensures indenting on output.
    </para>
  </sect1>

  <sect1 id="xmltutorialwritingattribute">
    <title>Writing Attribute</title>
    <para><indexterm>
	<primary>attribute</primary>
	<secondary>writing</secondary>
      </indexterm>
Writing an attribute is similar to writing text to a new element. In
      this case, we'll add a reference <acronym>URI</acronym> to our
      document. Full code:<xref linkend="addattributeappendix" />.</para>
    <para>
      A <sgmltag>reference</sgmltag> is a child of the <sgmltag>story</sgmltag>
      element, so finding the place to put our new element and attribute is
      simple. As soon as we do the error-checking test in our
      <function>parseDoc</function>, we are in the right spot to add our
      element. But before we do that, we need to make a declaration using a
      data type we have not seen yet:
      <programlisting>
	xmlAttrPtr newattr;
      </programlisting>
      We also need an extra xmlNodePtr:
      <programlisting>
	xmlNodePtr newnode;
      </programlisting>
    </para>
    <para>
      The rest of <function>parseDoc</function> is the same as before until we
      check to see if our root element is <sgmltag>story</sgmltag>. If it is,
      then we know we are at the right spot to add our element:

      <programlisting>
	<co id="addreferencenode" /> newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
	<co id="addattributenode" /> newattr = xmlNewProp (newnode, "uri", uri);	
      </programlisting>
      <calloutlist>
	<callout arearefs="addreferencenode">
	  <para>First we add a new node at the location of the current node
	    pointer, <varname>cur.</varname> using the <ulink
							      url="http://xmlsoft.org/html/libxml-tree.html#XMLNEWTEXTCHILD">xmlNewTextChild</ulink> function.</para>
	</callout>
      </calloutlist>
   </para>

    <para>Once the node is added, the file is written to disk just as in the
    previous example in which we added an element with text content.</para>

  </sect1>

  <sect1 id="xmltutorialattribute">
    <title>Retrieving Attributes</title>
    <para><indexterm>
	<primary>attribute</primary>
	<secondary>retrieving value</secondary>
      </indexterm>
Retrieving the value of an attribute is similar to the previous
    example in which we retrieved a node's text contents. In this case we'll
      extract the value of the <acronym>URI</acronym> we added in the previous
      section. Full code: <xref linkend="getattributeappendix" />.</para>
    <para>
      The initial steps for this example are similar to the previous ones: parse
      the doc, find the element you are interested in, then enter a function to
      carry out the specific task required. In this case, we call
      <function>getReference</function>:
      <programlisting>
void
getReference (xmlDocPtr doc, xmlNodePtr cur) {

	xmlChar *uri;
	cur = cur->xmlChildrenNode;
	while (cur != NULL) {
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
		   <co id="getattributevalue" /> uri = xmlGetProp(cur, "uri");
		    printf("uri: %s\n", uri);
		    xmlFree(uri);
	    }
	    cur = cur->next;
	}
	return;
}
      </programlisting>
    
      <calloutlist>
	<callout arearefs="getattributevalue">
	  <para>
	    The key function is <function><ulink
					   url="http://xmlsoft.org/html/libxml-tree.html#XMLGETPROP">xmlGetProp</ulink></function>, which returns an
      <varname>xmlChar</varname> containing the attribute's value. In this case,
					   we just print it out.
      <note>
	<para>
	  If you are using a <acronym>DTD</acronym> that declares a fixed or
	  default value for the attribute, this function will retrieve it.
	</para>
	    </note>
	  </para>
	</callout>
      </calloutlist>
     
    </para>
  </sect1>

  <sect1 id="xmltutorialconvert">
    <title>Encoding Conversion</title>

    <para><indexterm>
	<primary>encoding</primary>
      </indexterm>
Data encoding compatibility problems are one of the most common
      difficulties encountered by programmers new to <acronym>XML</acronym> in
      general and <application>libxml</application> in particular. Thinking
      through the design of your application in light of this issue will help
      avoid difficulties later. Internally, <application>libxml</application>
      stores and manipulates data in the UTF-8 format. Data used by your program
      in other formats, such as the commonly used ISO-8859-1 encoding, must be
      converted to UTF-8 before passing it to <application>libxml</application>
      functions. If you want your program's output in an encoding other than
      UTF-8, you also must convert it.</para>

      <para><application>Libxml</application> uses
      <application>iconv</application> if it is available to convert
    data. Without <application>iconv</application>, only UTF-8, UTF-16 and
    ISO-8859-1 can be used as external formats. With
    <application>iconv</application>, any format can be used provided
    <application>iconv</application> is able to convert it to and from
    UTF-8. Currently <application>iconv</application> supports about 150
    different character formats with ability to convert from any to any. While
    the actual number of supported formats varies between implementations, every
    <application>iconv</application> implementation is almost guaranteed to
    support every format anyone has ever heard of.</para>

    <warning>
      <para>A common mistake is to use different formats for the internal data
	in different parts of one's code. The most common case is an application
	that assumes ISO-8859-1 to be the internal data format, combined with
	<application>libxml</application>, which assumes UTF-8 to be the
	internal data format. The result is an application that treats internal
	data differently, depending on which code section is executing. The one or
	the other part of code will then, naturally, misinterpret the data.
      </para>
    </warning>

    <para>This example constructs a simple document, then adds content provided
    at the command line to the document's root element and outputs the results
    to <filename>stdout</filename> in the proper encoding. For this example, we
    use ISO-8859-1 encoding. The encoding of the string input at the command
    line is converted from ISO-8859-1 to UTF-8. Full code: <xref
    linkend="convertappendix" /></para>

    <para>The conversion, encapsulated in the example code in the
      <function>convert</function> function, uses
      <application>libxml's</application>
    <function>xmlFindCharEncodingHandler</function> function:
      <programlisting>
	<co id="handlerdatatype" />xmlCharEncodingHandlerPtr handler;
        <co id="calcsize" />size = (int)strlen(in)+1; 
        out_size = size*2-1; 
        out = malloc((size_t)out_size); 

&hellip;
	<co id="findhandlerfunction" />handler = xmlFindCharEncodingHandler(encoding);
&hellip;
	<co id="callconversionfunction" />handler->input(out, &amp;out_size, in, &amp;temp);
&hellip;	
	<co id="outputencoding" />xmlSaveFormatFileEnc("-", doc, encoding, 1);
      </programlisting>
      <calloutlist>
	<callout arearefs="handlerdatatype">
	  <para><varname>handler</varname> is declared as a pointer to an
	    <function>xmlCharEncodingHandler</function> function.</para>
	</callout>
	<callout arearefs="calcsize">
	  <para>The <function>xmlCharEncodingHandler</function> function needs
	  to be given the size of the input and output strings, which are
	    calculated here for strings <varname>in</varname> and
	  <varname>out</varname>.</para>
	</callout>
	<callout arearefs="findhandlerfunction">
	  <para><function>xmlFindCharEncodingHandler</function> takes as its
	    argument the data's initial encoding and searches
	    <application>libxml's</application> built-in set of conversion
	    handlers, returning a pointer to the function or NULL if none is
	    found.</para>
	</callout>
	<callout arearefs="callconversionfunction">
	  <para>The conversion function identified by <varname>handler</varname>
	  requires as its arguments pointers to the input and output strings,
	  along with the length of each. The lengths must be determined
	  separately by the application.</para>
	</callout>
	<callout arearefs="outputencoding">
	  <para>To output in a specified encoding rather than UTF-8, we use
	    <function>xmlSaveFormatFileEnc</function>, specifying the
	    encoding.</para>
	</callout>
      </calloutlist>
    </para>
  </sect1>

  <appendix id="compilation">
    <title>Compilation</title>
    <para><indexterm>
	<primary>compiler flags</primary>
      </indexterm>
      <application>Libxml</application> includes a script,
    <application>xml2-config</application>, that can be used to generate
    flags for compilation and linking of programs written with the
      library. For pre-processor and compiler flags, use <command>xml2-config
	--cflags</command>. For library linking flags, use <command>xml2-config
	--libs</command>. Other options are available using <command>xml2-config
    --help</command>.</para>   
  </appendix>

  <appendix id="sampledoc">
    <title>Sample Document</title>
    <programlisting>&STORY;</programlisting>
  </appendix>
  <appendix id="keywordappendix">
    <title>Code for Keyword Example</title>
    <para>
      <programlisting>&KEYWORD;</programlisting>
    </para>
  </appendix>
  <appendix id="xpathappendix">
    <title>Code for XPath Example</title>
    <para>
      <programlisting>&XPATH;</programlisting>
    </para>
  </appendix>
<appendix id="addkeywordappendix">
    <title>Code for Add Keyword Example</title>
    <para>
      <programlisting>&ADDKEYWORD;</programlisting>
    </para>
  </appendix>
<appendix id="addattributeappendix">
    <title>Code for Add Attribute Example</title>
    <para>
      <programlisting>&ADDATTRIBUTE;</programlisting>
    </para>
  </appendix>
<appendix id="getattributeappendix">
    <title>Code for Retrieving Attribute Value Example</title>
    <para>
      <programlisting>&GETATTRIBUTE;</programlisting>
    </para>
  </appendix>
  <appendix id="convertappendix">
    <title>Code for Encoding Conversion Example</title>
    <para>
      <programlisting>&CONVERT;</programlisting>
    </para>
  </appendix>
  <appendix>
    <title>Acknowledgements</title>
    <para>A number of people have generously offered feedback, code and
    suggested improvements to this tutorial. In no particular order:
      <simplelist type="inline">
	<member>Daniel Veillard</member>
	<member>Marcus Labib Iskander</member>
	<member>Christopher R. Harris</member>
	<member>Igor Zlatkovic</member>
	<member>Niraj Tolia</member>
	<member>David Turover</member>
      </simplelist>
    </para>
  </appendix>
  <index />
</article>
