<?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。
可能是什么原因?它似乎正在返回它的孙子节点。
答案 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达到上述目标。