2010-07-21 9 views
7

ho il seguente file XML:Aggiornamento usando Boost property_tree

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

voglio aggiungere un nuovo nodo: Parametro2 = "2" al nodo dati. Questo codice non funziona, file salvato contiene ancora un solo parametro:

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

Se posso aggiungere queste due righe dopo dataTree.put, ottengo risultato corretto:

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

non mi piace questa soluzione, perché crea problemi con le strutture ad albero più complicate. È possibile aggiornare la struttura delle proprietà senza eliminare/aggiungere nodi figlio?

risposta

10

Il codice è quasi corretto, questo è il modo giusto per aggiornare un nodo figlio.

Tuttavia, vi è un piccolo bug. Quando si digita:

dataTree = tree.get_child("Data"); 

assegnato a DataTree una copia del "bambino". Quindi, la riga successiva si riferisce alla copia e non alla tua gerarchia. Dovresti scrivere:

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

Così si ottiene un riferimento al bambino.

L'esempio completo è:

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

Grazie! Molto utile, e ora non ho bisogno di chiedere in molto ostile Forum degli utenti Boost :) –

Problemi correlati