LibOFX
nodeparser.cpp
Go to the documentation of this file.
1/***************************************************************************
2 nodeparser.cpp
3 -------------------
4 copyright : (C) 2005 by Ace Jones
5 email : acejones@users.sourceforge.net
6***************************************************************************/
11/***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 * *
18 ***************************************************************************/
19
20#include "nodeparser.h"
21
22using std::string;
23using std::vector;
24
25NodeParser::NodeParser(const xmlpp::Node::NodeList& list): xmlpp::Node::NodeList(list)
26{
27}
28
29NodeParser::NodeParser(const xmlpp::Node* node)
30{
31 push_back(const_cast<xmlpp::Node*>(node));
32}
33
34NodeParser::NodeParser(const xmlpp::DomParser& parser)
35{
36 xmlpp::Node* node = parser.get_document()->get_root_node();
37 push_back(const_cast<xmlpp::Node*>(node));
38}
39
40NodeParser NodeParser::Path(const xmlpp::Node* node, const std::string& path)
41{
42 //std::cout << __PRETTY_FUNCTION__ << std::endl;
43
44 NodeParser result;
45
46 // split path string into the 1st level, and the rest
47 std::string key = path;
48 std::string remainder;
49 std::string::size_type token_pos = path.find('/');
50 if ( token_pos != std::string::npos )
51 {
52 key = path.substr(0, token_pos );
53 remainder = path.substr( token_pos + 1 );
54 }
55
56 // find the first level nodes that match
57 xmlpp::Node::NodeList list = node->get_children();
58 for (xmlpp::Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter)
59 {
60 if ( (*iter)->get_name() == key )
61 {
62 // if there is still some path left, ask for the rest of the path from those nodes.
63 if ( remainder.length() )
64 {
65 NodeParser remain_list = NodeParser(*iter).Path(remainder);
66 result.splice(result.end(), remain_list);
67 }
68
69 // otherwise add the node to the result list.
70 else
71 result.push_back(*iter);
72 }
73 }
74
75 return result;
76}
77
78NodeParser NodeParser::Path(const std::string& path) const
79{
80 //std::cout << __PRETTY_FUNCTION__ << std::endl;
81 NodeParser result;
82
83 for (const_iterator iter = begin(); iter != end(); ++iter)
84 {
85 NodeParser iter_list = Path(*iter, path);
86 result.splice(result.end(), iter_list);
87 }
88
89 return result;
90}
91
92NodeParser NodeParser::Select(const std::string& key, const std::string& value) const
93{
94 //std::cout << __PRETTY_FUNCTION__ << std::endl;
95 NodeParser result;
96 for (const_iterator iter = begin(); iter != end(); ++iter)
97 {
98 xmlpp::Node::NodeList list2 = (*iter)->get_children();
99 for (xmlpp::Node::NodeList::const_iterator iter3 = list2.begin(); iter3 != list2.end(); ++iter3)
100 {
101 if ( (*iter3)->get_name() == key )
102 {
103 xmlpp::Node::NodeList list3 = (*iter3)->get_children();
104 for (xmlpp::Node::NodeList::const_iterator iter4 = list3.begin(); iter4 != list3.end(); ++iter4)
105 {
106 const xmlpp::TextNode* nodeText = dynamic_cast<const xmlpp::TextNode*>(*iter4);
107 if ( nodeText && nodeText->get_content() == value )
108 result.push_back(*iter);
109 break;
110 }
111 }
112 }
113 }
114 return result;
115}
116
117vector<string> NodeParser::Text(void) const
118{
119 vector<string> result;
120
121 // Go through the list of nodes
122 for (xmlpp::Node::NodeList::const_iterator iter = begin(); iter != end(); ++iter)
123 {
124 // Find the text child node, and print that
125 xmlpp::Node::NodeList list = (*iter)->get_children();
126 for (xmlpp::Node::NodeList::const_iterator iter2 = list.begin(); iter2 != list.end(); ++iter2)
127 {
128 const xmlpp::TextNode* nodeText = dynamic_cast<const xmlpp::TextNode*>(*iter2);
129 if ( nodeText )
130 {
131 result.push_back(nodeText->get_content());
132 }
133 }
134 }
135 if ( result.empty() )
136 result.push_back(string());
137 return result;
138}
139
140// vim:cin:si:ai:et:ts=2:sw=2:
Declaration of nodeparser object, which facilitates searching for nodes in an XML file using a notati...