38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Retrieving Element Content</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" href="index.html" title="Libxml Tutorial"><link rel="up" href="index.html" title="Libxml Tutorial"><link rel="previous" href="ar01s03.html" title="Parsing the file"><link rel="next" href="ar01s05.html" title="Using XPath to Retrieve Element Content"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Retrieving Element Content</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ar01s03.html">Prev</a>�</td><th width="60%" align="center">�</th><td width="20%" align="right">�<a accesskey="n" href="ar01s05.html">Next</a></td></tr></table><hr></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="xmltutorialgettext"></a>Retrieving Element Content</h2></div></div><div></div></div><p><a class="indexterm" name="id2525439"></a>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncRetrieving the content of an element involves traversing the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tree until you find what you are looking for. In this case, we are looking
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for an element called "keyword" contained within element called "story". The
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync process to find the node we are interested in involves tediously walking the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tree. We assume you already have an xmlDocPtr called <tt class="varname">doc</tt>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync and an xmlNodPtr called <tt class="varname">cur</tt>.</p><p>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </p><pre class="programlisting">
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync <a name="getchildnode"></a><img src="images/callouts/1.png" alt="1" border="0">cur = cur-&gt;xmlChildrenNode;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync <a name="huntstoryinfo"></a><img src="images/callouts/2.png" alt="2" border="0">while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"storyinfo"))){
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync parseStory (doc, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur-&gt;next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </pre><p>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#getchildnode"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>Get the first child node of <tt class="varname">cur</tt>. At this
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync point, <tt class="varname">cur</tt> points at the document root, which is
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync the element "story".</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#huntstoryinfo"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>This loop iterates through the elements that are children of
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "story", looking for one called "storyinfo". That
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync is the element that will contain the "keywords" we are
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync looking for. It uses the <span class="application">libxml</span> string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync comparison
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync function, <tt class="function"><a href="http://xmlsoft.org/html/libxml-parser.html#XMLSTRCMP" target="_top">xmlStrcmp</a></tt>. If there is a match, it calls the function <tt class="function">parseStory</tt>.</p></td></tr></table></div><p>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </p><p>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </p><pre class="programlisting">
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncparseStory (xmlDocPtr doc, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *key;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync <a name="anothergetchild"></a><img src="images/callouts/1.png" alt="1" border="0"> cur = cur-&gt;xmlChildrenNode;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync <a name="findkeyword"></a><img src="images/callouts/2.png" alt="2" border="0"> while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"keyword"))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync <a name="foundkeyword"></a><img src="images/callouts/3.png" alt="3" border="0"> key = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync printf("keyword: %s\n", key);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(key);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur-&gt;next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </pre><p>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><a href="#anothergetchild"><img src="images/callouts/1.png" alt="1" border="0"></a> </td><td valign="top" align="left"><p>Again we get the first child node.</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#findkeyword"><img src="images/callouts/2.png" alt="2" border="0"></a> </td><td valign="top" align="left"><p>Like the loop above, we then iterate through the nodes, looking
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for one that matches the element we're interested in, in this case
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "keyword".</p></td></tr><tr><td width="5%" valign="top" align="left"><a href="#foundkeyword"><img src="images/callouts/3.png" alt="3" border="0"></a> </td><td valign="top" align="left"><p>When we find the "keyword" element, we need to print
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync its contents. Remember that in <span class="acronym">XML</span>, the text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync contained within an element is a child node of that element, so we
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync turn to <tt class="varname">cur-&gt;xmlChildrenNode</tt>. To retrieve it, we
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync use the function <tt class="function"><a href="http://xmlsoft.org/html/libxml-tree.html#XMLNODELISTGETSTRING" target="_top">xmlNodeListGetString</a></tt>, which also takes the <tt class="varname">doc</tt> pointer as an argument. In this case, we just print it out.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p>Because <tt class="function">xmlNodeListGetString</tt> allocates
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memory for the string it returns, you must use
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync <tt class="function">xmlFree</tt> to free it.</p></td></tr></table></div></td></tr></table></div><p>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ar01s03.html">Prev</a>�</td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right">�<a accesskey="n" href="ar01s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Parsing the file�</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">�Using XPath to Retrieve Element Content</td></tr></table></div></body></html>