2011-07-11 19 views
29

Her şeyden önce, bunun nasıl yapıldığını anladığımı düşünüyorum ama kodum denediğim şekilde derlemeyecek. Benim varsayımımı this official example of empty ptree trick'a dayanarak yapıyorum.Yükseltme 1.46.1, Özellik Ağacı: ptree alt alt öğelerin alınmasıyla yineleme nasıl yapılır?

const ptree &settings = pt.get_child("settings", empty_ptree<ptree>()); 

ptree dışarı subptree almak mümkün olduğunu göstermektedir (veya olmalıdır): Orada bir sonraki satırını bulabilirsiniz.

BOOST_FOREACH(const boost::property_tree::ptree &v, 
    config.get_child("servecies")) 
{ 

} 

Ama olsun sonraki hata:

Error 1 error C2440: 'initializing' : cannot convert from 'std::pair<_Ty1,_Ty2>' to 'const boost::property_tree::ptree &'

veya Denersem

BOOST_FOREACH(boost::property_tree::ptree &v, 
    config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>())) 
{ 

} 

Yani biz böyle bir şekilde BOOST_FOREACH gibi bir şeyle ptree aracılığıyla yineleme varsaymışlardı

Anladım:

Error 1 error C2039: 'empty_ptree' : is not a member of 'boost::property_tree'

yüzden neler yapacağını: nasıl Boost Ptree aracılığıyla yineleme ve alt Ptrees alınır?

Güncelleme: Ben de denedim böyle kod Bu derler

BOOST_FOREACH(boost::property_tree::ptree::value_type &v, 
    config.get_child("path.to.array_of_objects")) 
{ 
    std::cout << "First data: " << v.first.data() << std::endl; 
    boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ; 
    BOOST_FOREACH(boost::property_tree::ptree::value_type &vs, 
     subtree) 
    { 
     std::cout << "Sub data: " << vs.first.data() << std::endl; 
    } 
} 

, herhangi exeptions atmak yok ama herhangi Sub data cout vermez, sadece bu döngünün aracılığıyla skeeps.

Güncelleme 2: Hımm ... şey muhtemelen benim xml yanlış gitti

- şimdi ben bu kodu ile doğru sonuçlar elde ederler.

cevap

30

özelliği ağaç yinelemeler formu tip ptree::value_type arasında (key, tree) çiftlerine etmektedir. Ben ilerlerken yalak JSON alt düğümlerle aynı problem vardı

BOOST_FOREACH(const ptree::value_type &v, pt.get_child(path)) { 
    // v.first is the name of the child. 
    // v.second is the child tree. 
} 
+0

benim sorunum ben nesnelerin dizisine çeşit olması. Bu yüzden örneğin { "servecie" için vardır: { "modül": [ "dosyasını", "Yönetici", "İK" ] } "servecie": { "modül": [ " " " Yönetici ", " HR " ] } ve her nesneyi pptree olarak seprate almam gerekiyor. Böyle bir şey mümkün mü? – Rella

+1

@Kabumbus Evet. 'V.second' değerleri, dizinin nesneleri için ptrees olacaktır. – antonakos

5

boost::property_tree::read_json(streamJSON, ptJSON); 

Eğer böyle bir yapınız varsa:

gibi path de düğümün çocukları yinelenmesi için standart döngü bu nedenle görünüyor
{ 
playlists: [ { 
    id: "1", 
    x: "something" 
    shows: [ 
    { val: "test" }, 
    { val: "test1" }, 
    { val: "test2" } 
    ] 
}, 
{ 
    id: "2" 
    x: "else", 
    shows: [ 
    { val: "test3" } 
    ] 
} 
] 
} 

böyle oluk alt düğümler yineleyebilirsiniz:

BOOST_FOREACH(boost::property_tree::ptree::value_type &playlist, ptJSON.get_child("playlists")) 
{ 
    unsigned long uiPlaylistId = playlist.second.get<unsigned long>("id"); 
    BOOST_FOREACH(boost::property_tree::ptree::value_type &show, playlist.second.get_child("shows.")) 
    { 
     std::string strVal = show.second.get<std::string>("val"); 
    } 
} 

Ben yol seçici hakkında bir şey bulamadık "gösterileri." alt diziyi seçmek için

Bazı iyi dokümantasyon

burada bulabilirsiniz (sonunda nokta dikkat edin): http://kaalus.atspace.com/ptree/doc/index.html

Umut bu kimse yardımcı olur.C++ 11 Kullanma

20

, sen path de düğümün tüm çocuklara yineleme yapmak için aşağıdakileri kullanabilirsiniz:

ptree children = pt.get_child(path); 
for (const auto& kv : children) { // kv is of type ptree::value_type 
    // v.first is the name of the child 
    // v.second is the child tree 
} 
+1

Benim düşünceme göre, daha iyi bir çözüm, ama belki de örnek için biraz daha iyi olurdu. – gauteh

İlgili konular