我必须使用Boost编写XML解析器。不过我有点麻烦。 我可以毫无问题地访问节点名称,但出于某种原因,我无法使用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标签中时,我会更深入,当我在参数标签中时,我恢复数据来做东西。但是,我无法获得&#34; name&#34;正常。
这是我在上一篇else if
中扫描的那种行:
<Parameter name="box">
std::cout << name
显示的内容如下:
name: ^M
^M
^M
^M
^M
^M
这显然不是我要求的。
我做错了什么?任何帮助将不胜感激。
答案 0 :(得分:1)
由于你的问题不是特别自给自足,这是我的自我反思的例子:
<强> 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"
我希望你能看到你需要做什么(可能是树中意外的节点级别?)。直接到叶节点:
pt.get_child("Parameter.<xmlattr>.name").get_value<std::string>()