2010-07-21 9 views
7

Ich habe die folgende XML-Datei:Updating XML-Datei mit Boost-property_tree

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

Ich möchte einen neuen Knoten hinzuzufügen: Parameter2 = "2" an den Datenknoten. Dieser Code funktioniert nicht, gespeicherte Datei enthält immer noch nur einen Parameter:

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

Wenn ich diese beiden Zeilen nach dataTree.put hinzufügen, ich korrektes Ergebnis erhalten:

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

Ich mag es nicht Diese Lösung, weil es Probleme mit komplizierteren Baumstrukturen schafft. Ist es möglich, den Eigenschaftsbaum zu aktualisieren, ohne untergeordnete Knoten zu löschen/hinzuzufügen?

Antwort

10

Ihr Code ist fast richtig, das ist der richtige Weg, um einen Kindknoten zu aktualisieren.

Allerdings gibt es einen kleinen Fehler. Wenn Sie Folgendes eingeben:

dataTree = tree.get_child("Data"); 

Sie ordnen zu DataTree eine Kopie des "Kind". Die nächste Zeile bezieht sich also auf die Kopie und nicht auf Ihre Hierarchie. Sie sollten schreiben:

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

So erhalten Sie einen Verweis auf das Kind.

Das komplette Beispiel ist:

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

Dank! Sehr hilfreich, und jetzt muss ich nicht in sehr unfreundlichen Boost-User-Forum fragen :) –

Verwandte Themen