2016-03-15 2 views
3

Disons que je vise à créer un fichier XML sous la forme suivante:Ajout d'un enfant sous pour stimuler ptree

<main> 
<elements> 
    <element name="elem1"><temp/> 
    </element> 
    <element name="elem2"><temp/> 
    </element> 
</elements> 
</main> 

Je le code suivant:

ptree pt; 
pt.put("main",""); 

ptree temp1; 
temp1.put("element",""); 
temp1.put("element.<xmlattr>.name","elem1"); 
temp1.put("element.temp"); 

ptree temp2; 
temp2.put("element",""); 
temp2.put("element.<xmlattr>.name","elem2"); 
temp2.put("element.temp"); 

//temp1 represents the 1st <element>...</element> 
//temp2 represents the 1st <element>...</element> 

//Add temp1 and temp2 to <main> under <elements> 

Je suppose que Seraient travail:

pt.add_child("main.elements",temp1); 
pt.add_child("main.elements",temp2); 

Cependant, cela génère le code XML suivant:

<main> 
<elements> 
    <element name="elem1"><temp/> 
    </element> 
</elements> 
<elements> 
    <element name="elem2"><temp/> 
    </element> 
<elements> 
</main> 

j'ai pu obtenir le fichier xml requis en faisant mon temp1 sous la forme suivante:

temp1.put("<xmlattr>.name","elem1"); 
temp1.put("temp",""); 
temp2.put("<xmlattr>.name","elem2"); 
temp2.put("temp",""); 
pt.add_child("main.elements.element",temp1); 
pt.add_child("main.elements.element",temp2); 

Est-il possible Je peux travailler avec mes premiers noeuds de TEMP1 et TEMP2 pour obtenir la structure xml souhaitée ?

Répondre

2

Votre situation est un peu sous-optimale (et je serais très favorable à l'extrait de travail que vous avez donné).

est ici ce qui fonctionnerait:

pt.add_child("main.elements.element", temp1.get_child("element")); 
pt.add_child("main.elements.element", temp2.get_child("element")); 

Live On Coliru

#include <boost/property_tree/xml_parser.hpp> 
#include <iostream> 

using boost::property_tree::ptree; 

int main() { 
    ptree temp1; 
    temp1.put("element.<xmlattr>.name","elem1"); 
    temp1.put_child("element.temp", {}); 

    ptree temp2; 
    temp2.put("element.<xmlattr>.name","elem2"); 
    temp2.put("element.temp", ""); 

    //Add temp1 and temp2 to <main> under <elements> 
    ptree pt; 
    pt.add_child("main.elements.element", temp1.get_child("element")); 
    pt.add_child("main.elements.element", temp2.get_child("element")); 
    write_xml(std::cout, pt, boost::property_tree::xml_writer_make_settings<std::string>(' ', 4, "utf-8")); 
} 

Prints

<?xml version="1.0" encoding="utf-8"?> 
<main> 
    <elements> 
     <element name="elem1"> 
      <temp/> 
     </element> 
     <element name="elem2"> 
      <temp/> 
     </element> 
    </elements> 
</main> 
+0

démo en direct ajouté. – sehe

+0

Ceci est juste un exemple. Je pourrais rencontrer des situations où je pourrais obtenir l'élément d'un autre programme et je dois juste l'ajouter à l'arbre déjà existant. Alors je mets ça dehors pour voir s'il me manque quelque chose. Je suppose que votre solution fonctionnerait pour mon cas. Merci. –