2
<?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 文档,它用相同的关键字描述了 2 种类型的航班。子字段取决于航班的类型。我必须根据航班类型读取 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 文件中获取国泰航空航班的信息并存储到 C++ 数据类中。我应该怎么做才能纠正这个?

注意:BOOST_FOREACH我尝试了而不是 second ,v.second.get_child("flight");但它引发了异常。然后我将上面的替换v.second.get_child("flight_class");为它的子字段,例如:类型和票价。这可能是什么原因?似乎它正在返回其孙节点。

4

1 回答 1

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 达到上述目标。

于 2013-07-09T06:55:05.263 回答