Kaynağa Gözat

Extended XMLReader class (incomplete)

- "read" method now merges parsed xml nodes, still buggy, since not all children
are merged together yet
pcmattulat 4 yıl önce
ebeveyn
işleme
7e22743f03
2 değiştirilmiş dosya ile 40 ekleme ve 2 silme
  1. 37 1
      source/io/xml/XMLReader.cpp
  2. 3 1
      source/io/xml/XMLReader.hpp

+ 37 - 1
source/io/xml/XMLReader.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-10-10
- * Changed:         2020-10-18
+ * Changed:         2020-10-19
  *
  * */
 
@@ -26,6 +26,7 @@ ls_std::byte_field ls_std::XMLReader::read()
 {
   ls_std::byte_field data = ls_std::FileReader {this->xmlFile}.read();
   this->_parse(data);
+  this->_mergeNodes();
   this->_reset();
 
   return data;
@@ -178,6 +179,41 @@ void ls_std::XMLReader::_isOpeningTag(const ls_std::byte_field &_data, std::stri
   }
 }
 
+void ls_std::XMLReader::_mergeNodes()
+{
+  while(this->maxLevel > 1) {
+    this->_mergeNodesOnCurrentLevel();
+    this->maxLevel -= 1;
+  }
+
+  this->document->setRootElement(this->parseData.front().node);
+}
+
+void ls_std::XMLReader::_mergeNodesOnCurrentLevel() {
+  auto iterator = this->parseData.begin();
+  uint8_t parentLevel {};
+
+  while(iterator != this->parseData.end()) {
+    parentLevel = this->maxLevel - 1;
+
+    if(iterator->level == parentLevel) {
+      std::shared_ptr<ls_std::XMLNode> parent = iterator->node;
+
+      do {
+        iterator++;
+
+        if(iterator != this->parseData.end() && iterator->level == this->maxLevel) {
+          parent->addChildToEnd(iterator->node);
+        }
+      }
+      while(iterator->level == this->maxLevel);
+    }
+    else {
+      iterator++;
+    }
+  }
+}
+
 void ls_std::XMLReader::_parse(const ls_std::byte_field &_data)
 {
   for(std::string::size_type index = 0 ; index < _data.size() ; index++) {

+ 3 - 1
source/io/xml/XMLReader.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-10-08
- * Changed:         2020-10-18
+ * Changed:         2020-10-19
  *
  * */
 
@@ -59,6 +59,8 @@ namespace ls_std {
       void _isClosingTag(const ls_std::byte_field& _data, std::string::size_type _index);
       void _isDeclaration(const ls_std::byte_field& _data, std::string::size_type _index);
       void _isOpeningTag(const ls_std::byte_field& _data, std::string::size_type _index);
+      void _mergeNodes();
+      void _mergeNodesOnCurrentLevel();
       void _parse(const ls_std::byte_field& _data);
       static std::pair<std::string, std::string> _parseAttribute(const ls_std::byte_field& _data);
       static std::list<std::pair<std::string, std::string>> _parseAttributes(ls_std::byte_field _data);