2013-04-21 18 views
6

XML'i okumak ve yazmak için Boost'un özellik ağacını kullanıyorum. Hazırladığım bir elektronik tablo uygulamasını kullanarak, elektronik tablonun içeriğini xml olarak kaydetmek istiyorum.Özellik ağacına aynı anahtarla düğümler ekleme

int main(int argc, char const *argv[]) 
{ 
boost::property_tree::ptree pt; 

pt.put("spreadsheet.cell.name", "a2"); 
pt.put("spreadsheet.cell.contents", "adsf"); 

write_xml("output.xml", pt); 

boost::property_tree::ptree ptr; 
read_xml("output.xml", ptr); 

ptr.put("spreadsheet.cell.name", "d6"); 
ptr.put("spreadsheet.cell.contents", "345"); 
ptr.put("spreadsheet.cell.name", "d2"); 
ptr.put("spreadsheet.cell.contents", "=d6"); 

write_xml("output2.xml", ptr); 

return 0; 
} 

Ben put yöntem değiştirir görmek bu question dayanarak: Yazdığım basit bir test programı için

<?xml version="1.0" encoding="UTF-8"?> 
<spreadsheet> 
    <cell> 
     <name>A2</name> 
     <contents>adsf</contents> 
    </cell> 
    <cell> 
     <name>D6</name> 
     <contents>345</contents> 
    </cell> 
    <cell> 
     <name>D2</name> 
     <contents>=d6</contents> 
    </cell> 
</spreadsheet> 

: Bu yüzden XML için aşağıdaki biçimi kullanmak için gerekli ediyorum bir okul atama olduğunu Yeni bir tane eklemek yerine, o düğümdeki herhangi bir şey. Tam olarak görüyorum işlevselliği:

Output.xml

<?xml version="1.0" encoding="utf-8"?> 
<spreadsheet> 
    <cell> 
    <name>a2</name> 
    <contents>adsf</contents> 
    </cell> 
</spreadsheet> 

Output2.xml

<?xml version="1.0" encoding="utf-8"?> 
<spreadsheet> 
    <cell> 
    <name>d2</name> 
    <contents>=d6</contents> 
    </cell> 
</spreadsheet> 

Bu add_child yöntemine bakın documentation baktığımızda hangi edecek Add the node at the given path. Create any missing parents. If there already is a node at the path, add another one with the same key.

Bu add_child yöntemini nasıl kullanacağımı anlayamıyorum, biri nasıl kullanılacağını açıklayabilir mi?

İstediğim dosya biçimini elde etmek için bunu yapmanın daha iyi bir yolu var mı?

+0

sadece çocuk adına hücrenin adını kullanamaz mıyız? Yani "spreadsheet.cell.d6" ' –

+0

@ k-ballo, çünkü xml gereksinimlerini karşılamıyordu. – Deekor

cevap

15

add_child üye işlevi, bir property_tree kodunu başka bir düğümün alt düğümüne bir çocuk düğümü olarak eklemenizi sağlar. Sağladığınız anahtar yolu zaten varsa, yinelenen bir anahtar eklenir ve çocuk yerine oraya eklenir. Örneğinizi biraz değiştirirsek sonuçları inceleyebiliriz. Eğer ilk kez add_child çağırdığınızda

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

int main() 
{ 
    // Create the first tree with two elements, name and contents 
    boost::property_tree::ptree ptr1; 
    ptr1.put("name", "a2"); 
    ptr1.put("contents", "adsf"); 

    // Create the a second tree with two elements, name and contents 
    boost::property_tree::ptree ptr2; 
    ptr2.put("name", "d6"); 
    ptr2.put("contents", "345"); 

    // Add both trees to a third and place them in node "spreadsheet.cell" 
    boost::property_tree::ptree ptr3; 
    ptr3.add_child("spreadsheet.cell", ptr1); 
    ptr3.add_child("spreadsheet.cell", ptr2); 

    boost::property_tree::write_xml("output.xml", ptr3); 

    return 0; 
} 

, anahtar "spreadsheet.cell" için düğüm yok ve oluşturulur. Daha sonra yeni oluşturulan düğüm için ağacın içeriğini (name ve contents) ekler. add_child'u ikinci kez aradığınızda, "spreadsheet.cell" in zaten var olduğunu ancak put'un aksine "hücre" olarak da adlandırılan bir kardeşi düğümü oluşturduğunu ve onu aynı konuma eklediğini görürsünüz.

son çıkış:

<?xml version="1.0" encoding="utf-8"?> 
<spreadsheet> 
    <cell> 
    <name>a2</name> 
    <contents>adsf</contents> 
    </cell> 
    <cell> 
    <name>d6</name> 
    <contents>345</contents> 
    </cell> 
</spreadsheet> 
+0

Harika bir açıklama. Ancak, 'd6' hücresini güncellemek istesem, o hücreye nasıl giderim ve ptr3'deki içeriği nasıl değiştirirdim? – Deekor

+2

@Deekor "Elektronik" türündeki tüm çocukları arayan elektronik tablodaki çocuklar üzerinde yineleyin. Karşılaştığınız her zaman, 'name' içeriğini alın ve bir eşleşme bulursanız silin. Net aksi takdirde add_child etrafında çok fazla belge, –

+0

güzel açıklama için dokümanlar bakmak gerekir. – sb32134

İlgili konular