I want to read XML-data using TinyXML. I have the following XML-file:
<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>
And the following C++ code:
for(TiXmlElement* e = elem->FirstChildElement("time"); e != NULL; e = e->FirstChildElement("symbol"))
{
cout << "Got symbol" << endl;
attr = e->Attribute("var");
if(attr != NULL)
cout << "Got var " << attr << endl;
attr = e->Attribute("name");
if(attr != NULL)
cout << "Got name " << attr << endl;
attr = e->Attribute("number");
if(attr != NULL)
cout << "Got number " << attr << endl;
}
My question is: How can I change this so all of the 'symbol' data from the three days gets read and displayed?
Greetings,
Don
The iterating clause of your for
statement is wrong. That needs to iterate the time
elements, and for each time
element you must get it's child symbol
element.
for (TiXmlElement* e = elem->FirstChildElement("time"); e != NULL; e = e->NextSiblingElement("time"))
{
TiXmlElement* t = e->FirstChildElement("symbol");
if (t)
{
const char *a1 = t->Attribute("var");
const char *a2 = t->Attribute("name");
const char *a3 = t->Attribute("number");
if (a1)
cout << "Got var " << a1 << "\n";
if (a2)
cout << "Got name " << a2 << "\n";
if (a3)
cout << "Got number " << a3 << "\n";
}
}