File: nodeparser_8cpp-source.html

package info (click to toggle)
libofx 1%3A0.9.0-3
  • links: PTS
  • area: main
  • in suites: lenny, squeeze
  • size: 9,864 kB
  • ctags: 31,331
  • sloc: sh: 8,861; cpp: 5,714; ansic: 2,524; makefile: 204; xml: 61
file content (156 lines) | stat: -rw-r--r-- 13,249 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>LibOFX: nodeparser.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.3 -->
<div class="tabs">
  <ul>
    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
    <li class="current"><a href="files.html"><span>Files</span></a></li>
  </ul>
</div>
<h1>nodeparser.cpp</h1><a href="nodeparser_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment">                             nodeparser.cpp </span>
<a name="l00003"></a>00003 <span class="comment">                             -------------------</span>
<a name="l00004"></a>00004 <span class="comment">    copyright            : (C) 2005 by Ace Jones</span>
<a name="l00005"></a>00005 <span class="comment">    email                : acejones@users.sourceforge.net</span>
<a name="l00006"></a>00006 <span class="comment">***************************************************************************/</span>
<a name="l00011"></a>00011 <span class="comment">/***************************************************************************</span>
<a name="l00012"></a>00012 <span class="comment"> *                                                                         *</span>
<a name="l00013"></a>00013 <span class="comment"> *   This program is free software; you can redistribute it and/or modify  *</span>
<a name="l00014"></a>00014 <span class="comment"> *   it under the terms of the GNU General Public License as published by  *</span>
<a name="l00015"></a>00015 <span class="comment"> *   the Free Software Foundation; either version 2 of the License, or     *</span>
<a name="l00016"></a>00016 <span class="comment"> *   (at your option) any later version.                                   *</span>
<a name="l00017"></a>00017 <span class="comment"> *                                                                         *</span>
<a name="l00018"></a>00018 <span class="comment"> ***************************************************************************/</span>
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="preprocessor">#include "<a class="code" href="nodeparser_8h.html" title="Declaration of nodeparser object, which facilitiates searching for nodes in an XML...">nodeparser.h</a>"</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="keyword">using</span> std::string;
<a name="l00023"></a>00023 <span class="keyword">using</span> std::vector;
<a name="l00024"></a>00024 
<a name="l00025"></a><a class="code" href="classNodeParser.html#27485b1323433cd1f008fba38150cc89">00025</a> <a class="code" href="classNodeParser.html#547f49fdbfc9dc7a077459b2ba516329">NodeParser::NodeParser</a>(<span class="keyword">const</span> xmlpp::Node::NodeList&amp; list): xmlpp::Node::NodeList(list)
<a name="l00026"></a>00026 {
<a name="l00027"></a>00027 }
<a name="l00028"></a>00028 
<a name="l00029"></a><a class="code" href="classNodeParser.html#1e7806e95140ee7decf7785ed990d179">00029</a> <a class="code" href="classNodeParser.html#547f49fdbfc9dc7a077459b2ba516329">NodeParser::NodeParser</a>(<span class="keyword">const</span> xmlpp::Node* node)
<a name="l00030"></a>00030 {
<a name="l00031"></a>00031   push_back(const_cast&lt;xmlpp::Node*&gt;(node));
<a name="l00032"></a>00032 }
<a name="l00033"></a>00033 
<a name="l00034"></a><a class="code" href="classNodeParser.html#b7eb13cd7741bca26d493632149e65c8">00034</a> <a class="code" href="classNodeParser.html#547f49fdbfc9dc7a077459b2ba516329">NodeParser::NodeParser</a>(<span class="keyword">const</span> xmlpp::DomParser&amp; parser)
<a name="l00035"></a>00035 {
<a name="l00036"></a>00036   xmlpp::Node* node = parser.get_document()-&gt;get_root_node();
<a name="l00037"></a>00037   push_back(const_cast&lt;xmlpp::Node*&gt;(node));
<a name="l00038"></a>00038 }
<a name="l00039"></a>00039 
<a name="l00040"></a><a class="code" href="classNodeParser.html#ab69e8a0f74bdef4ea854b129274f618">00040</a> <a class="code" href="classNodeParser.html">NodeParser</a> <a class="code" href="classNodeParser.html#899d065f6bbb6bf7ef14be3ffeb5bb6e">NodeParser::Path</a>(<span class="keyword">const</span> xmlpp::Node* node,<span class="keyword">const</span> std::string&amp; path)
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042   <span class="comment">//std::cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; std::endl;</span>
<a name="l00043"></a>00043 
<a name="l00044"></a>00044   <a class="code" href="classNodeParser.html">NodeParser</a> result;
<a name="l00045"></a>00045   
<a name="l00046"></a>00046   <span class="comment">// split path string into the 1st level, and the rest</span>
<a name="l00047"></a>00047   std::string key = path;
<a name="l00048"></a>00048   std::string remainder;
<a name="l00049"></a>00049   std::string::size_type token_pos = path.find(<span class="charliteral">'/'</span>);
<a name="l00050"></a>00050   <span class="keywordflow">if</span> ( token_pos != std::string::npos )
<a name="l00051"></a>00051   {
<a name="l00052"></a>00052     key = path.substr(0, token_pos );
<a name="l00053"></a>00053     remainder = path.substr( token_pos + 1 );
<a name="l00054"></a>00054   }
<a name="l00055"></a>00055 
<a name="l00056"></a>00056   <span class="comment">// find the first level nodes that match</span>
<a name="l00057"></a>00057   xmlpp::Node::NodeList list = node-&gt;get_children();
<a name="l00058"></a>00058   <span class="keywordflow">for</span>(xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter)
<a name="l00059"></a>00059   {
<a name="l00060"></a>00060     <span class="keywordflow">if</span> ( (*iter)-&gt;get_name() == key )
<a name="l00061"></a>00061     {
<a name="l00062"></a>00062       <span class="comment">// if there is still some path left, ask for the rest of the path from those nodes.</span>
<a name="l00063"></a>00063       <span class="keywordflow">if</span> ( remainder.length() )
<a name="l00064"></a>00064       {
<a name="l00065"></a>00065         <a class="code" href="classNodeParser.html">NodeParser</a> remain_list = <a class="code" href="classNodeParser.html#547f49fdbfc9dc7a077459b2ba516329">NodeParser</a>(*iter).Path(remainder);
<a name="l00066"></a>00066         result.splice(result.end(),remain_list);
<a name="l00067"></a>00067       }
<a name="l00068"></a>00068       
<a name="l00069"></a>00069       <span class="comment">// otherwise add the node to the result list.</span>
<a name="l00070"></a>00070       <span class="keywordflow">else</span>
<a name="l00071"></a>00071         result.push_back(*iter);
<a name="l00072"></a>00072     }
<a name="l00073"></a>00073   }
<a name="l00074"></a>00074   
<a name="l00075"></a>00075   <span class="keywordflow">return</span> result;
<a name="l00076"></a>00076 }
<a name="l00077"></a>00077 
<a name="l00078"></a><a class="code" href="classNodeParser.html#899d065f6bbb6bf7ef14be3ffeb5bb6e">00078</a> <a class="code" href="classNodeParser.html">NodeParser</a> <a class="code" href="classNodeParser.html#899d065f6bbb6bf7ef14be3ffeb5bb6e">NodeParser::Path</a>(<span class="keyword">const</span> std::string&amp; path)<span class="keyword"> const</span>
<a name="l00079"></a>00079 <span class="keyword"></span>{
<a name="l00080"></a>00080   <span class="comment">//std::cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; std::endl;</span>
<a name="l00081"></a>00081   <a class="code" href="classNodeParser.html">NodeParser</a> result;
<a name="l00082"></a>00082   
<a name="l00083"></a>00083   <span class="keywordflow">for</span>(const_iterator iter = begin(); iter != end(); ++iter)
<a name="l00084"></a>00084   {
<a name="l00085"></a>00085     <a class="code" href="classNodeParser.html">NodeParser</a> iter_list = <a class="code" href="classNodeParser.html#899d065f6bbb6bf7ef14be3ffeb5bb6e">Path</a>(*iter,path);
<a name="l00086"></a>00086     result.splice(result.end(),iter_list);
<a name="l00087"></a>00087   }
<a name="l00088"></a>00088 
<a name="l00089"></a>00089   <span class="keywordflow">return</span> result;
<a name="l00090"></a>00090 }
<a name="l00091"></a>00091 
<a name="l00092"></a><a class="code" href="classNodeParser.html#a94fa78e9dbb1495dbbb894bd712f6c0">00092</a> <a class="code" href="classNodeParser.html">NodeParser</a> <a class="code" href="classNodeParser.html#a94fa78e9dbb1495dbbb894bd712f6c0">NodeParser::Select</a>(<span class="keyword">const</span> std::string&amp; key, <span class="keyword">const</span> std::string&amp; value)<span class="keyword"> const</span>
<a name="l00093"></a>00093 <span class="keyword"></span>{
<a name="l00094"></a>00094   <span class="comment">//std::cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; std::endl;</span>
<a name="l00095"></a>00095   <a class="code" href="classNodeParser.html">NodeParser</a> result;
<a name="l00096"></a>00096   <span class="keywordflow">for</span>(const_iterator iter = begin(); iter != end(); ++iter)
<a name="l00097"></a>00097   {
<a name="l00098"></a>00098     xmlpp::Node::NodeList list = (*iter)-&gt;get_children();
<a name="l00099"></a>00099     <span class="keywordflow">for</span>(xmlpp::Node::NodeList::const_iterator iter3 = list.begin(); iter3 != list.end(); ++iter3)
<a name="l00100"></a>00100     {
<a name="l00101"></a>00101       <span class="keywordflow">if</span> ( (*iter3)-&gt;get_name() == key )
<a name="l00102"></a>00102       {
<a name="l00103"></a>00103         xmlpp::Node::NodeList list = (*iter3)-&gt;get_children();
<a name="l00104"></a>00104         <span class="keywordflow">for</span>(xmlpp::Node::NodeList::const_iterator iter4 = list.begin(); iter4 != list.end(); ++iter4)
<a name="l00105"></a>00105         {
<a name="l00106"></a>00106           <span class="keyword">const</span> xmlpp::TextNode* nodeText = <span class="keyword">dynamic_cast&lt;</span><span class="keyword">const </span>xmlpp::TextNode*<span class="keyword">&gt;</span>(*iter4);
<a name="l00107"></a>00107           <span class="keywordflow">if</span> ( nodeText &amp;&amp; nodeText-&gt;get_content() == value )
<a name="l00108"></a>00108               result.push_back(*iter);
<a name="l00109"></a>00109             <span class="keywordflow">break</span>;
<a name="l00110"></a>00110         }
<a name="l00111"></a>00111       }
<a name="l00112"></a>00112     }
<a name="l00113"></a>00113   }
<a name="l00114"></a>00114   <span class="keywordflow">return</span> result;
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116 
<a name="l00117"></a><a class="code" href="classNodeParser.html#d440a4c00af75a6e0ad0a932d78add39">00117</a> vector&lt;string&gt; <a class="code" href="classNodeParser.html#d440a4c00af75a6e0ad0a932d78add39">NodeParser::Text</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span>
<a name="l00118"></a>00118 <span class="keyword"></span>{
<a name="l00119"></a>00119   vector&lt;string&gt; result;
<a name="l00120"></a>00120   
<a name="l00121"></a>00121   <span class="comment">// Go through the list of nodes</span>
<a name="l00122"></a>00122   <span class="keywordflow">for</span>(xmlpp::Node::NodeList::const_iterator iter = begin(); iter != end(); ++iter)
<a name="l00123"></a>00123   {
<a name="l00124"></a>00124     <span class="comment">// Find the text child node, and print that</span>
<a name="l00125"></a>00125     xmlpp::Node::NodeList list = (*iter)-&gt;get_children();
<a name="l00126"></a>00126     <span class="keywordflow">for</span>(xmlpp::Node::NodeList::const_iterator iter2 = list.begin(); iter2 != list.end(); ++iter2)
<a name="l00127"></a>00127     {
<a name="l00128"></a>00128       <span class="keyword">const</span> xmlpp::TextNode* nodeText = <span class="keyword">dynamic_cast&lt;</span><span class="keyword">const </span>xmlpp::TextNode*<span class="keyword">&gt;</span>(*iter2);
<a name="l00129"></a>00129       <span class="keywordflow">if</span> ( nodeText )
<a name="l00130"></a>00130       {
<a name="l00131"></a>00131         result.push_back(nodeText-&gt;get_content());
<a name="l00132"></a>00132       }
<a name="l00133"></a>00133     }
<a name="l00134"></a>00134   }
<a name="l00135"></a>00135   <span class="keywordflow">if</span> ( result.empty() )
<a name="l00136"></a>00136     result.push_back(<span class="keywordtype">string</span>());
<a name="l00137"></a>00137   <span class="keywordflow">return</span> result;
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139 
<a name="l00140"></a>00140 <span class="comment">// vim:cin:si:ai:et:ts=2:sw=2:</span>
</pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Mon Nov 19 20:27:58 2007 for LibOFX by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.3 </small></address>
</body>
</html>