使用C ++中的boost :: property_tree库函数读取XML数据

时间:2013-07-05 09:55:53

标签: c++ xml boost-propertytree

<?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>

我有一份XML文档,用相同的关键字描述了两种类型的航班。子字段取决于航班的类型。我必须读取XML并根据航班类型将其存储到C ++数据类中。

这是我用于此目的的代码段。

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

当我尝试运行上面的代码时,FlightClass内部没有任何内容。我尝试调试上面的代码并发现,v1.first仅获取值“carrier”,“number”和“value”。     我很惊讶,因为这些是酋长国航班类型的参数。我无法接收导管太空飞行信息。     请帮我找出问题所在。     我真的想从这个XML文件中获取cathy-pacific航班的信息并存储到C ++数据类中。     我该怎么做才能纠正这个问题?

注意:我尝试了BOOST_FOREACH而不是第二个v.second.get_child("flight");,但它正在抛出异常。然后我在v.second.get_child("flight_class");上面替换了它,它给出了它的子字段,如:type和fare。 可能是什么原因?它似乎正在返回它的孙子节点。

1 个答案:

答案 0 :(得分:1)

如果有多个具有相同名称的子节点,则Boost不提供任何类似“get_next_child”的功能来获取不同的子节点。 所以我在为上述目的进行迭代之前,只是从树中删除了不需要的字段。

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

然后使用BOOST_FOREACH达到上述目标。