升压C++ XML解析
问题描述:
我如何与升压解析XML,如果XML有直到并包括3个层次稍微熟悉。但是,我有下面的例子麻烦:升压C++ XML解析
(请忽略XML中的轻微缺乏逻辑的,因为这是事我不能改变一个适应的结构是很重要的)
<content>
<Room>
<RoomName>Livingroom</RoomName>
<Description>
<Color>Red</Color>
<Size>Small</Size>
</Description>
<Description>
<Color>Blue</Color>
<Size>Big</Size>
</Description>
</Room>
<Room>
<RoomName>Bathroom</RoomName>
<Description>
<Color>Green</Color>
<Size>Medium</Size>
</Description>
</Room>
</content>
我已经尝试这样的:
struct Room
{
std::string roomName;
std::string roomColor;
std::string roomSize;
};
void parseRoomsXml(){
boost::property_tree::ptree tree;
boost::property_tree::read_xml("./Rooms.xml", tree);
boost::property_tree::ptree formats = tree.get_child("content");
BOOST_FOREACH(boost::property_tree::ptree::value_type const& f, formats) {
if(f.first == "Room") {
Room s;
s.roomName = f.second.get<std::string>("RoomName");
std::cout<<s.roomName<<std::endl;
const boost::property_tree::ptree & attributes = formats.get_child("Room");
BOOST_FOREACH(boost::property_tree::ptree::value_type const& v, attributes) {
if (v.first == "Description"){
s.roomColor = v.second.get<std::string>("Color");
s.roomSize = v.second.get<std::string>("Size");
std::cout<< s.roomColor << " " <<s.roomSize;
}
}
}
}
}
其结果是,所述第一室被正确解析,但第二室具有与第一个的描述:
=========================
输出:
客厅
红色小
蓝大
浴室
红色小
蓝大
========================
预期的结果将是:
客厅
红色小
蓝大
浴室
绿色中
===================================
在此先感谢,任何帮助,将不胜感激,因为我正在试图提升。
答
这个问题似乎在这个声明中:const boost :: property_tree :: ptree & attributes = formats.get_child(“Room”);
您可以通过使用下面的代码孩子迭代:
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("path.to.array_of_objects"))
{
std::cout << "First data: " << v.first.data() << std::endl;
boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
subtree)
{
std::cout << "Sub data: " << vs.first.data() << std::endl;
color = vs.second.get<std::string>("Color");
roomSize = vs.second.get<std::string>("Size");
}
}
答
此代码为我工作的罚款
boost::property_tree::ptree formats = tree.get_child("content");
BOOST_FOREACH(boost::property_tree::ptree::value_type const& f, formats) {
if(f.first == "Room") {
Room s;
s.roomName = f.second.get<std::string>("RoomName");
boost::property_tree::ptree subtree2 = (boost::property_tree::ptree) f.second ;
std::cout<<s.roomName<<std::endl;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
subtree2)
{
if(v.first == "Description"){
s.roomColor = v.second.get<std::string>("Color");
s.roomSize = v.second.get<std::string>("Size");
std::cout<< s.roomColor << std::endl<<s.roomSize<<std::endl;
}
}
}
}
的问题似乎是在此声明:常量的boost :: property_tree: :ptree&attributes = formats.get_child(“Room”);它每次都得到第一个孩子...... – cageman 2014-09-10 13:32:34
这是,我不知道如何操纵它来循环它们 – Marty 2014-09-10 13:37:37