Проблема с использованием get_value с деревьями свойств Boost

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

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, я иду глубже, а когда я нахожусь в теге Parameter, я восстанавливаю данные, чтобы что-то делать. Тем не менее, я не могу получить «имя» правильно.

Это те линии, которые я сканирую в последнем else if :

<Parameter name="box">

std::cout << name отображает такие вещи:

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

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

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

1

Решение

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

Жить на Колиру

#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"

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

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

Другие решения