Невозможно получить значения из файлов XML - PullRequest
0 голосов
/ 12 января 2020

У меня проблема с получением значений из файла XML и работой со значениями в моем классе. cc.

У меня есть файл XML, который выглядит следующим образом:

<?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>

Мой DataCenter. cc Класс должен работать следующим образом. Я хочу получить каждый параметр и посмотреть, если параметр больше 0,0, если да, должно быть создано сообщение (DataCenterHeatMessage). Далее следует отправить само сообщение. Класс DataCenter. cc выглядит следующим образом:

#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

К сожалению, сообщение не отправлено в модуль, который я объявил. Я узнал, что это как-то связано с l oop. Для l oop вообще не вводится. Если я закомментирую строки, принадлежащие для получения значений из файла XML, симуляция отправит сообщение. Кроме того, если я создаю проект, никаких ошибок не возникает.

Не могли бы вы мне помочь с этой проблемой? Заранее спасибо!

1 Ответ

0 голосов
/ 13 января 2020

Предположим, что в DataCenter.ned есть следующее объявление:

xml heatSupplyLoadProfileArray;

и omnetpp.ini содержит:

**.heatSupplyLoadProfileArray = xmldoc("heat.xml")

, где heat.xml - файл, содержащий:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <heatSupplyLoadProfile>
  <param>   12.6720000  </param>
  <param>   76.0320000  </param>
  <param>   114.0480000 </param>
</heatSupplyLoadProfile>

Чтобы прочитать данные из этого файла XML, используйте следующий код:

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
    }
}
...