首页 > 解决方案 > 无法从 XML 文件中获取值

问题描述

我在从 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");
    }
}

};

数据中心.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 文件中获取值的行,则模拟会发送消息。此外,如果我构建项目,则不会发生错误。

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

标签: c++xmlomnet++

解决方案


让我们假设其中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
    }
}

推荐阅读