boost::property_tree передает поддерево, включая ‹xmlattr›

Я пытаюсь передать элементы boost::property_tree::ptree функции. Подробно, я должен следовать XML-коду, из которого инициализируется ptree:

<Master Name='gamma'>
    <Par1 Name='name1'>
        <Value>0.</Value>
        <Fix>1</Fix>
    </Par1>
    <Par2 Name='name2'>
        <Value>0.</Value>
        <Fix>1</Fix>
    </Par2>
</Master>

Я хотел бы передать часть этого функции. В основном я хочу пройти:

   <Par2 Name='name2'>
        <Value>0.</Value>
        <Fix>1</Fix>
    </Par2>

Функция может выглядеть так:

 void processTree( which_type_do_I_put_here element ){
     std::string n = element.get<std::string>("<xmlattr>.Name");
     double val = element.get<double>("Value");
 }

В общем, я мог передать поддерево, используя ptree::get_child("par2"). Недостатком этого является то, что функция не имеет доступа к <xmlattr> этого узла.

Как я могу передать эту часть дерева с доступом к <xmlattr>? Заранее спасибо за любые идеи.

~ Питер


person hansgans    schedule 24.02.2017    source источник
comment
<xmlattr> ничего особенного, это просто дочернее дерево. Таким образом, get_child("par2") просто возвращает дерево, имеющее <xmlattr> дочерних дерева.   -  person zett42    schedule 25.02.2017


Ответы (1)


Тип ptree.

В общем, я мог передать поддерево, используя ptree::get_child("par2").

Верно.

Недостатком этого является то, что функция не имеет доступа к этому узлу.

Это не правильно:

Прямой эфир на Coliru

#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

std::string const sample = R"(
<Master Name='gamma'>
    <Par1 Name='name1'>
        <Value>0.</Value>
        <Fix>1</Fix>
    </Par1>
    <Par2 Name='name2'>
        <Value>0.</Value>
        <Fix>1</Fix>
    </Par2>
</Master>
)";

using boost::property_tree::ptree;

void processTree(ptree const& element) {
     std::string n = element.get<std::string>("<xmlattr>.Name");

     double val = element.get<double>("Value");
     std::cout << __FUNCTION__ << ": n=" << n << " val=" << val << "\n";
}

int main() {
    ptree pt;
    {
        std::istringstream iss(sample);
        read_xml(iss, pt);
    }

    processTree(pt.get_child("Master.Par2"));
}

Что печатает:

processTree: n=name2 val=0
person sehe    schedule 24.02.2017
comment
Работает как шарм. Я пытался реализовать это раньше, и по некоторым причинам, которые я не помню, это не сработало. Большое спасибо! - person hansgans; 25.02.2017