为什么这段代码有 4 次什么都没有产生,而第五次产生正确的数据?

Why does this code produce 4 times nothing and the fifth time the correct data?

我得到了一个 XML-文件:

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

我是编码新手。我正在使用博客中的示例代码,并根据我的需要对其进行了调整。我知道 XML 文件中元素的 for 循环只是 运行。 每次找到元素 'time' 时,它都会查看它是否具有属性 'day'。我不明白的是为什么它 运行s 4 次和第五次它产生三个 'time' 部分的属性。

这是输出:

时间日期:

时间日期:

时间日期:

时间日期:

时间日期:

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

这是因为你的外循环迭代了根元素 weatherdata 的所有直接后继元素,即它迭代了元素节点 locationcreditmetasun,以及 forecast。对于其中的每一个元素,您都可以搜索您真正感兴趣的 time 元素。但是前 4 个元素,即 locationcreditmetasun,不包含任何 time 元素,因此前 4 次迭代外循环无法提取任何时间数据,而第 5 次迭代则选择元素节点 forecast,它具有您要查找的三个 time 元素。

我想如果您按如下方式更改代码(请注意 FirstChildElement 调用中的 "forecast" 参数):

....
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())
    {
    ....