c++ - 无法从 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 文件中获取值的行,则模拟会发送消息。此外,如果我构建项目,则不会发生错误。
有人可以帮我解决这个问题吗?提前致谢!
解决方案
让我们假设其中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
}
}
推荐阅读
- c# - 如何使用 SetWindowDisplayAffinity
- ruby-on-rails - 如何在 Rails 模板中在 content_for 之前使用 yield :content?
- javascript - 如何使用 Node.js 查询 mysql 数据库以通过 url 中的名称获取特定用户(字段),而不仅仅是通过 ID
- node.js - 如何区分linux原版命令和第三方软件命令
- javascript - 在事件中传递 JSON 文件:事件无法读取键,只能读取值
- ios - GRPC IOS 客户端连接丢失 - 目标 C
- python - 使用 QFileSystemModel 展开 QTreeView 中的项目
- javascript - 动态创建的下拉菜单未打开
- microsoft-graph-api - 在“oneDrive.item”类型上获取“属性 'openWith' 不是导航属性。” 尝试访问工作簿 api 时
- windows - 从不同的 powershell 会话访问在一个 powershell 会话中创建的远程 powershell 会话