blob: 11492ebf216cb2e6b84bd6f61bfc24df9822bee8 [file] [log] [blame]
MDT 2004 John Fleck4c3bb7d2004-08-25 02:51:27 +00001<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>
MST 2003 John Fleck731967e2003-01-27 00:39:50 +00002Retrieving the content of an element involves traversing the document
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +00003 tree until you find what you are looking for. In this case, we are looking
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +00004 for an element called "keyword" contained within element called "story". The
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +00005 process to find the node we are interested in involves tediously walking the
MST 2003 John Fleck731967e2003-01-27 00:39:50 +00006 tree. We assume you already have an xmlDocPtr called <tt class="varname">doc</tt>
7 and an xmlNodPtr called <tt class="varname">cur</tt>.</p><p>
8 </p><pre class="programlisting">
MST 2002 John Fleck7c67a832002-12-16 13:38:06 +00009 <a name="getchildnode"></a><img src="images/callouts/1.png" alt="1" border="0">cur = cur-&gt;xmlChildrenNode;
10 <a name="huntstoryinfo"></a><img src="images/callouts/2.png" alt="2" border="0">while (cur != NULL) {
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +000011 if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"storyinfo"))){
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000012 parseStory (doc, cur);
13 }
14
15 cur = cur-&gt;next;
16 }
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000017 </pre><p>
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000018
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000019 </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
20 point, <tt class="varname">cur</tt> points at the document root, which is
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +000021 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
22 "story", looking for one called "storyinfo". That
23 is the element that will contain the "keywords" we are
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000024 looking for. It uses the <span class="application">libxml</span> string
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000025 comparison
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000026 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>
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000027 </p><p>
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000028 </p><pre class="programlisting">
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000029void
30parseStory (xmlDocPtr doc, xmlNodePtr cur) {
31
MST 2002 John Fleck7c67a832002-12-16 13:38:06 +000032 xmlChar *key;
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000033 <a name="anothergetchild"></a><img src="images/callouts/1.png" alt="1" border="0"> cur = cur-&gt;xmlChildrenNode;
34 <a name="findkeyword"></a><img src="images/callouts/2.png" alt="2" border="0"> while (cur != NULL) {
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +000035 if ((!xmlStrcmp(cur-&gt;name, (const xmlChar *)"keyword"))) {
MST 2002 John Fleck7c67a832002-12-16 13:38:06 +000036 <a name="foundkeyword"></a><img src="images/callouts/3.png" alt="3" border="0"> key = xmlNodeListGetString(doc, cur-&gt;xmlChildrenNode, 1);
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +000037 printf("keyword: %s\n", key);
MST 2002 John Fleck7c67a832002-12-16 13:38:06 +000038 xmlFree(key);
39 }
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000040 cur = cur-&gt;next;
41 }
42 return;
43}
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000044 </pre><p>
MST 2002 John Fleckbd3b4fd2002-11-11 03:41:11 +000045 </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
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000046 for one that matches the element we're interested in, in this case
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +000047 "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
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000048 its contents. Remember that in <span class="acronym">XML</span>, the text
MDT 2002 John Fleck598f6eb2002-06-04 15:10:36 +000049 contained within an element is a child node of that element, so we
MST 2003 John Fleck731967e2003-01-27 00:39:50 +000050 turn to <tt class="varname">cur-&gt;xmlChildrenNode</tt>. To retrieve it, we
MST 2004 John Fleckd14bccc2004-02-15 01:57:42 +000051 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
MST 2002 John Fleck7c67a832002-12-16 13:38:06 +000052 memory for the string it returns, you must use
MST 2004 John Fleckd14bccc2004-02-15 01:57:42 +000053 <tt class="function">xmlFree</tt> to free it.</p></td></tr></table></div></td></tr></table></div><p>
MDT 2003 John Fleck63f3a472003-07-24 21:48:30 +000054 </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>