2016-09-07 3 views
-1

Я хочу сделать функцию, которая находит последний элемент в буст :: property_tree :: Ptree и возвращает его в качестве Ptreeкак вернуть последний элемент наддува Ptree

Я следующий код, который находит последний элемент, однако я не знаю, как передать его ptree как возвращаемое значение - это должно быть возможно, однако я не нашел примеров, которые возвращают ptree без первого его копирования.

Причина желания это, чтобы быть в состоянии обрабатывать обновления последнего элемента с новыми значениями

BOOST_FOREACH(boost::property_tree::ptree::value_type const&rowPair, pt.get_child("")) 
{ 
    cout << rowPair.first << ": " << endl; 

    BOOST_REVERSE_FOREACH(boost::property_tree::ptree::value_type const& itemPair, rowPair.second) 
    { 
      std::cout << "\t" << itemPair.first << " "; 

      BOOST_FOREACH(boost::property_tree::ptree::value_type const& node, itemPair.second) 
      { 
        std::cout << node.second.get_value<std::string>() << " "; 
      } 

      std::cout << std::endl; 
      //TODO: return itemPair 
      break; 
    } 


    std::cout << std::endl; 
} 

Пытаясь прояснить это немного больше. следующие строки кода добавляет к уже существующей записи

pt.insert(pt.get_child("item").end(), subpt.front()); 

это прекрасно работает, если Items.item есть только один элемент, однако, если он имеет несколько «элементов» и несколько «пункт» в пунктах, то он будет вставить новый запись в первый Items.item

<xml> 
<listOfItems> 
<Items> 
    <item> 
    </item> 
    <item> 
    ... inserts new sub pt here 
    </item> 
</Items> 
<Items> 
    <item> 
    </item> 
    <item> 
    ... Should insert new sub pt here 
    </item> 
</Items> 
</listOfItems> 

так, чтобы получить то, что я хочу, я что-то должен сделать заявление вставки лучше или создать функцию, которая может дать мне правильный элемент, а затем вставить в него

+1

Что вы имеете в виду под "копированием"? и что происходит, когда вы просто «возвращаете» элемент, который вы нашли? – UnholySheep

+3

Я предполагаю, что этот код должен находиться в отдельной функции (иначе это не имеет особого смысла в * возвращении чего-то)? Затем вы передаете 'pt' в качестве аргумента функции? если да, то что вам мешает вам просто делать это? 'return itemPair'? –

+0

Да, очевидно, это должно быть в отдельной функции. Первоначально у меня было что-то вроде этого: pt.insert (pt.get_child ("Items.item"). End(), subpt.front()); - это приведет к обновлению Items.item с добавлением к нему нового подпакета, однако, если у меня было несколько записей элементов, оно всегда добавляется к первому элементу в списке Items, следовательно, необходимо найти и указать на последнюю запись – serup

ответ

0

нашли решение:

<?xml version="1.0" encoding="utf-8"?> 
<listOfItems> 
<Items> 
    <Item> </Item> 
    <Item> </Item> 
    <Item> </Item> 
    <Item> </Item> 
</Items> 
<Items> 
    <Item> </Item> 
    <Item> </Item> 
    <Item> </Item> 
    <Item> </Item> 
    insert here... 
</Items> 
</listOfItems> 

...

boost::property_tree::ptree::value_type findLastItem(boost::property_tree::ptree pt) 
{ 
    ptree _empty_tree; 
    BOOST_REVERSE_FOREACH(ptree::value_type &v2, pt.get_child("listOfItems", _empty_tree)) 
    { 
    if(v2.first == "Items") 
    { 
     BOOST_REVERSE_FOREACH(ptree::value_type &v3, v2.second) 
     { 
      if(v3.first == "Item"){ 
       cout << "- OK: Found Last Item " << endl; 
       return v3; // then use add_child on this to append a new item 
      } 
     } 
    } 
    } 
} 
+0

Я признаю, что мой первоначальный вопрос - это заработная плата. Думаю, я действительно не полностью понял проблему - решение можно использовать, однако я бы хотел, чтобы oneliner вместо этого использования нескольких заявлений BOOST – serup

+0

может ли кто-нибудь показать лучшее решение? – serup