• 10430阅读
  • 3回复

求助:关于xml文件读写的问题 [复制链接]

上一主题 下一主题
离线chen_hit
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-05
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
我现在要利用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);

但是根据上述程序无法实现,请高手指点该如何处理。
离线wd007

只看该作者 1楼 发表于: 2009-01-08
向下递归
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线chen_hit
只看该作者 2楼 发表于: 2009-01-09
其中我要修改的元素是可以通过循环实现的,我在调试的时候测试过,只是现在无法将原xml文件中该元素中的属性进行修改,请楼上的朋友再讲清楚一点,具体如何递归
离线wd007

只看该作者 3楼 发表于: 2009-01-11
你的程序我没有看太清楚,看你的测试文件的话,也许不用递归了,你是用DOM的方式读写的吧,在《C++ GUI Qt4 编程》第16章有类似讲解,你可以参考。
我想与windows上的xml的解析思路并无区别,只是语句有些陌生。呵呵,互相学习
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个