Kerstin
Kerstin

Reputation: 17

Cannot get values from XML files

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

Answers (1)

Jerzy D.
Jerzy D.

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

Related Questions