<?xml version="1.0"?>
<sked>
  <version>2</version>
  <flight xmlns:xsi="some_uri" xsi:type="emirates">
    <carrier>BA</carrier>
    <number>4001</number>
    <date>2011-07-21</date>
  </flight>
  <flight xmlns:xsi="some_uri" xsi:type="cathey-pacific">
    <flight_class>
        <type>Economy</type>
        <fare>400</fare>
    </flight_class>
    <date>2011-07-21</date>
  </flight>
</sked>

I have a XML document which describe 2 types of flights by same keywords. Sub fields are depend on the type of the flight. I have to read the XML and store it into C++ data classes according to the type of flights.

This is my code segment that is used for this purpose.

typedef boost::property_tree::ptree Node;
    Node pt;
    read_xml(test.xml, pt);
    Node skedNode = pt.get_child("sked");
    Node flightNode = skedNode.get_child("flight");

    BOOST_FOREACH(Node::value_type const& v, skedNode.get_child("sked"))
    {
        if (v.first == "flight")
        {
            if (v.second.get("<xmlattr>.xsi:type", "Null") == "cathey-pacific")
            {
                BOOST_FOREACH(Node::value_type const& v1, flightNode.get_child("flight"))
                {
                    if(v1.first == "flight_class")
                        FlightClass fclass = FlightClass(static_cast<Node>(flightNode));
                }
            }
        }
    }

When I try to run the above code, I got nothing inside FlightClass. I tried to debug the above code and found, v1.first is getting the values "carrier", "number" and "value" only. I surprised because, those are the parameter of emirates type of flights. I couldn't receive cathey-pacific flight information. Please help me to find out what the issue is. I really want to get the information of cathy-pacific flights from this XML file and store into C++ data classes. What should I do to correct this?

Note: Instead of second BOOST_FOREACH, I tried v.second.get_child("flight"); but it's throwing an exception. Then I replaced above by v.second.get_child("flight_class"); and it's giving it's sub-fields like: type and fare. What may be the reason for that? It seems it's returning its grandchild nodes.

有帮助吗?

解决方案

Boost doesn't provide any functionality like "get_next_child" to get different child nodes if there are more than one children nodes with same name. So I just removed the unwanted fields from the tree before I iterate for above purpose.

flightNode.pop_front(); // to remove xmlattr
flightNode.pop_front(); // to remove version field
flightNode.pop_front(); // to remove first flight field.

Then used BOOST_FOREACH to reach above goal.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top