Hi all

i am in a trouble. My xml file is not edit right. Whem i am editing the file the contents to be edit are written in file with the rest data of file again. I am using Dom for reading and writing xml.

My code is

Qt Code:
  1. void HomeWindow::create_xml_file()
  2. {
  3. QFile *file = new QFile("E:/new.txt");
  4. if(!edit_flag){ /// craeting the file and write in it in this condition
  5. const int Indent = 4;
  6. int id_value;
  7. static QDomDocument doc;
  8. static QDomElement root,root1;
  9. QDomElement statement, action_node, condition_node;
  10. QDomText id_text;
  11. root = doc.createElement("root");
  12.  
  13. if(!file->exists())
  14. {
  15. file->open(QIODevice::WriteOnly);
  16. QDomElement id = doc.createElement("id");
  17. id_text = doc.createTextNode("0");
  18. root.appendChild(id);
  19. id.appendChild(id_text);
  20. doc.appendChild(root);
  21. }
  22. else
  23. {
  24. file->open(QFile::ReadWrite);
  25. doc.setContent(file);
  26. root1 = doc.documentElement();
  27. QDomElement node = root1.firstChildElement("id");
  28. QString id_string = node.text();
  29. id_value = id_string.toInt();
  30. QDomElement new_id_node = doc.createElement(QString("id"));
  31. QDomText new_id_Text = doc.createTextNode(QString::number(++id_value));
  32. new_id_node.appendChild(new_id_Text); // replace existing node with new node
  33. root1.replaceChild(new_id_node, node);
  34. statement = doc.createElement("statement");
  35. condition_node = doc.createElement("condition");
  36. action_node = doc.createElement("action");
  37. QDomText condition_text = doc.createTextNode(condition_text_edit->toPlainText());
  38. QDomText action_text = doc.createTextNode(action_text_edit->toPlainText());
  39. statement.setAttribute("id", id_value);
  40. statement.appendChild(condition_node);
  41. statement.appendChild(action_node);
  42. condition_node.appendChild(condition_text);
  43. action_node.appendChild(action_text);
  44. root1.appendChild(statement);
  45. file->seek(0);
  46. static int i =1;
  47. table->setRowCount(i);
  48. QTableWidgetItem *item_id = new QTableWidgetItem(QString::number(id_value));
  49. QTableWidgetItem *item_condition = new QTableWidgetItem(condition_text_edit->toPlainText());
  50. QTableWidgetItem *item_action = new QTableWidgetItem(action_text_edit->toPlainText());
  51. int row = i;
  52. row = --row;
  53. table->setItem(row, 0, item_id);
  54. table->setItem(row, 1, item_condition);
  55. table->setItem(row, 2, item_action);
  56. i++;
  57. condition_text_edit->clear();
  58. action_text_edit->clear();
  59. }
  60. QTextStream out(file);
  61. doc.save(out, Indent);
  62. if(file->error())
  63. qDebug()<<"error"<<file->errorString();
  64. }
  65. else{ ///////edit the file
  66. const int indent =8;
  67. file->open(QFile::ReadWrite);
  68. doc.setContent(file);
  69. QDomElement root_edit = doc.documentElement();
  70. QDomNode node = root_edit.firstChild();
  71. while(!node.isNull())
  72. {
  73. if (node.toElement().tagName() == "statement"){
  74. if(string_id == node.toElement().attribute("id"))
  75. {
  76. QDomElement statement = doc.createElement("statement");
  77. statement.setAttribute("id", string_id);
  78. QDomElement condition_node = doc.createElement("condition");
  79. QDomElement action_node = doc.createElement("action");
  80. QDomText condition_text = doc.createTextNode(condition_text_edit->toPlainText());
  81. QDomText action_text = doc.createTextNode(action_text_edit->toPlainText());
  82. statement.appendChild(condition_node);
  83. statement.appendChild(action_node);
  84. condition_node.appendChild(condition_text);
  85. action_node.appendChild(action_text);
  86. root_edit.replaceChild(statement, node.toElement());
  87. break;
  88. }
  89. }
  90. node = node.nextSibling();
  91. }
  92. QTextStream out(file);
  93. doc.save(out, indent);
  94. QTableWidgetItem *item_id = new QTableWidgetItem(string_id);
  95. QTableWidgetItem *item_condition = new QTableWidgetItem(condition_text_edit->toPlainText());
  96. QTableWidgetItem *item_action = new QTableWidgetItem(action_text_edit->toPlainText());
  97. table->setItem(row_index, 0, item_id);
  98. table->setItem(row_index, 1, item_condition);
  99. table->setItem(row_index, 2, item_action);
  100. condition_text_edit->clear();
  101. action_text_edit->clear();
  102. edit_flag = false;
  103. }
  104. }
To copy to clipboard, switch view to plain text mode 

My xml file is looking like following

<root>
<id>3</id>
<statement id="1">
<condition>Digital Input Equals to END</condition>
<action>Analog Output Equals to END</action>
</statement>
<statement id="2">
<condition>Digital Input Equals to END</condition>
<action>Analog Output Equals to END</action>
</statement>
<statement id="3">
<condition>Digital Input Equals to END</condition>
<action>Analog Output Equals to END</action>
</statement>
</root>
tput Equals to END</action>
</statement>
<statement id="2">
<condition>Digital Input Equals to END</condition>
<action>gffjryjuuyd</action>
</statement>
</root>
<root>
<id>3</id>
<statement id="1">
<condition>Digital Input Equals to END</condition>
<action>Analog Output Equals to END</action>
</statement>
<statement id="2">
<condition>Digital Input Equals to END</condition>
<action>Analog Output Equals to END</action>
</statement>
<statement id="3">
<condition>Digital Input Equals to END</condition>
<action>gjkghk</action>
</statement>
</root>


Please guide me where i am wrong.
Waiting for quick reply.
Thanks.