2017-01-10 33 views
-1

我得到了一個XML文件:爲什麼這段代碼什麼都沒產生,第五次是正確的數據?

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

這是我的C++代碼讀取XML文件:

#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循環只是運行XML文件中的元素。 每次它發現元素的'時間',它看起來是否有一個屬性'日'。我沒有得到的是爲什麼它運行4次,第五次產生三個'時間'部分的屬性。

這是輸出:

時間日期:

時間日期:

時間日期:

時間日期:

時間日期:

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

回答

0

這是因爲在根元素weatherdata,即所有的直接繼承者的外循環迭代它遍歷元素節點locationcreditmetasunforecast。對於這些元素中的每一個,您都會搜索您真正感興趣的元素。但前4個元素,即location,credit,metasun不包含任何元素,使得外環的前4次迭代不能提取任何時間數據,而第5次迭代然後選擇元素節點forecast,其中有三個time - 您正在尋找的元素。

我想它,如果你改變你的代碼如下工作(注意在呼叫中的"forecast" -parameter到FirstChildElement):

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

相關問題