2014-12-09 2 views
1

Мне нужно написать синтаксический анализатор XML с Boost. Однако у меня есть некоторые проблемы. Я могу получить доступ к имени узла без каких-либо проблем, но по какой-то причине я не могу получить доступ к атрибутам внутри тега, используя get_value, который должен работать мгновенно. Может быть, в моем коде есть ошибка, которую я не заметил? Посмотрите:Проблема с использованием get_value с деревьями свойств Boost

void ParametersGroup::load(const boost::property_tree::ptree &pt) 
{ 
    using boost::property_tree::ptree; 
    BOOST_FOREACH(const ptree::value_type& v, pt) 
    { 
    name = v.second.get_value<std::string>("name"); 
    std::string node_name = v.first; 
    if (node_name == "<xmlattr>" || node_name == "<xmlcomment>") 
     continue; 
    else if (node_name == "ParametersGroup") 
     sg.load(v.second); // Recursion to go deeper 
    else if (node_name == "Parameter") 
    { 
     // Do stuff 
     std::cout << "PARAMETER_ELEM" << std::endl; 
     std::cout << "name: " << name << std::endl; 
     std::cout << "node_name: " << node_name << std::endl << std::endl; 
    } 
    else 
    { 
     std::cerr << "FATAL ERROR: XML document contains a non-recognized element: " << node_name << std::endl; 
     exit(-1); 
    } 
    } 
} 

Поэтому в основном я игнорирую и теги, когда я нахожусь в ParametersGroup теге я иду глубже, и когда я нахожусь в теге параметров я восстановить ДАННЫЕ, чтобы делать такие вещи. Однако я не могу правильно получить «имя».

Это вид линий я сканирование в последнем else if:

<Parameter name="box"> 

В std::cout << name показывает, что такие вещи, как:

name: ^M 
^M 
    ^M 
^M 
    ^M 
^M 

которого obvisouly не то, что я прошу ,

Что я делаю неправильно? Любая помощь будет принята с благодарностью.

+0

Пожалуйста сделайте ваш образец самодостаточными – sehe

ответ

1

Поскольку ваш вопрос не особенно selfcontained, вот мой selfcontained контрпример:

Live On Coliru

#include <sstream> 
#include <iostream> 

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

using namespace boost::property_tree; 

int main() { 
    ptree pt; 

    std::istringstream iss("<Parameter name=\"box\" />"); 
    xml_parser::read_xml(iss, pt); 

    for (auto& element : pt) 
    { 
     std::cout << "'" << element.first << "'\n"; 
     for (auto& attr : element.second) 
     { 
      std::cout << "'" << attr.first << "'\n"; 
      for (auto& which : attr.second) 
      { 
       std::cout << "'" << which.first << "': \"" << which.second.get_value<std::string>() << "\"\n"; 
      } 
     } 
    } 
} 

Он печатает

'Parameter' 
'<xmlattr>' 
'name': "box" 

Я надеюсь, что вы можете увидеть, что вам нужно сделать (вероятно, неожиданный уровень узлов i n дерево?). Для того, чтобы получить непосредственно в узел листа:

pt.get_child("Parameter.<xmlattr>.name").get_value<std::string>() 
+0

О, я думаю, что я неправильно понял использование собственности деревьев. Ваш ответ помог мне заставить его работать, спасибо большое! – Nepho