2013-07-05 2 views
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 문서가 있습니다. 하위 입력란은 항공편 유형에 따라 다릅니다. XML 형식을 읽고 비행 유형에 따라 C++ 데이터 클래스에 저장해야합니다.C++에서 boost :: property_tree 라이브러리 함수를 사용하여 XML 데이터 읽기

이것은이 목적으로 사용되는 코드 세그먼트입니다.

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 값이 "이동 통신사", "번호"및 "값"으로만 나타납니다. 나는 에미레이트 항공기의 매개 변수이기 때문에 놀랐습니다. 나는 카 티픽 - 태평양 비행 정보를받을 수 없었습니다. 문제의 해결 방법을 알려주십시오. 저는이 XML 파일에서 cathy-pacific 항공편에 대한 정보를 얻고 C++ 데이터 클래스에 저장하려고합니다. 이 문제를 해결하려면 어떻게해야합니까?

참고 : 두 번째 BOOST_FOREACH 대신에 v.second.get_child("flight");을 시도했지만 예외가 발생했습니다. 그런 다음 위의 내용을 v.second.get_child("flight_class");으로 바꿔서 유형 및 요금과 같은 하위 필드를 제공합니다. 그 이유는 무엇일까요? 그것은 손자 노드를 반환하는 것 같습니다.

답변

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를 사용했습니다.