Передайте переменную в PUGIXML xml_tree_walker - PullRequest
0 голосов
/ 15 января 2019

Я использую pugixml для анализа файла. Я использую xml_tree_walker, и у меня есть переменная, которую я хочу изменить, когда ходок проходит по xml. В настоящее время я использую глобальную переменную, но не хочу. Есть ли способ передать переменную ходунку по ссылке? Если это так, значит ли это, что мне нужно изменить прототип функции for_each в источнике pugixml?

Ниже показано, как я сейчас использую ходунки.

struct simple_walker: pugi::xml_tree_walker
{
    virtual bool for_each(pugi::xml_node& node)
    {
        for (int i = 0; i < depth(); ++i) std::cout << "  "; // indentation

        std::cout << node_types[node.type()] << ": name='" << node.name() << "', value='" << node.value() << "'\n";

        some_global = node.name(); // I don't want this to be a global

        return true; // continue traversal
    }
};

Я так называю Уокера:

pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(XML_FILE);

simple_walker mySimpleWalker;
doc.traverse(mySimpleWalker);

1 Ответ

0 голосов
/ 15 января 2019

Одна вещь, которую вы можете сделать, это сохранить ссылку участника в вашем ходунке на объект, в котором вы собираете информацию. Что-то вроде:

struct captured_info // where my captured info goes
{
    std::string name;
    int value;
    std::time_t date;
    // ...
};

struct simple_walker: pugi::xml_tree_walker
{
    // must supply a captured_info object to satisfy
    // this constructor
    simple_walker(captured_info& info): info(info) {}

    virtual bool for_each(pugi::xml_node& node)
    {
        for (int i = 0; i < depth(); ++i) std::cout << "  "; // indentation

        std::cout << node_types[node.type()] << ": name='" << node.name() << "', value='" << node.value() << "'\n";

        info.name = node.name(); 
        info.value = std::stoi(node.value()); 
        // ... etc

        return true; // continue traversal
    }

    captured_info& info;
};


pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(XML_FILE);

captured_info info; // the output!!!
simple_walker mySimpleWalker(info); // configure for output
doc.traverse(mySimpleWalker);

std::cout << info.name << '\n'; // etc...
...