2011-07-11 13 views
29

Trước hết tôi sẽ nói rằng tôi nghĩ rằng tôi đã làm thế nào nó nên được thực hiện nhưng mã của tôi sẽ không biên dịch bất kỳ cách nào tôi cố gắng. Tôi dựa trên giả định của tôi trên this official example of empty ptree trick. Ở đó bạn có thể tìm thấy dòng tiếp theo:Boost 1.46.1, Property Tree: Làm thế nào để lặp qua ptree nhận sub ptrees?

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

Điều này cho thấy rằng (hoặc có thể) có thể lấy subptree ra khỏi ptree.

Vì vậy, tôi cho rằng chúng ta có thể lặp qua ptree với một cái gì đó giống như BOOST_FOREACH theo cách như vậy:

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

} 

Nhưng tôi nhận được lỗi sau:

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

hoặc nếu tôi cố gắng

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

} 

Tôi nhận được:

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

Vì vậy, tôi phải làm gì: làm thế nào để lặp lại thông qua Tăng Ptree và nhận phụ Ptrees?

Cập nhật: Tôi cũng đã cố gắng mã như vậy

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; 
    } 
} 

này biên dịch, không ném bất kỳ exeptions nhưng không cout bất kỳ Sub data, nó chỉ skeeps qua chu kỳ này.

Cập nhật 2:

Hm ... một cái gì đó có lẽ đã đi sai trong xml của tôi - bây giờ tôi nhận được kết quả chính xác với mã đó.

Trả lời

30

Các trình vòng lặp cây thuộc tính trỏ tới các cặp của biểu mẫu (key, tree) loại ptree::value_type. Vòng lặp tiêu chuẩn cho iterating thông qua các con của nút tại path do đó trông giống như:

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

vấn đề của tôi là tôi có một số loại mảng của các đối tượng. Vì vậy, tôi có ví dụ { "servecie": { "module": [ "tập tin", "Quản trị", "Nhân sự" ] } "servecie": { "module": [ " file ", " Quản trị ", " HR " ] } } và tôi cần phải nhận từng đối tượng dưới dạng ptep. Điều đó có thể xảy ra không? – Rella

+1

@Kabumbus Có. Giá trị 'v.second' sẽ là ptrees cho các đối tượng của mảng. – antonakos

5

tôi đã cùng một vấn đề với iterating máng JSON phụ nút

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

Nếu bạn có một cấu trúc như:

{ 
playlists: [ { 
    id: "1", 
    x: "something" 
    shows: [ 
    { val: "test" }, 
    { val: "test1" }, 
    { val: "test2" } 
    ] 
}, 
{ 
    id: "2" 
    x: "else", 
    shows: [ 
    { val: "test3" } 
    ] 
} 
] 
} 

Bạn có thể lặp lại các nút con trough như sau:

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"); 
    } 
} 

Tôi không thể tìm thấy bất kỳ điều gì về công cụ chọn đường dẫn "hiển thị". để chọn mảng phụ. (Chú ý dấu chấm ở cuối)

Một số tài liệu tốt có thể được tìm thấy ở đây: http://kaalus.atspace.com/ptree/doc/index.html

Hope this helps một ai đó.

20

Sử dụng C++ 11, bạn có thể sử dụng sau đây để lặp qua tất cả các con của nút tại path:

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

Theo tôi, giải pháp tốt hơn, nhưng có lẽ nhiều hơn một chút cho ví dụ sẽ tốt. – gauteh