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 Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Data 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& 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<xmlpp::Node*>(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& parser)
<a name="l00035"></a>00035 {
<a name="l00036"></a>00036 xmlpp::Node* node = parser.get_document()->get_root_node();
<a name="l00037"></a>00037 push_back(const_cast<xmlpp::Node*>(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& path)
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042 <span class="comment">//std::cout << __PRETTY_FUNCTION__ << 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->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)->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& 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 << __PRETTY_FUNCTION__ << 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& key, <span class="keyword">const</span> std::string& 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 << __PRETTY_FUNCTION__ << 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)->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)->get_name() == key )
<a name="l00102"></a>00102 {
<a name="l00103"></a>00103 xmlpp::Node::NodeList list = (*iter3)->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<</span><span class="keyword">const </span>xmlpp::TextNode*<span class="keyword">></span>(*iter4);
<a name="l00107"></a>00107 <span class="keywordflow">if</span> ( nodeText && nodeText->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<string> <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<string> 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)->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<</span><span class="keyword">const </span>xmlpp::TextNode*<span class="keyword">></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->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
<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>
|