本文章主要讲解了如何使用QDomDocument XML实现对XML配置参数的修改以及保存,从而可以使程序每次都加载最新的配置参数。
配置参数XML文件:
<?xml version='1.0' encoding='UTF-8'?>
<parameters>
<CChannelLabel>
<ParameterItem>
<integer_parameters>5</integer_parameters>
</ParameterItem>
</CChannelLabel>
<CGainWidget>
<ParameterItem>
<double_parameters>40.1; 40.8; 40.9; 40.0; 10.5; 20.5; 40.0; 40.0</double_parameters>
</ParameterItem>
</CGainWidget>
</parameters>
XML修改程序:
void CDataMgr::UpdateParameterFile(const QString ItemName, pStParameterItems& parameter)
{
if (QFile::exists(m_strParameterFileName))
{
QFile rfile(m_strParameterFileName);
QByteArray dataBytes;
if (rfile.open(QIODevice::ReadOnly))
{
dataBytes = rfile.readAll();
rfile.close();
}
else
{
this->LogInfo(QString("The file:%1 open fail!").arg(m_strParameterFileName));
}
QDomDocument doc;
if (doc.setContent(dataBytes))
{
QDomElement root = doc.documentElement();
QDomNodeList nlist = root.elementsByTagName(ItemName);
QDomElement sub_element = nlist.at(0).toElement();
QDomNodeList integer_list = sub_element.elementsByTagName("integer_parameters");
if(integer_list.count() > 0)
{
QString nodeVal = "";
for(int i = 0; i < parameter->integer_parameters.size(); i++)
{
if(i > 0)
{
nodeVal += "; ";
}
nodeVal += QString::number(parameter->integer_parameters[i]);
}
QDomElement sub_element = integer_list.at(0).toElement();
QDomNode oldNode = sub_element.firstChild();
sub_element.firstChild().setNodeValue(nodeVal);
QDomNode newNode = sub_element.firstChild();
sub_element.replaceChild(newNode, oldNode);
}
QDomNodeList double_list = sub_element.elementsByTagName("double_parameters");
if(double_list.count() > 0)
{
QString nodeVal = "";
for(int i = 0; i < parameter->double_parameters.size(); i++)
{
if(i > 0)
{
nodeVal += "; ";
}
nodeVal += QString::number(parameter->double_parameters[i], 'f', 1);
}
QDomElement sub_element = double_list.at(0).toElement();
QDomNode oldNode = sub_element.firstChild();
sub_element.firstChild().setNodeValue(nodeVal);
QDomNode newNode = sub_element.firstChild();
sub_element.replaceChild(newNode, oldNode);
}
rfile.remove();
QFile wfile(m_strParameterFileName);
if (wfile.open(QIODevice::WriteOnly))
{
QTextStream out_stream(&wfile);
doc.save(out_stream,4);
wfile.close();
}
else
{
this->LogInfo(QString("The file:%1 open fail!").arg(m_strParameterFileName));
}
}
}
else
{
this->LogInfo(QString("The file:%1 NOT EXIST!").arg(m_strParameterFileName));
}
}