Boost logo

Boost Users :

Subject: [Boost-users] XML and Boost Property Tree
From: Boost Users List (078d7a6a70b2586b9cf1b456657079e9f510ef50_at_[hidden])
Date: 2012-02-09 12:26:56


Hey Boost users! I'm iterating over an XML document using boost property
tree and storing the results in a struct. The issue I have is that I can
only get to the first "item" nodes and can't access the second "item"
nodes. I was hoping someone would point out where I've made a mistake.

My program output looks like this (you can see items are missing.. there
is no cookie2, candy2 or chocolate2 items shown):

jar : snAcks
snack : coOkie
item : cooKie1
snack : canDy
item : caNdy1
snack : cHocolate
item : choColate1

Here's the xml file:

<root>
  <jar name="snAcks">
    <snack name="coOkie">
      <item name="cooKie1"></item>
      <item name="cookIe2"></item>
    </snack>
    <snack name="canDy">
      <item name="caNdy1"></item>
      <item name="candY2"></item>
    </snack>
    <snack name="cHocolate">
        <item name="choColate1"></item>
        <item name="chocOlate2"></item>
    </snack>
  </jar>
</root>

Here's the source code:

void parse_xml( boost::property_tree::iptree const& pt )
{
    BOOST_FOREACH( boost::property_tree::iptree::value_type const& v,
pt.get_child("root.jar") )
    {
        // Show jar
        if ( boost::iequals( v.first, "<xmlattr>" ) )
        {
            std::cout << "jar : " << v.second.get<std::string>("NaME") <<
std::endl;
        }

        if ( boost::iequals( v.first, "snack" ) )
        {
            // Show snack
            std::cout << "snack : " <<
v.second.get<std::string>("<xmlattr>.name") << std::endl;

            try
            {
                BOOST_FOREACH( boost::property_tree::iptree::value_type
const& val, v.second.get_child("item") )
                {
                    if ( boost::iequals( val.first, "<xmlattr>" ) ) {
                        // Show item
                        std::cout << "item : " <<
val.second.get<std::string>("nAmE") << std::endl;
                    }
                }
            }

            catch (boost::property_tree::ptree_bad_path& e)
            {
                // Show what caused exception
                std::cout << "Exception: " << e.what() << std::endl;
            }
        }
    }
}

Thank you for taking time to read this. I think I've made a simple
mistake, but cannot understand where.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net