parsing xml file
authorMarc Cromme <marc@indexdata.dk>
Tue, 25 Oct 2005 13:42:44 +0000 (13:42 +0000)
committerMarc Cromme <marc@indexdata.dk>
Tue, 25 Oct 2005 13:42:44 +0000 (13:42 +0000)
src/ex_libxml2_conf.cpp

index 9ec8491..9b523ee 100644 (file)
@@ -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 <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) {
@@ -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;
+        }
     
+
 };