-/* $Id: ex_libxml2_conf.cpp,v 1.2 2005-10-25 09:06:44 marc Exp $
+/* $Id: ex_libxml2_conf.cpp,v 1.3 2005-10-25 13:42:44 marc Exp $
Copyright (c) 2005, Index Data.
%LICENSE%
}
- // skipping pi, comments, text nodes ... untilt root element
- //while((ret = xmlTextReaderRead(reader))
- //&& 0 == xmlTextReaderDepth(reader)
- //&& xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE
- //)
- //std::cout << xmlTextReaderConstName(reader) << std::endl;
-
// root element processing
- if ((ret = xmlTextReaderMoveToElement(reader)))
- std::cout << xmlTextReaderConstName(reader) << std::endl;
+ xml_progress_deep_to_element(reader);
+ if (std::string("yp2") != (const char*)xmlTextReaderConstName(reader))
+ xml_error(reader, "root element must be named <yp2>");
+
+ std::cout << "<" << xmlTextReaderConstName(reader);
+
//if (xmlTextReaderHasAttributes(reader))
- // std::cout << "AttributeCount "
- // << xmlTextReaderAttributeCount(reader) << std::endl;
+ //if ((!xmlTextReaderMoveToAttributeNs(reader, NULL,
+ // (const xmlChar*)"http://indexdata.dk/yp2/config/1" )))
+ if ((!xmlTextReaderMoveToFirstAttribute(reader))
+ || (! xmlTextReaderIsNamespaceDecl(reader))
+ || (std::string("http://indexdata.dk/yp2/config/1")
+ != (const char*)xmlTextReaderConstValue(reader)))
+ xml_error(reader, "expected root element <yp2> in namespace "
+ "'http://indexdata.dk/yp2/config/1'");
- while (xmlTextReaderMoveToNextAttribute(reader))
- std::cout << xmlTextReaderConstName(reader) << " "
- << xmlTextReaderConstValue(reader) << " "
- //<< xmlTextReaderNodeType(reader) << " "
- //<< xmlTextReaderDepth(reader) << " "
- << std::endl;
+ std::cout << " " << xmlTextReaderConstName(reader) << "=\""
+ << xmlTextReaderConstValue(reader) << "\">"
+ //<< xmlTextReaderIsNamespaceDecl(reader)
+ << std::endl;
- // processing all other elements
- while ((ret = xmlTextReaderRead(reader)))
- std::cout << xmlTextReaderConstName(reader) << " "
- << xmlTextReaderDepth(reader) << " "
- << xmlTextReaderNodeType(reader) << std::endl;
+
+ // start element processing
+ xml_progress_deep_to_element(reader);
+ if (std::string("start") != (const char*)xmlTextReaderConstName(reader)
+ || !xmlTextReaderMoveToFirstAttribute(reader)
+ || std::string("route") != (const char*)xmlTextReaderConstName(reader)
+ )
+ xml_error(reader, "start element <start route=\"route_id\"/> expected");
+
+ std::cout << "<start " << xmlTextReaderConstName(reader) << "=\""
+ << xmlTextReaderConstValue(reader) << "\"/>" << std::endl;
+ //<< xmlTextReaderGetAttribute(reader, (const xmlChar *)"route")
+
+
+ // filters element processing
+ xml_progress_flat_to_element(reader);
+ if (std::string("filters") != (const char*)xmlTextReaderConstName(reader)
+ )
+ xml_error(reader, "filters element <filters> expected");
+
+ std::cout << "<filters>" << std::endl;
+
+
+ // filter element processing
+ xml_progress_deep_to_element(reader);
+ if (std::string("filter") != (const char*)xmlTextReaderConstName(reader)
+ )
+ xml_error(reader, "filter element <filter id=\"some_id\" "
+ "type=\"some_type\"/> expected");
+
+ while (std::string("filter") == (const char*)xmlTextReaderConstName(reader)){
+ std::string filter_id;
+ std::string filter_type;
+ if (!xmlTextReaderMoveToFirstAttribute(reader)
+ || std::string("id") != (const char*)xmlTextReaderConstName(reader))
+ xml_error(reader, "filter element <filter id=\"some_id\" "
+ "type=\"some_type\"/> expected");
+ filter_id = (const char*)xmlTextReaderConstValue(reader);
+ if (!xmlTextReaderMoveToNextAttribute(reader)
+ || std::string("type") != (const char*)xmlTextReaderConstName(reader))
+ xml_error(reader, "filter element <filter id=\"some_id\" "
+ "type=\"some_type\"/> expected");
+ filter_type = (const char*)xmlTextReaderConstValue(reader);
+ std::cout << "<filter id=\"" << filter_id
+ << "\" type=\"" << filter_type << "\"/>"
+ << std::endl;
+ xml_progress_flat_to_element(reader);
+ }
+
+ std::cout << "</filters>" << std::endl;
+
+
+ // routes element processing
+ // xml_progress_flat_to_element(reader);
+ if (std::string("routes") != (const char*)xmlTextReaderConstName(reader)
+ )
+ xml_error(reader, "routes element <routes> expected");
+
+ std::cout << "<routes>" << std::endl;
+ // route element processing
+ xml_progress_deep_to_element(reader);
+ if (std::string("route") != (const char*)xmlTextReaderConstName(reader)
+ )
+ xml_error(reader, "route element <route id=\"some_id\" "
+ "type=\"some_type\"/> expected");
+ while (std::string("route") == (const char*)xmlTextReaderConstName(reader)){
+ std::string route_id;
+ if (!xmlTextReaderMoveToFirstAttribute(reader)
+ || std::string("id") != (const char*)xmlTextReaderConstName(reader))
+ xml_error(reader, "route element <route id=\"some_id\"/> expected");
+ route_id = (const char*)xmlTextReaderConstValue(reader);
+
+
+ std::cout << "<route id=\"" << route_id << "\">" << std::endl;
+ std::cout << "</route>" << std::endl;
+
+ std::cout << "progress_flat " << xml_progress_flat_to_element(reader) << std::endl;
+
+ }
+
+
+ std::cout << "NOW: "<< xmlTextReaderGetParserLineNumber(reader) << ":"
+ << xmlTextReaderGetParserColumnNumber(reader) << " "
+ << xmlTextReaderDepth(reader) << " "
+ << xmlTextReaderNodeType(reader) << " "
+ << "ConstName " << xmlTextReaderConstName(reader) << " "
+ << std::endl;
+
+
+ std::cout << "</routes>" << std::endl;
+
+
+ // processing all other elements
+ //while ((ret = xmlTextReaderMoveToElement(reader))) // reads next element ??
+ //while ((ret = xmlTextReaderNext(reader))) //does not descend, keeps level
+ while ((ret = xmlTextReaderRead(reader))) // descends into all subtree nodes
+ std::cout << xmlTextReaderGetParserLineNumber(reader) << ":"
+ << xmlTextReaderGetParserColumnNumber(reader) << " "
+ << xmlTextReaderDepth(reader) << " "
+ << xmlTextReaderNodeType(reader) << " "
+ << "ConstName " << xmlTextReaderConstName(reader) << " "
+ //<< "Prefix " << xmlTextReaderPrefix(reader) << "\n"
+ //<< "XmlLang " << xmlTextReaderXmlLang(reader) << "\n"
+ //<< "NamespaceUri " << xmlTextReaderNamespaceUri(reader) << "\n"
+ //<< "BaseUri" << xmlTextReaderBaseUri(reader) << "\n"
+ << std::endl;
+
xmlFreeTextReader(reader);
if (ret != 0) {
std::exit(1);
}
}
+
+ void xml_error ( xmlTextReader* reader, std::string msg)
+ {
+ std::cerr << "ERROR: " << msg << " "
+ << xmlTextReaderGetParserLineNumber(reader) << ":"
+ << xmlTextReaderGetParserColumnNumber(reader) << " "
+ << xmlTextReaderConstName(reader) << " "
+ << xmlTextReaderDepth(reader) << " "
+ << xmlTextReaderNodeType(reader) << std::endl;
+ }
+
+ bool xml_progress_deep_to_element(xmlTextReader* reader)
+ {
+ bool ret = false;
+ while(xmlTextReaderRead(reader)
+ && xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE
+ )
+ ret = true;
+ return ret;
+ }
+ bool xml_progress_flat_to_element(xmlTextReader* reader)
+ {
+ bool ret = false;
+ //int depth = xmlTextReaderDepth(reader);
+
+ while(xmlTextReaderNext(reader)
+ //&& depth == xmlTextReaderDepth(reader)
+ && xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE
+ //&& xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT
+ ) {
+ ret = true;
+ std::cout << xmlTextReaderDepth(reader) << " "
+ << xmlTextReaderNodeType(reader) << std::endl;
+
+ }
+ return ret;
+ }
+
};