如果XML具有3级或以下级别,我对如何使用Boost分析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&properties = format.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");
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句