2017-01-10 5 views
-1

Я получил XML-файл:Почему этот код не производит в 4 раза больше и в пятый раз правильные данные?

<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-loops просто пробегают элементы в XML-файле. И каждый раз, когда он находит элемент «время», он выглядит, если у него есть атрибут «день». То, что я не получаю, - это то, почему он работает 4 раза, и в пятый раз он создает атрибуты трех «временных» частей.

Это выход: даты

Время: даты

Время:

Время даты:

Время даты:

Время даты:

2016- 02-23 2016-02-24 2016-02-25

ответ

0

Это происходит потому, что ваши внешние итерации цикла в течение всех прямых наследников корневого элемента weatherdata, то есть он перебирает узлы элементов location, credit, meta, sun и forecast. Для каждого из этих элементов вы ищите элементы time, в которых вы действительно заинтересованы. Но первые 4 элемента, то есть location, credit, meta и sun, не содержат никакого time -элемент, так что первые 4 итерации внешнего цикла не могут извлекать какие-либо данные времени, тогда как пятая итерация затем выбирает узел элемента forecast, который имеет три time -элементы, которые вы ищете.

Я полагаю, что это работает, если вы измените свой код следующим образом (обратите внимание на "forecast" параметрических в вызове 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

 Смежные вопросы

  • Нет связанных вопросов^_^