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



我得到了一个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>

这是我读取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 循环只是在 XML 文件中的元素上运行。每次它找到元素"time"时,它都会查看它是否有属性"天"。我不明白的是为什么它运行 4 次,第五次它产生三个"时间"部分的属性。

这是输出:

时间日期:

时间日期:

时间日期:

时间日期:

时间日期:

2016年02月23日2016-02-242016年02月25

这是因为你的外循环遍历根元素weatherdata的所有直接后继者,即它迭代元素节点locationcreditmetasunforecast。对于这些元素中的每一个,您搜索您实际感兴趣的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())
    {
    ....

相关内容

  • 没有找到相关文章

最新更新