From cb614665a8f96c7561d37b131c4561e66949417b Mon Sep 17 00:00:00 2001 From: Marc Cromme Date: Tue, 25 Oct 2005 13:42:44 +0000 Subject: [PATCH] parsing xml file --- src/ex_libxml2_conf.cpp | 187 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 164 insertions(+), 23 deletions(-) diff --git a/src/ex_libxml2_conf.cpp b/src/ex_libxml2_conf.cpp index 9ec8491..9b523ee 100644 --- a/src/ex_libxml2_conf.cpp +++ b/src/ex_libxml2_conf.cpp @@ -1,4 +1,4 @@ -/* $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% @@ -152,33 +152,136 @@ private: } - // 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 "); + + 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 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 expected"); + + std::cout << "" << 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 expected"); + + std::cout << "" << std::endl; + + + // filter element processing + xml_progress_deep_to_element(reader); + if (std::string("filter") != (const char*)xmlTextReaderConstName(reader) + ) + xml_error(reader, "filter element 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 expected"); + filter_id = (const char*)xmlTextReaderConstValue(reader); + if (!xmlTextReaderMoveToNextAttribute(reader) + || std::string("type") != (const char*)xmlTextReaderConstName(reader)) + xml_error(reader, "filter element expected"); + filter_type = (const char*)xmlTextReaderConstValue(reader); + std::cout << "" + << std::endl; + xml_progress_flat_to_element(reader); + } + + std::cout << "" << std::endl; + + + // routes element processing + // xml_progress_flat_to_element(reader); + if (std::string("routes") != (const char*)xmlTextReaderConstName(reader) + ) + xml_error(reader, "routes element expected"); + + std::cout << "" << std::endl; + // route element processing + xml_progress_deep_to_element(reader); + if (std::string("route") != (const char*)xmlTextReaderConstName(reader) + ) + xml_error(reader, "route element 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 expected"); + route_id = (const char*)xmlTextReaderConstValue(reader); + + + std::cout << "" << std::endl; + std::cout << "" << 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 << "" << 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) { @@ -187,8 +290,46 @@ private: 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; + } + }; -- 1.7.10.4