增强C ++ XML解析

马蒂

如果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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章