--- a/src/XMLDocumentConstructor.h Sun Nov 22 17:11:12 2020 +0100
+++ b/src/XMLDocumentConstructor.h Sun Nov 22 17:39:10 2020 +0100
@@ -16,11 +16,61 @@
*/
#pragma once
+#include <libxml++-2.6/libxml++/libxml++.h>
+
+#include "lib/INIReader.h"
+#include "lib/XMLNameCodec.h"
+
namespace relpipe {
namespace in {
namespace xmltable {
-#include <libxml++-2.6/libxml++/libxml++.h>
+class HierarchicalINIContentHandler : public INIContentHandler {
+private:
+ xmlpp::DomParser* domParser;
+ wstring_convert < codecvt_utf8<wchar_t>> convertor; // INI parser works with UTF-8
+public:
+
+ HierarchicalINIContentHandler(xmlpp::DomParser* domParser) : domParser(domParser) {
+ }
+
+ virtual ~HierarchicalINIContentHandler() {
+ }
+
+ void startDocument() override {
+ domParser->get_document()->create_root_node("ini");
+ domParser->get_document()->get_root_node()->add_child("startDocument");
+ // there should be only one document
+ };
+
+ void endDocument() override {
+ domParser->get_document()->get_root_node()->add_child("endDocument");
+ };
+
+ void startSection(const SectionStartEvent& event) override {
+ xmlpp::Element* node = domParser->get_document()->get_root_node()->add_child("startSection");
+ node->add_child("name")->add_child_text(event.name);
+ node->add_child("comment")->add_child_text(event.comment);
+ node->add_child("line-number")->add_child_text(std::to_string(event.lineNumber));
+ node->add_child("event-number")->add_child_text(std::to_string(event.eventNumber));
+ };
+
+ void endSection() override {
+ domParser->get_document()->get_root_node()->add_child("endSection");
+ };
+
+ void entry(const EntryEvent& event) override {
+ xmlpp::Element* node = domParser->get_document()->get_root_node()->add_child("entry");
+ node->add_child("key")->add_child_text(event.key);
+ node->add_child("sub-key")->add_child_text(event.subKey);
+ node->add_child("full-key")->add_child_text(event.fullKey);
+ node->add_child("value")->add_child_text(event.value);
+ node->add_child("comment")->add_child_text(event.comment);
+ node->add_child("line-number")->add_child_text(std::to_string(event.lineNumber));
+ node->add_child("event-number")->add_child_text(std::to_string(event.eventNumber));
+ };
+
+};
class XMLDocumentConstructor {
private:
@@ -32,10 +82,13 @@
}
void process() {
- parser->parse_stream(*input);
+ HierarchicalINIContentHandler handler(parser);
+ std::shared_ptr<INIReader> reader(INIReader::create(*input));
+ reader->addHandler(&handler);
+ reader->process();
}
};
}
}
-}
\ No newline at end of file
+}