Reputation: 17
I have a problem with getting values from a XML file and work with the values in my .cc class.
I have a XML file that looks like that:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<heatSupplyLoadProfile>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 38.0160000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 50.6880000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 114.0480000 </param>
<param> 114.0480000 </param>
<param> 114.0480000 </param>
<param> 114.0480000 </param>
<param> 76.0320000 </param>
<param> 76.0320000 </param>
<param> 76.0320000 </param>
<param> 76.0320000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 101.3760000 </param>
<param> 114.0480000 </param>
<param> 114.0480000 </param>
<param> 114.0480000 </param>
<param> 114.0480000 </param>
<param> 76.0320000 </param>
<param> 76.0320000 </param>
<param> 76.0320000 </param>
<param> 76.0320000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 63.3600000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 25.3440000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
<param> 12.6720000 </param>
</heatSupplyLoadProfile>
My DataCenter.cc class should work as follows. I want to get each param and see if the param is greater than 0.0 if yes a message (DataCenterHeatMessage) should be created. Further a self-message should be sent. The DataCenter.cc class looks like:
#include "DataCenter.h"
namespace network {
Define_Module(DataCenter);
void DataCenter::initialize()
{
//Get param XMLElectricity file from simple module
heatSupplyLoadProfileArray = &par("heatSupplyLoadProfileArray");
XMLElectricity = electrictySupplyLoadProfileArray->xmlValue();
//Get values of the XML File
for(childNodeHeat = XMLHeat->getFirstChildWithTag("heatSupplyLoadProfile"); childNodeElectricity; childNodeElectricity = XMLHeat->getNextSiblingWithTag("heatSupplyLoadProfile")){
const char* valueHeat = childNodeHeat->getNodeValue();
//Convert the node value from string to double
heatSupplyLoadProfileArrayValue = atof(valueHeat);
if(heatSupplyLoadProfileArrayValue > 0.0){
DataCenterHeatMessage = new cMessage("heatSupplyLoadProfileArray");
endTxEvent = new cMessage("send/endTx");
scheduleAt(0, endTxEvent);
}
}
}
void DataCenter::handleMessage(cMessage *msg)
{
// Check if self message is received
if(endTxEvent->isSelfMessage()){
if(electricitySupplyLoadProfileArrayValue > 0.0){
send(DataCenterHeatMessage, "outDataCenterHeat");
}
}
else {
throw cRuntimeError("self-message not delivered");
}
}
};
DataCenter.h:
#ifndef __VISIONSIMULATIONOFPED_DATACENTER_H_
#define __VISIONSIMULATIONOFPED_DATACENTER_H_
#include <omnetpp.h>
using namespace omnetpp;
namespace network {
class DataCenter : public cSimpleModule {
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
private:
//state variables
double heatSupplyLoadProfileArrayValue;
cXMLElement *XMLHeat;
cXMLElement *childNodeHeat;
cPar *heatSupplyLoadProfileArray;
};
}; //namespace #endif
Unfortunately, the message is not send to the module I declared. I found out that this has something to do with the for loop. The for loop is not entered at all. If I comment out the lines belonging to get the values from the XML file, the simulation sends the message. Further, if I build the project no errors occur.
Could please someone help me with that issue? Thanks in advance!
Upvotes: 1
Views: 166
Reputation: 7002
Let's assume that in DataCenter.ned
there is the following declaration:
xml heatSupplyLoadProfileArray;
and omnetpp.ini
contains:
**.heatSupplyLoadProfileArray = xmldoc("heat.xml")
where heat.xml
is a file that contains:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<heatSupplyLoadProfile>
<param> 12.6720000 </param>
<param> 76.0320000 </param>
<param> 114.0480000 </param>
</heatSupplyLoadProfile>
To read data from this XML file one should use the following code:
cXMLElement *rootelement = par("heatSupplyLoadProfileArray");
cXMLElementList params= rootelement->getChildrenByTagName("param");
for (const auto & element : params) {
const char* valueHeat = element->getNodeValue();
float val = atof(valueHeat);
EV << "Read value: " << val << std::endl;
if (val > 0.0) {
// send a message or self-message
}
}
Upvotes: 1