无法从 XML 个文件中获取值

Cannot get values from XML files

我在从 XML 文件获取值并使用我的 .cc class.

中的值时遇到问题

我有一个 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 class 应该按如下方式工作。 我想获取每个参数并查看参数是否大于 0.0 如果是则应创建一条消息 (DataCenterHeatMessage)。还应发送一条自我消息。 DataCenter.cc class 看起来像:

#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

很遗憾,消息没有发送到我声明的模块。 我发现这与for循环有关。根本没有进入for循环。如果我注释掉属于从 XML 文件中获取值的行,则模拟会发送消息。此外,如果我构建项目,不会发生任何错误。

有人可以帮我解决这个问题吗? 提前致谢!

假设在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
    }
}