2016-09-07 14 views
-1

を戻します戻り値としてptreeを渡す方法はわかりません。可能であれば、最初にコピーすることなくptreeを返す例は見つかりませんでした。これを望むためどのように私は、しかし、私はブースト:: property_tree :: ptreeでの最後の項目を見つけ、私は最後の項目を見つけたコードを以下のいる</p> <p>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; 
} 

と最後の項目の更新を処理できるようにすることです。 次のコード行は、それがアイテムに、それは新しい挿入する複数の「アイテム」と複数の「アイテム」を持っているがあれば、Items.itemは一つだけのアイテムを持っている場合、これは完璧に動作し、既存のエントリ

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

に追加しますそのために、最初の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> 

のエントリは、私が何とか良くINSERT文を作るか、私に正しいアイテムを与えることができる関数を作成し、それ

+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

私は私の最初の質問が賃金だったと認めます - 私は本当に問題を完全には把握していなかったと思います。複数のBOOSTステートメントを使用する代わりに、oneliner – serup

+0

誰かがより良いソリューションを表示できますか? – serup

関連する問題