2016-02-19 6 views
1

Я проследовал по этой ссылке http://www.technical-recipes.com/2014/using-boostproperty_tree/, чтобы проанализировать xml. Но как я могу прочитать весь xml без указания конкретного ключа? Я попытался следующий код, но он не в состоянии обработать его и я получаю сообщение об ошибке, как No such node.Прочтите xml using boost

Код:

const std::string XML_PATH1 = "./test1.xml"; 
#define ROOTTAG "roottag" 
boost::property_tree::ptree pt1; 
boost::property_tree::read_xml(XML_PATH1, pt1); 
BOOST_FOREACH(boost::property_tree::ptree::value_type & node, pt1.get_child(ROOTTAG)) 
{ 
    std::string tagname = node.first; 
    tagname += "."; 
    boost::property_tree::ptree subtree = node.second; 
    BOOST_FOREACH(boost::property_tree::ptree::value_type & v, subtree.get_child(node.first.data())) 
    { 
     //does not enter here 
     tagname += v.first.data(); 
     tagname += "."; 
     xmlmap[tagname] = tagvalue; 
    } 
} 

Что должно быть указано во втором цикле вместо node.first.data()?

BOOST_FOREACH(boost::property_tree::ptree::value_type & v, subtree.get_child(node.first.data())) 

Пожалуйста, обратите внимание, что я должен использовать BOOST_FOREACH себя и использовать тот же метод. Я ссылался на многие сайты, но не мог найти, как читать целые xml без указания конкретного ключа.

Также, как читать многоуровневые xml с использованием вышеуказанного метода?

+3

Вы спрашивали то же самое [с февраля 10] (http://stackoverflow.com/questions/35314178/c-how-to-read-xml-using-boost-xml-parser-and -store-в-карте). Что нам нужно для облегчения? Можете ли вы/просто/показать ожидаемый ввод и вывод? – sehe

ответ

1

Конечно, все «Я хочу, чтобы сгладить это в карту» выглядит бесполезное занятие, так как я утверждал в своем ответе здесь:

Однако, поскольку вы, кажется, намерение и просто не может придумать код для итерации в Ptree рекурсивно, вот начало:

Live On Coliru

void flatten(boost::property_tree::ptree const& pt, Flat& xmlmap, std::string const& prefix = "") { 
    using namespace boost::property_tree; 

    bool has_child_elements = false; 
    BOOST_FOREACH (ptree::value_type const& child, pt) { 
     has_child_elements |= (child.first != "<xmlattr>"); 
     flatten(child.second, xmlmap, prefix + "." + child.first); 
    } 

    if (!has_child_elements) { 
     std::string val = pt.get_value(""); 
     if (!val.empty()) 
      xmlmap[prefix] = val; 
    } 
} 

Когда вы вызываете это так:

int main() { 
    boost::property_tree::ptree pt; 
    boost::property_tree::read_xml("test.xml", pt); 

    Flat m; 
    flatten(pt.get_child("roottag"), m, "DEMO"); 

    BOOST_FOREACH(Flat::value_type const& p, m) { 
     std::cout << p.first << "\t= '" << p.second << "'\n"; 
    } 
} 

Он печатает например,

DEMO.billTo.<xmlattr>.country = 'US' 
DEMO.billTo.city = 'Old Town' 
DEMO.billTo.name = 'Robert Smith' 
DEMO.billTo.state = 'PA' 
DEMO.billTo.street = '8 Oak Avenue' 
DEMO.billTo.zip = '95819' 
DEMO.comment = 'Hurry, my lawn is going wild!' 
DEMO.items.item.<xmlattr>.partNum = '926-AA' 
DEMO.items.item.USPrice = '39.98' 
DEMO.items.item.comment = 'Confirm this is electric' 
DEMO.items.item.productName = 'Baby Monitor' 
DEMO.items.item.quantity = '1' 
DEMO.items.item.shipDate = '1999-05-21' 
DEMO.shipTo.<xmlattr>.country = 'US' 
DEMO.shipTo.city = 'Mill Valley' 
DEMO.shipTo.name = 'Alice Smith' 
DEMO.shipTo.state = 'CA' 
DEMO.shipTo.street = '123 Maple Street' 
DEMO.shipTo.zip = '90952' 
+0

Образец [Live On Coliru] (http://coliru.stacked-crooked.com/a/491531c7f187e00e) – sehe

+0

Как обрабатывать сценарии, где он имеет несколько дочерних с таким же именем, значение получает перезапись на карте – Namitha

+0

или как хранить ребенка с тем же именем, что и значения, разделенные запятой на карте? – Namitha