2010-07-21 38 views
7

Tôi có tập tin XML sau:Đang cập nhật tập tin XML sử dụng Boost property_tree

 
<xml version="1.0" encoding="utf-8"?> 
<Data> 
    <Parameter1>1</Parameter1> 
</Data> 

Tôi muốn thêm một nút mới: argument2 = "2" đến nút Data. Mã này không hoạt động, tập tin lưu vẫn chỉ chứa một tham số:

 
    boost::property_tree::ptree tree; 
    boost::property_tree::ptree dataTree; 

    read_xml("test.xml", tree); 
    dataTree = tree.get_child("Data"); 
    dataTree.put("Parameter2", "2"); 

    boost::property_tree::xml_writer_settings w(' ', 4); 
    write_xml("test.xml", tree, std::locale(), w); 

Nếu tôi thêm hai dòng sau sau dataTree.put, tôi nhận được kết quả chính xác:

 
    tree.clear(); 
    tree.add_child("Data", dataTree); 

tôi không thích giải pháp này, bởi vì nó tạo ra các vấn đề với cấu trúc cây phức tạp hơn. Có thể cập nhật cây thuộc tính mà không xóa/thêm các nút con không?

Trả lời

10

Mã của bạn gần như đúng, đó là cách đúng để cập nhật nút con.

Tuy nhiên, có một lỗi nhỏ. Khi bạn gõ:

dataTree = tree.get_child("Data"); 

Bạn gán cho dataTree một bản sao của "đứa trẻ". Vì vậy, dòng tiếp theo đề cập đến bản sao chứ không phải là phân cấp của bạn. Bạn nên viết:

boost::property_tree::ptree &dataTree = tree.get_child("Data"); 

Vì vậy, bạn có được tham chiếu đến trẻ.

Các ví dụ hoàn chỉnh là:

using namespace boost::property_tree; 
    ptree tree; 

    read_xml("data.xml", tree); 
    ptree &dataTree = tree.get_child("Data"); 
    dataTree.put("Parameter2", "2"); 

    xml_writer_settings<char> w(' ', 4); 
    write_xml("test.xml", tree, std::locale(), w); 
+1

Cảm ơn! Rất hữu ích, và bây giờ tôi không cần phải hỏi trong diễn đàn người dùng Boost rất không thân thiện :) –

Các vấn đề liên quan