124 lines
3.6 KiB
C++
124 lines
3.6 KiB
C++
/***************************************************************************
|
|
|
|
source::worx xtree
|
|
Copyright © 2024-2025 c.holzheuer
|
|
christoph.holzheuer@gmail.com
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef ZNODE_FACTORY_H
|
|
#define ZNODE_FACTORY_H
|
|
|
|
#include <pugixml.hpp>
|
|
#include <znode.h>
|
|
|
|
class xtree;
|
|
|
|
/*
|
|
|
|
nodes: nackt also ungekaspselt?
|
|
-> children()
|
|
-> attributes()
|
|
|
|
attributes: ja was seid ihr denn? als string gelesen, als string geschrieben, aber dazwischen?
|
|
|
|
-> std::variant<bool...> mit enum type{t_bool = 0 ...};
|
|
-> conversion mit boost::lexical_cast<> bzw. std::to_string() und std::stoi(), std::stod()
|
|
-> beim parsen konvertieren? contains '.'? is_number?
|
|
-> betrifft tag_values und tag_attributes
|
|
-> vorher definieren? attribute 'voltage' == double, oder gar mehr: unit V, double, range
|
|
-> über xs:double?
|
|
|
|
model: muss ich wirklich jeden attibute node einzeln angeben?
|
|
|
|
*/
|
|
namespace znode
|
|
{
|
|
template<class str_t>
|
|
class znode_factory
|
|
{
|
|
|
|
public:
|
|
|
|
using str_cref = const str_t&;
|
|
|
|
using zshared_node = std::shared_ptr<zbasic_node<str_t>>;
|
|
|
|
znode_factory() = default;
|
|
virtual ~znode_factory() = default;
|
|
|
|
zshared_node load_tree( const std::string& filename )
|
|
{
|
|
|
|
pugi::xml_document tree_document;
|
|
// load document
|
|
pugi::xml_parse_result result = tree_document.load_file( filename.c_str() );
|
|
if( !result )
|
|
{
|
|
throw XQException( "znode_factory::load_tree: parse error: ", result.description() );
|
|
}
|
|
|
|
//MemberFunc func = &znode_factory::process_node;
|
|
//xtreewalker<znode_factory, MemberFunc> parser(this,func);
|
|
//_current_depth = -1;
|
|
//tree_document.traverse(parser);
|
|
|
|
//zbasic_node<str_t>* root_node = new zbasic_node<str_t>*("root!");
|
|
zshared_node root_node = zbasic_node<str_t>::make_node("root!");
|
|
//T root_node = T::make_node( "root!" );
|
|
|
|
// prepare root == model !?
|
|
pugi::xml_node tmp_node = tree_document.first_child();
|
|
while(tmp_node)
|
|
{
|
|
//qDebug() << " --- znode_factory building: " << tmp_node.name();
|
|
create_node( tmp_node, root_node );
|
|
tmp_node = tmp_node.next_sibling();
|
|
}
|
|
|
|
//znode::zmeas_para<QString>* xxx = new znode::zmeas_para<QString>("mookoo!");
|
|
//xxx->apply_command(42);
|
|
// _root_node->apply_command(42);
|
|
//size_t idx = _root_node->add_child( xxx);
|
|
//qDebug() << " jo: " << _root_node->child(idx)->tag_name();
|
|
|
|
return root_node;
|
|
}
|
|
|
|
protected:
|
|
|
|
void create_node(const pugi::xml_node& xml_node, zshared_node parent)
|
|
{
|
|
|
|
//T* new_node = new T( node.name(), node.child_value(), parent );
|
|
//parent->add_child( new_node );
|
|
|
|
//zbasic_node<str_t>* new_node = new zbasic_node<str_t>( node.name(), node.child_value(), parent );
|
|
zshared_node new_node = zbasic_node<str_t>::make_node( xml_node.name(), xml_node.child_value(), parent );
|
|
parent->add_child( new_node );
|
|
|
|
if( !xml_node.attributes().empty() )
|
|
{
|
|
for (pugi::xml_attribute attr: xml_node.attributes())
|
|
new_node->set_attribute( attr.name(), attr.value() );
|
|
}
|
|
|
|
if( !xml_node.children().empty() && std::string( xml_node.child_value() ).empty() )
|
|
{
|
|
for (pugi::xml_node child : xml_node.children())
|
|
create_node( child, new_node );
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif // ZNODE_FACTORY_H
|