2016-01-07 2 views
1

Из XML-файла свойства java я хочу найти каждый элемент с именем entry (внутри корневого элемента properties). Затем поместите значение своего атрибута key в std::map<std::string, std::string> как ключ и содержимое элемента (между <entry> и </entry>) в качестве значения. До сих пор я использую boost property_tree. Но поскольку я не знаком с разбором XML-документов, мне было интересно, есть ли какие-то подводные камни, которые я здесь не вижу, или есть более простой подход, чем этот.Анализ xml-файла с boost property_tree и размещение выделенного содержимого на std :: map

std::map<std::string, std::string> mMap; 
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("properties")) 
{ 
    if (v.first == "entry") 
    { 
     std::string sVal = v.second.get_child("<xmlattr>.key").data(); 

     if (sVal.compare("Foo") == 0) 
      mMap[sVal] = v.second.data(); 
     else if (sVal.compare("Bar") == 0) 
      mMap[sVal] = v.second.data(); 
     else if(...) 
    } 
} 

XML:

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <entry key="Foo">This is a sentence.</entry> 
    <entry key="Bar">And another one.</entry> 
    <entry key=... 
</properties> 

ответ

1

Я бы сделать проще:

Live On Coliru

Map read_properties(std::string const& fname) { 
    boost::property_tree::ptree pt; 
    read_xml(fname, pt); 

    Map map; 

    for (auto& p : pt.get_child("properties")) { 
     auto key = p.second.get<std::string>("<xmlattr>.key"); 
     if (!map.insert({ key, p.second.data() }).second) 
      throw std::runtime_error("Duplicate key: " + key); 
    } 

    return map; 
} 

Если вы жаждут больше проверки или «XPath», я бы предложил использовать библиотеку XML.

Кроме этого, я вижу, что не так много.

+0

Спасибо! Я должен был упомянуть, что я не могу использовать C++ 11. – tzippy

+0

Тогда просто используйте свой код (по вкусу). Я надеюсь, что ответ помог, даже если образец не сделал – sehe

+0

Да, это определенно помогло, указав, что 'insert()' лучший способ избежать дублирования записей. Кроме того, я заметил, что мне не нужно сравнивать ключи, я могу просто вставить все. – tzippy