问题描述:一个参数有几种或上百种取值可能
举例:当a<1时,b=0;1<a<10时,b=2;10<a<20时,b=3…
即b的取值依据a的范围来决定
之前问题解决方案:通常在只有少数几种可能的情况下会使用if或者switch语句实现,但是当取值可能太多时,这种方法比较混乱,并且不易维护和后期修改。
现在解决方法:以xml文件作为参数配置文件,然后通过读取xml文件的形式实现参数取值。
示例:当0<a<8时,返回b=12;
8<a<10时,返回b=29;
10<a<17时,返回b=57;
17<a<31时,返回b=93;
31<a<50时,返回b=139;
如下是参数的配置文件
代码实现
float A::cal_esv(float D )
{
//打开文件
QFile file("D/Work/test.xml");
if (!file.open(QFile::ReadWrite | QIODevice::Text)) return -1;
QXmlStreamReader xmlreader(&file); //读文件
xmlreader.readNext(); //直接读取下一个节点,因为首先读到的标签是XML文件的头部(第一行)
while (!xmlreader.atEnd())
{
xmlreader.readNext(); //读取子节点
if (xmlreader.isStartElement() && xmlreader.name() == "Param") //ParamClass是子节点的名字
{
//循环读取子节点
while (!(xmlreader.name() == "Param" && xmlreader.isEndElement()))
{
xmlreader.readNextStartElement();
if (D > xmlreader.attributes().value("MIN").toFloat() && D <= xmlreader.attributes().value("MAX").toFloat())
{
return xmlreader.readElementText().toFloat(); //返回节点内容
}
}
}
}
file.close();
return 0;
}
总结:
QXmlStreamReader xmlReader(&filename)
用来创建一个迭代变量,其中xmlReader就是一个迭代器readNext():
从xml输入流中读取下一个记号。name():
节点的名字,即<名称></名称>isStartElement():
判断当前已读取的记号是否为开始元素,开始元素即<>isEndElement():
判断当前已读取的记号是否为结束元素,结束元素即</>readElementText():
读取当前记号对应的文本值,<>文本值</>atEnd():
判断是否为文件结尾attributes():
获取含有属性的节点的属性