2017-01-10 8 views
-1

私はXMLファイルを得た:なぜこのコードは4回何も生成せず、5回目に正しいデータを生成しますか?

<weatherdata> 
 
\t <location> 
 
\t \t <name>Vlaardingen</name> 
 
\t \t <type/> 
 
\t \t <country>NL</country> 
 
\t \t <timezone/> 
 
\t \t <location altitude="0" 
 
\t \t \t \t latitude="51.912498" 
 
\t \t \t \t longitude="4.34167" 
 
\t \t \t \t geobase="geonames" 
 
\t \t \t \t geobaseid="2745467"/> 
 
\t </location> 
 
\t <credit/> 
 
\t <meta> 
 
\t \t <lastupdate/> 
 
\t \t <calctime>0.0152</calctime> 
 
\t \t <nextupdate/> 
 
\t </meta> 
 
\t <sun rise="2016-02-23T06:40:58" 
 
\t \t \t set="2016-02-23T17:11:47"/> 
 
\t <forecast> 
 
\t \t <time day="2016-02-23"> 
 
\t \t \t <symbol number="500" 
 
\t \t \t \t \t name="lichte regen" 
 
\t \t \t \t \t var="10d"/> 
 
\t \t \t <precipitation/> 
 
\t \t \t <windDirection deg="316" 
 
\t \t \t \t \t code="NW" 
 
\t \t \t \t \t name="Northwest"/> 
 
\t \t \t <windSpeed mps="9.01" 
 
\t \t \t \t \t name="Fresh Breeze"/> 
 
\t \t \t <temperature day="6.06" 
 
\t \t \t \t \t min="5.57" 
 
\t \t \t \t \t max="6.06" 
 
\t \t \t \t \t night="5.66" 
 
\t \t \t \t \t eve="5.57" 
 
\t \t \t \t \t morn="6.06"/> 
 
\t \t \t <pressure unit="hPa" 
 
\t \t \t \t \t value="1027.72"/> 
 
\t \t \t <humidity value="96" 
 
\t \t \t \t \t unit="%"/> 
 
\t \t \t <clouds value="clear sky" 
 
\t \t \t \t \t all="8" 
 
\t \t \t \t \t unit="%"/> 
 
\t \t </time> 
 
\t \t <time day="2016-02-24"> 
 
\t \t \t <symbol number="501" 
 
\t \t \t \t \t name="matige regen" 
 
\t \t \t \t \t var="10d"/> 
 
\t \t \t <precipitation value="3.15" 
 
\t \t \t \t \t type="rain"/> 
 
\t \t \t <windDirection deg="283" 
 
\t \t \t \t \t code="WNW" 
 
\t \t \t \t \t name="West-northwest"/> 
 
\t \t \t <windSpeed mps="6.21" 
 
\t \t \t \t \t name="Moderate breeze"/> 
 
\t \t \t <temperature day="4.98" 
 
\t \t \t \t \t min="4.17" 
 
\t \t \t \t \t max="5.11" 
 
\t \t \t \t \t night="4.17" 
 
\t \t \t \t \t eve="4.85" 
 
\t \t \t \t \t morn="4.32"/> 
 
\t \t \t <pressure unit="hPa" 
 
\t \t \t \t \t value="1030.97"/> 
 
\t \t \t <humidity value="100" 
 
\t \t \t \t \t unit="%"/> 
 
\t \t \t <clouds value="scattered clouds" 
 
\t \t \t \t \t all="48" 
 
\t \t \t \t \t unit="%"/> 
 
\t \t </time> 
 
\t \t <time day="2016-02-25"> 
 
\t \t \t <symbol number="500" 
 
\t \t \t \t \t name="lichte regen" 
 
\t \t \t \t \t var="10d"/> 
 
\t \t \t <precipitation value="1.23" 
 
\t \t \t \t \t type="rain"/> 
 
\t \t \t <windDirection deg="295" 
 
\t \t \t \t \t code="WNW" 
 
\t \t \t \t \t name="West-northwest"/> 
 
\t \t \t <windSpeed mps="5.71" 
 
\t \t \t \t \t name="Moderate breeze"/> 
 
\t \t \t <temperature day="5.43" 
 
\t \t \t \t \t min="4.92" 
 
\t \t \t \t \t max="5.48" 
 
\t \t \t \t \t night="5.34" 
 
\t \t \t \t \t eve="5.48" 
 
\t \t \t \t \t morn="4.92"/> 
 
\t \t \t <pressure unit="hPa" 
 
\t \t \t \t \t value="1026.18"/> 
 
\t \t \t <humidity value="100" 
 
\t \t \t \t \t unit="%"/> 
 
\t \t \t <clouds value="broken clouds" 
 
\t \t \t \t \t all="68" 
 
\t \t \t \t \t unit="%"/> 
 
\t \t </time> 
 
\t </forecast> 
 
</weatherdata>

これは、XMLファイルを読み込み、私のC++コードです:私はコーディングで初心者だ

#include <iostream> 
#include <string> 
#include "tinyxml2.h" 

using namespace std; 

struct weatherData 
{ 
    // date of day 
    string time_day; 
    // symbol data for weathericon and display of weather type 
    string symbol_number; 
    string symbol_name; 
    string symbol_var; 
    // windspeed 
    string windSpeed_mps; 
    // min. and max. temperature 
    string temp_min; 
    string temp_max; 
}; 


int main() 
{ 
    weatherData forecast[3]; 

    int counter = 0; 

    tinyxml2::XMLDocument doc; 
    if(doc.LoadFile("daily.xml") == tinyxml2::XML_SUCCESS) 
    { 
     tinyxml2::XMLElement* root = doc.FirstChildElement(); 

     for(tinyxml2::XMLElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement()) 
     { 
      std::string elemName = elem->Value(); 

      for (tinyxml2::XMLElement* e = elem->FirstChildElement("time"); e != NULL; e = e->NextSiblingElement("time")) 
      { 

       if (e) 
       { 
        const char *time = e->Attribute("day"); 

        forecast[counter].time_day = time; 
        counter++; 
       } 


      } 
      cout << "Time dates: " << endl; 
      for (int i = 0; i < 3;i++) 
      { 
      cout << forecast[i].time_day << endl; 
      } 
      counter = 0; 
     } 
    } 
} 

。私はブログのサンプルコードを使用しており、それを自分のニーズに合わせています。私はfor-loopsがXMLファイル内の要素を横断して実行されることを知っています。 そして、 'time'要素を見つけるたびに、 'day'属性を持っているかどうかを調べます。私が得られないのは、それが4回実行され、5回目に3つの時間部分の属性を生成する理由です。

これが出力されます:

時間はさかのぼり:

時間はさかのぼり:

時間はさかのぼり:

時間はさかのぼり:

時間はさかのぼり:

を2016- 02-23 2016-02-24 2016年2月25日

答えて

0

それは要素ノードlocationcreditmetasun、及びforecastにわたって反復、すなわち、ルート要素weatherdataのすべての直接の後継の上に外側のループ反復からです。これらの要素のそれぞれについて、あなたが実際に興味を持っているtime要素を検索します。しかし、最初の4つの要素、すなわちlocation,credit,およびsunは、外部ループの最初の4回の反復が時間データを抽出できないように、time要素を含まないが、5回目の反復は要素ノードforecastを選択する。あなたが探している3つのtime要素があります。

私はそれは次のようにあなたのコードを変更した場合に動作することを想定(FirstChildElementへの呼び出しで"forecast" -parameterに注意してください):あなたの非常に明確な答えを

.... 
if(doc.LoadFile("daily.xml") == tinyxml2::XML_SUCCESS) 
{ 
    tinyxml2::XMLElement* root = doc.FirstChildElement(); 

    for(tinyxml2::XMLElement* elem = root->FirstChildElement("forecast"); elem != NULL; elem = elem->NextSiblingElement()) 
    { 
    .... 
+0

感謝を! :) – Bluewave1976

+0

あなたは歓迎です:-) –

+0

はい、私もそれを見ました。私はそれを変更し、今それは動作します。 :) 再度、感謝します。 :) – Bluewave1976

関連する問題