2010-07-21 17 views
7

Mam następujący plik XML:Aktualizowanie pliku XML przy użyciu doładowania property_tree

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

chcę dodać nowy węzeł: parametr2 = „2” do węzła danych. Ten kod nie działa, zapisany plik zawiera jeszcze tylko jeden parametr:

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

Jeśli dodać te dwie linie po dataTree.put, uzyskać poprawny wynik:

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

mi się nie podoba to rozwiązanie, ponieważ stwarza problemy z bardziej skomplikowanymi strukturami drzewa. Czy można aktualizować drzewo właściwości bez usuwania/dodawania węzłów potomnych?

Odpowiedz

10

Twój kod jest prawie poprawny, to jest właściwy sposób na aktualizację węzła potomnego.

Istnieje jednak mały błąd. Po wpisaniu:

dataTree = tree.get_child("Data"); 

przypisać do dataTree kopię tego "dziecka". Zatem następna linia odnosi się do kopii, a nie do twojej hierarchii. Powinieneś napisać:

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

Otrzymujesz referencję do dziecka.

Kompletny przykładem jest:

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

Dzięki! Bardzo pomocny, a teraz nie muszę pytać na bardzo nieprzyjaznym forum użytkowników Boost :) –

Powiązane problemy