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

其结果是,所述第一室被正确解析,但第二室具有与第一个的描述:

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

输出:

客厅

红色小

蓝大

浴室

红色小

蓝大

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

预期的结果将是:

客厅

红色小

蓝大

浴室

绿色中

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

在此先感谢,任何帮助,将不胜感激,因为我正在试图提升。

+0

的问题似乎是在此声明:常量的boost :: property_tree: :ptree&attributes = formats.get_child(“Room”);它每次都得到第一个孩子...... – cageman 2014-09-10 13:32:34

+0

这是,我不知道如何操纵它来循环它们 – Marty 2014-09-10 13:37:37

这个问题似乎在这个声明中: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"); 
    } 
} 
+0

通过这个实现,返回的子数据是“Description”。我的问题是深入一层,获取实际的“颜色”和“尺寸”。当然,如果我使用了vssecond.data(),则不会返回/显示任何内容。这就是为什么我试图让孩子的孩子,所以我可以访问最后一级。 – Marty 2014-09-10 14:08:29

+0

看到我的调整。 – cageman 2014-09-10 14:14:40

+0

在获取颜色和房间大小之前使用额外的条件来检查vs.first.data ==“说明” – Marty 2014-09-10 14:50:55

此代码为我工作的罚款

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; 

      } 
     } 
    } 
}