无法从 XML 文件中获取值

Cannot get values from XML files

本文关键字:获取 文件 XML      更新时间:2023-10-16

我在从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,如果是应该创建一条消息(数据中心热消息(。此外,应发送自我信息。 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 文件中获取值的行,模拟将发送消息。此外,如果我构建项目,则不会发生错误。

请有人帮我解决这个问题吗? 提前感谢!

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