1 /* $Id: router_flexml.hpp,v 1.1 2005-10-26 14:12:00 marc Exp $
2 Copyright (c) 2005, Index Data.
10 #include <libxml/xmlversion.h>
11 #include <libxml/parser.h>
12 #include <libxml/tree.h>
13 #include <libxml/xmlIO.h>
14 #include <libxml/xmlreader.h>
15 //#include <libxslt/transform.h>
24 RouterFleXML(std::string xmlconf)
25 : m_xmlconf(""), m_xinclude(false), m_xmlconf_doc(0)
33 = xmlParseMemory(m_xmlconf.c_str(), m_xmlconf.size());
35 parse_xml_config_dom();
36 //parse_xml_config_xmlreader();
40 xmlFreeDoc(m_xmlconf_doc);
45 std::string m_xmlconf;
47 xmlDoc * m_xmlconf_doc;
49 void xml_dom_error ( xmlNode* node, std::string msg)
51 std::cerr << "ERROR: " << msg << " "
56 void parse_xml_config_dom() {
59 xmlNode* root = xmlDocGetRootElement(m_xmlconf_doc);
61 if (std::string((const char *) root->name) != "yp2")
62 xml_dom_error(root, "expected <yp2>, got ");
65 for (const struct _xmlAttr *attr = root->properties; attr; attr = attr->next)
67 if (std::string((const char *)attr->name) == "xmlns")
69 const xmlNode *val = attr->children;
70 //BOOST_CHECK_EQUAL(val->type, XML_TEXT_NODE);
71 if (std::string((const char *)val->content)
72 != "http://indexdata.dk/yp2/config/1")
74 "expected xmlns=\"http://indexdata.dk/yp2/config/1\", got ");
77 std::cout << "GOT HERE" << std::endl;
84 void parse_xml_config_xmlreader() {
86 xmlTextReader* reader;
87 //reader->SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1);
89 //reader = xmlReaderForFile(m_xmlconf.c_str(), NULL, 0);
90 reader = xmlReaderWalker(m_xmlconf_doc);
93 std::cerr << "failed to read XML config file "
95 << m_xmlconf << std::endl;
100 // root element processing
101 xml_progress_deep_to_element(reader);
102 if (std::string("yp2") != (const char*)xmlTextReaderConstName(reader))
103 xml_error(reader, "root element must be named <yp2>");
105 std::cout << "<" << xmlTextReaderConstName(reader);
107 //if (xmlTextReaderHasAttributes(reader))
108 //if ((!xmlTextReaderMoveToAttributeNs(reader, NULL,
109 // (const xmlChar*)"http://indexdata.dk/yp2/config/1" )))
110 if ((!xmlTextReaderMoveToFirstAttribute(reader))
111 || (! xmlTextReaderIsNamespaceDecl(reader))
112 || (std::string("http://indexdata.dk/yp2/config/1")
113 != (const char*)xmlTextReaderConstValue(reader)))
114 xml_error(reader, "expected root element <yp2> in namespace "
115 "'http://indexdata.dk/yp2/config/1'");
117 std::cout << " " << xmlTextReaderConstName(reader) << "=\""
118 << xmlTextReaderConstValue(reader) << "\">"
119 //<< xmlTextReaderIsNamespaceDecl(reader)
123 // start element processing
124 xml_progress_deep_to_element(reader);
125 if (std::string("start") != (const char*)xmlTextReaderConstName(reader)
126 || !xmlTextReaderMoveToFirstAttribute(reader)
127 || std::string("route") != (const char*)xmlTextReaderConstName(reader)
129 xml_error(reader, "start element <start route=\"route_id\"/> expected");
131 std::cout << "<start " << xmlTextReaderConstName(reader) << "=\""
132 << xmlTextReaderConstValue(reader) << "\"/>" << std::endl;
133 //<< xmlTextReaderGetAttribute(reader, (const xmlChar *)"route")
136 // filters element processing
137 xml_progress_flat_to_element(reader);
139 if (std::string("filters") != (const char*)xmlTextReaderConstName(reader)
141 xml_error(reader, "filters element <filters> expected");
143 std::cout << "<filters>" << std::endl;
146 // filter element processing
147 xml_progress_deep_to_element(reader);
148 if (std::string("filter") != (const char*)xmlTextReaderConstName(reader)
150 xml_error(reader, "filter element <filter id=\"some_id\" "
151 "type=\"some_type\"/> expected");
153 while (std::string("filter") == (const char*)xmlTextReaderConstName(reader)){
154 std::string filter_id;
155 std::string filter_type;
156 if (!xmlTextReaderMoveToFirstAttribute(reader)
157 || std::string("id") != (const char*)xmlTextReaderConstName(reader))
158 xml_error(reader, "filter element <filter id=\"some_id\" "
159 "type=\"some_type\"/> expected");
160 filter_id = (const char*)xmlTextReaderConstValue(reader);
161 if (!xmlTextReaderMoveToNextAttribute(reader)
162 || std::string("type") != (const char*)xmlTextReaderConstName(reader))
163 xml_error(reader, "filter element <filter id=\"some_id\" "
164 "type=\"some_type\"/> expected");
165 filter_type = (const char*)xmlTextReaderConstValue(reader);
166 std::cout << "<filter id=\"" << filter_id
167 << "\" type=\"" << filter_type << "\"/>"
169 xml_progress_flat_to_element(reader);
172 std::cout << "</filters>" << std::endl;
175 // routes element processing
176 // xml_progress_flat_to_element(reader);
177 if (std::string("routes") != (const char*)xmlTextReaderConstName(reader)
179 xml_error(reader, "routes element <routes> expected");
181 std::cout << "<routes>" << std::endl;
182 // route element processing
183 xml_progress_deep_to_element(reader);
184 if (std::string("route") != (const char*)xmlTextReaderConstName(reader)
186 xml_error(reader, "route element <route id=\"some_id\" "
187 "type=\"some_type\"/> expected");
188 while (std::string("route") == (const char*)xmlTextReaderConstName(reader)){
189 std::string route_id;
190 if (!xmlTextReaderMoveToFirstAttribute(reader)
191 || std::string("id") != (const char*)xmlTextReaderConstName(reader))
192 xml_error(reader, "route element <route id=\"some_id\"/> expected");
193 route_id = (const char*)xmlTextReaderConstValue(reader);
196 std::cout << "<route id=\"" << route_id << "\">" << std::endl;
197 std::cout << "</route>" << std::endl;
198 xml_progress_flat_to_element(reader);
201 std::cout << "</routes>" << std::endl;
203 std::cout << "</yp2>" << std::endl;
205 xml_debug_print(reader);
208 // freeing C xml reader libs
209 xmlFreeTextReader(reader);
211 std::cerr << "Parsing failed of XML configuration"
213 << m_xmlconf << std::endl;
218 void xml_error ( xmlTextReader* reader, std::string msg)
220 std::cerr << "ERROR: " << msg << " "
221 << xmlTextReaderGetParserLineNumber(reader) << ":"
222 << xmlTextReaderGetParserColumnNumber(reader) << " "
223 << xmlTextReaderConstName(reader) << " "
224 << xmlTextReaderDepth(reader) << " "
225 << xmlTextReaderNodeType(reader) << std::endl;
228 void xml_debug_print ( xmlTextReader* reader)
230 // processing all other elements
231 //while (xmlTextReaderMoveToElement(reader)) // reads next element ??
232 //while (xmlTextReaderNext(reader)) //does not descend, keeps level
233 while (xmlTextReaderRead(reader)) // descends into all subtree nodes
234 std::cout << xmlTextReaderGetParserLineNumber(reader) << ":"
235 << xmlTextReaderGetParserColumnNumber(reader) << " "
236 << xmlTextReaderDepth(reader) << " "
237 << xmlTextReaderNodeType(reader) << " "
238 << "ConstName " << xmlTextReaderConstName(reader) << " "
242 bool xml_progress_deep_to_element(xmlTextReader* reader)
245 while(xmlTextReaderRead(reader)
246 && xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE
247 && !( xmlTextReaderNodeType(reader)
248 == XML_READER_TYPE_END_ELEMENT
249 && 0 == xmlTextReaderDepth(reader))
255 bool xml_progress_flat_to_element(xmlTextReader* reader)
259 while(xmlTextReaderNext(reader)
260 && xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE
261 && !( xmlTextReaderNodeType(reader)
262 == XML_READER_TYPE_END_ELEMENT
263 && 0 == xmlTextReaderDepth(reader))
280 * indent-tabs-mode: nil
281 * c-file-style: "stroustrup"
283 * vim: shiftwidth=4 tabstop=8 expandtab