我现在要利用QT实现xml文件的读写,xml文件由多个并列子元素组成,例如:
<config>
<one>
<Nonimal mean="Nonimal" value="100" remark="" />
<Upper mean="Upper" value="1.0" remark="" />
<Lower mean="Lower" value="0" remark="" />
<Control mean="Control" value="constant" remark="" />
</one>
<two>
<Nonimal mean="Nonimal" value="100" remark="" />
<Upper mean="Upper" value="1.0" remark="" />
<Lower mean="Lower" value="0" remark="" />
<Control mean="Control" value="constant" remark="" /> </two>
<three>
<Nonimal mean="Nonimal" value="100" remark="" />
<Upper mean="Upper" value="1.0" remark="" />
<Lower mean="Lower" value="0" remark="" />
<Control mean="Control" value="constant" remark="" /> </three>
</config>
该文件读取之后利用QTableWidget显示内容,在QTableWidget界面设置选择按钮,当选择1时显示one元素节点下的属性内容,当选择2时显示two元素节点下的属性内容,等等。同样,需要实现修改保存功能,当显示2的内容时,我在QTableWidget界面修改相应的值,并点确认按钮后,将显示内容保存为新xml文件替换掉源文件,我的思路时通过循环找到当前界面显示内容在原文件中的元素节点位置,再重新生成该节点下的元素及属性,程序如下:
file_config.open(QIODevice::WriteOnly);
QDomDocument doc_base;
QDomElement element;
count=selectSpinBox->value()-1;
QDomElement root=doc_config.documentElement();//定义第一层根元素
QDomElement first_child=root.firstChildElement();//定义根元素的第一个节点
QDomElement second_child=first_child.firstChildElement();//定义第一个节点的子元素
int child_Num=0;
while (!first_child.isNull()&&child_Num==0)
{
while(child_Num!=count)
{
first_child=first_child.nextSiblingElement();//获取下一个节点
second_child=first_child.firstChildElement();//定义第一个节点的子元素
child_Num++;
}
for(int i=0;i<TableWidget->rowCount();i++)
{
Row=i;
Column=0;
mean=TableWidget->takeItem(Row,Column++)->text();
value=TableWidget->takeItem(Row,Column++)->text();
remark=TableWidget->takeItem(Row,Column)->text();
//定义config.xml文件的额定节点
if (mean=="Nonimal")
{
element=doc_base.createElement("Nonimal");
QDomAttr meanItem=doc_base.createAttribute("mean");
meanItem.setValue(mean);
QDomAttr valueItem=doc_base.createAttribute("value");
valueItem.setValue(value);
QDomAttr remarkItem= doc_base.createAttribute("remark");
remarkItem.setValue(remark);
element.setAttributeNode(meanItem);
element.setAttributeNode(valueItem);
element.setAttributeNode(remarkItem);
first_child.appendChild(element);
}
//定义config.xml文件的上限节点
if (mean=="Upper")
{
element=doc_base.createElement("Upper");
QDomAttr meanItem = doc_base.createAttribute("mean");
meanItem.setValue(mean);
QDomAttr valueItem = doc_base.createAttribute("value");
valueItem.setValue(value);
QDomAttr remarkItem = doc_base.createAttribute("remark");
remarkItem.setValue(remark);
element.setAttributeNode(meanItem);
element.setAttributeNode(valueItem);
element.setAttributeNode(remarkItem);
first_child.appendChild(element);
}
//定义config.xml文件的下限节点
if (mean=="Lower")
{
element=doc_base.createElement("Lower_Active_Power");
QDomAttr meanItem = doc_base.createAttribute("mean");
meanItem.setValue(mean);
QDomAttr valueItem = doc_base.createAttribute("value");
valueItem.setValue(value);
QDomAttr remarkItem = doc_base.createAttribute("remark");
remarkItem.setValue(remark);
element.setAttributeNode(meanItem);
element.setAttributeNode(valueItem);
element.setAttributeNode(remarkItem);
first_child.appendChild(element);
}
//定义config.xml文件的控制节点
if (mean=="Control")
{
element=doc_base.createElement("Control_Mode");
QDomAttr meanItem = doc_base.createAttribute("mean");
meanItem.setValue(mean);
QDomAttr valueItem = doc_base.createAttribute("value");
valueItem.setValue(value);
QDomAttr remarkItem = doc_base.createAttribute("remark");
remarkItem.setValue(remark);
element.setAttributeNode(meanItem);
element.setAttributeNode(valueItem);
element.setAttributeNode(remarkItem);
first_child.appendChild(element);
}
}
}
QTextStream out(&file_config);
doc_base.save(out,4);
但是根据上述程序无法实现,请高手指点该如何处理。