增强C++XML解析

Boost C++ XML parsing

本文关键字:解析 C++XML 增强      更新时间:2023-10-16

我稍微熟悉如何使用boost解析XML,如果XML有3个级别(包括3个级别)。然而,我在以下示例中遇到了问题:

(请忽略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;
                }
            }
        }
    }
}

结果是第一个房间被正确解析,但第二个房间有第一个房间的描述:

=========================

输出:

Livingroom

红色小型

蓝色大

浴室

红色小型

蓝色大

==============================

预期结果为:

Livingroom

红色小型

蓝色大

浴室

绿色介质

====================================

提前感谢,任何帮助都将不胜感激,因为我正在努力适应助推。

问题似乎出现在以下语句中:const boost::property_tree::ptree&attributes=formats.get_child("房间");

您可以使用以下代码迭代子级:

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;
           }
       }
     }
}