Qt使用Dom操作XML文件

 

    Qt中對於XML文件的寫入有兩種方式,一個是使用QXmlStreamWriter,另一個則爲使用Dom。stream流的形式相對來說更加靈活,而且適合處理大文件。Dom方式由於是將內容加載到了內存中進行操作,所以對於小內存設備則有一定得侷限性。

 

下面給出一個用Dom寫xml文件的例子。

 

假設定義的節點如下

 

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <data>  
  3.     <startweek>2010-03-01</startweek>  
  4.     <readnum>3</readnum>  
  5.     <alarm>7</alarm>  
  6.     <prompt>Alarm Window</prompt>  
  7. </data>  
 

 

則將其寫爲xml文件時,方法如下:

 

 

  1. QFile file("write.xml");  
  2. if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate));  
  3. QDomDocument doc;  
  4. QDomProcessingInstruction instruction;  
  5. instruction = doc.createProcessingInstruction("xml","version=/"1.0/" encoding=/"UTF-8/"");  
  6. doc.appendChild(instruction);  
  7. QDomElement root=doc.createElement(tr("data"));  
  8. doc.appendChild(root);  
  9. QDomElement StartWeek=doc.createElement(tr("startweek"));  
  10. QDomElement ReadNumber=doc.createElement(tr("readnum"));  
  11. QDomElement AlarmTime=doc.createElement(tr("alarm"));  
  12. QDomElement AlarmPrompt=doc.createElement(tr("prompt"));  
  13. QDomText text;  
  14. text=doc.createTextNode("2010-03-01");  
  15. StartWeek.appendChild(text);  
  16. text=doc.createTextNode("2");  
  17. ReadNumber.appendChild(text);  
  18. text=doc.createTextNode("10");  
  19. AlarmTime.appendChild(text);  
  20. text=doc.createTextNode("vibration");  
  21. AlarmPrompt.appendChild(text);  
  22. root.appendChild(StartWeek);  
  23. root.appendChild(ReadNumber);  
  24. root.appendChild(AlarmTime);  
  25. root.appendChild(AlarmPrompt);  
  26. QTextStream out(&file);  
  27. doc.save(out,4);  
  28. file.close();  

 

 

 

QDomProcessingInstruction instruction;

        instruction = doc.createProcessingInstruction("xml","version=/"1.0/" encoding=/"UTF-8/"");

用來寫入XML文件的聲明,這對於一個XML文件來說不可缺少。

其次寫入根節點,然後依次寫入相應的子節點。最後從內存寫入文件中。

 

 

如果需要用Dom方式對其進行解析,則其爲一逆過程,方法如下:

 

 

 

  1. QDomDocument doc;  
  2.     QFile file("../TEA_Main/files/sysconfig.xml");  
  3.      if (!file.open(QIODevice::ReadOnly))  
  4.          return;  
  5.      if (!doc.setContent(&file)) {  
  6.          file.close();  
  7.          return;  
  8.      }  
  9.      file.close();  
  10.      QDomElement docElem = doc.documentElement();  
  11.      QDomNode n = docElem.firstChild();  
  12.      while(!n.isNull())  
  13.      {  
  14.          QDomElement e = n.toElement(); // try to convert the node to an element.   
  15.          if(!e.isNull())  
  16.          {  
  17.              qDebug()<<e.tagName() << ":" << e.text();  
  18.                
  19.          }  
  20.          n = n.nextSibling();  
  21.      }  
  22.      file.close();  
  23. }  

使用一個while循環將節點內容讀入內存,並根據自己的方式進行處理即可。

 

和前面的QXmlStreamReader解析XML相比,Dom顯然簡潔很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章