QT中使用QXmlStreamReader解析XML文件

 

QT中使用QXmlStreamReader解析XML文件

分類: Qt 3519人閱讀 評論(5) 收藏 舉報

轉載請註明鏈接與作者huihui1988

 

XML文件由於其擴展性與兼容性的優點,被廣泛用作軟件和系統的配置文件。這裏簡要介紹一下QT下如何來解析XML文件。

 

源代碼:

xml_reader.h

 

  1. #ifndef XML_READER_H   
  2. #define XML_READER_H   
  3. #include <QtCore>   
  4. //#include <QtGui>   
  5. class xml_reader : public QXmlStreamReader  
  6. {  
  7.     //Q_OBJECT   
  8. public:  
  9.     xml_reader();  
  10.     bool read(QIODevice *device);  
  11. private:  
  12.     void read_data();  
  13.     void read_startweek();  
  14.     void read_eventnumber();  
  15.     void read_period();  
  16.     void read_id();  
  17.     void read_starttime();  
  18.     void read_endtime();  
  19.     void read_exception();  
  20.     void read_subexception();  
  21.     void read_description();  
  22.     void read_duration();  
  23.     void read_event();  
  24.     void read_offsettime();  
  25.     void read_eventdesc();  
  26.     void read_eventname();  
  27.     void read_prompt();  
  28.     void read_lasthandle();  
  29.     void read_unknow();  
  30. };  
  31. #endif // XML_READER_H  
 

 

xml_reader.cpp

 

  1. #include "xml_reader.h"   
  2. xml_reader::xml_reader()  
  3. {}  
  4. bool xml_reader::read(QIODevice *device)  
  5. {  
  6.     setDevice(device);  
  7.     while(!atEnd())  
  8.     {  
  9.         readNext();  
  10.         if(isStartElement())  
  11.         {  
  12.             if(name() == "data")  
  13.             {  
  14.                 read_data();  
  15.             }  
  16.         }  
  17.     }  
  18.     return !error();  
  19. }  
  20. void xml_reader::read_data()  
  21. {  
  22.     qDebug()<<"Start to read data...";  
  23.     while(!atEnd())  
  24.     {  
  25.         readNext();  
  26.         if(isStartElement())  
  27.         {  
  28.             if(name() == "period")  
  29.             {  
  30.                 read_period();  
  31.             }  
  32.             if(name() == "startweek")  
  33.             {  
  34.                 read_startweek();  
  35.             }  
  36.             if(name() == "eventnumber")  
  37.             {  
  38.                 read_eventnumber();  
  39.             }  
  40.         }  
  41.         if(isEndElement())  
  42.         {  
  43.             if(name() == "data")  
  44.             {  
  45.                 qDebug()<<"Now at the end of data element...";  
  46.                 break;  
  47.             }  
  48.         }  
  49.     }  
  50. }  
  51. void xml_reader::read_startweek()  
  52. {  
  53.     qDebug()<<"startweek is: "<<readElementText();  
  54. }  
  55. void xml_reader::read_eventnumber()  
  56. {  
  57.     qDebug()<<"eventNumber is: "<<readElementText();  
  58. }  
  59. void xml_reader::read_period()  
  60. {  
  61.     qDebug()<<"Start to read period...";  
  62.     while(!atEnd())  
  63.     {  
  64.         readNext();  
  65.         if(isStartElement())  
  66.         {  
  67.             if(name() == "id")  
  68.             {  
  69.                 read_id();  
  70.             }  
  71.             if(name() == "starttime")  
  72.             {  
  73.                 read_starttime();  
  74.             }  
  75.             if(name() == "endtime")  
  76.             {  
  77.                 read_endtime();  
  78.             }  
  79.             if(name() == "exception")  
  80.             {  
  81.                 read_exception();  
  82.             }  
  83.             if(name() == "duration")  
  84.             {  
  85.                 read_duration();  
  86.             }  
  87.             if(name() == "event")  
  88.             {  
  89.                 read_event();  
  90.             }  
  91.         }  
  92.         if(isEndElement())  
  93.         {  
  94.             if(name() == "period")  
  95.             {  
  96.             qDebug()<<"Now at the end of period...";  
  97.             break;  
  98.             }  
  99.         }  
  100.     }  
  101. }  
  102. void xml_reader::read_id()  
  103. {  
  104.     qDebug()<<"id is: " << readElementText();  
  105. }  
  106. void xml_reader::read_starttime()  
  107. {  
  108.     qDebug()<<"starttime is: " << readElementText();  
  109. }  
  110. void xml_reader::read_endtime()  
  111. {  
  112.     qDebug()<<"endtime is: " << readElementText();  
  113. }  
  114. void xml_reader::read_exception()  
  115. {  
  116.     qDebug()<<"Start to read exception...";  
  117.     while(!atEnd())  
  118.     {  
  119.         readNext();  
  120.         if(isStartElement())  
  121.         {  
  122.             if(name() == "subexception")  
  123.             {  
  124.                 read_subexception();  
  125.             }  
  126.         }  
  127.         if(isEndElement())  
  128.         {  
  129.             if(name() == "exception")  
  130.             {  
  131.             qDebug()<<"Now at the end of exception...";  
  132.             break;  
  133.             }  
  134.         }  
  135.     }  
  136. }  
  137. void xml_reader::read_subexception()  
  138. {  
  139.     qDebug()<<"Start to read subexception...";  
  140.     while(!atEnd())  
  141.     {  
  142.         readNext();  
  143.         if(isStartElement())  
  144.         {  
  145.             if(name() == "id")  
  146.             {  
  147.                 read_id();  
  148.             }  
  149.             if(name() == "starttime")  
  150.             {  
  151.                 read_starttime();  
  152.             }  
  153.             if(name() == "endtime")  
  154.             {  
  155.                 read_endtime();  
  156.             }  
  157.             if(name() == "description")  
  158.             {  
  159.                 read_description();  
  160.             }  
  161.         }  
  162.         if(isEndElement())  
  163.         {  
  164.             if(name() == "subexception")  
  165.             {  
  166.             qDebug()<<"Now at the end of subexception...";  
  167.             break;  
  168.             }  
  169.         }  
  170.     }  
  171. }  
  172. void xml_reader::read_description()  
  173. {  
  174.     qDebug()<<"description is: " << readElementText();  
  175. }  
  176. void xml_reader::read_duration()  
  177. {  
  178.     qDebug()<<"duration is: " << readElementText();  
  179. }  
  180. void xml_reader::read_event()  
  181. {  
  182.     qDebug()<<"Start to read event...";  
  183.     while(!atEnd())  
  184.     {  
  185.         readNext();  
  186.         if(isStartElement())  
  187.         {  
  188.             if(name() == "id")  
  189.             {  
  190.                 read_id();  
  191.             }  
  192.             if(name() == "offsettime")  
  193.             {  
  194.                 read_offsettime();  
  195.             }  
  196.             if(name() == "eventdesc")  
  197.             {  
  198.                 read_eventdesc();  
  199.             }  
  200.             if(name() == "lasthandle")  
  201.             {  
  202.                 read_lasthandle();  
  203.             }  
  204.         }  
  205.         if(isEndElement())  
  206.         {  
  207.             if(name() == "event")  
  208.             {  
  209.             qDebug()<<"Now at the end of event..";  
  210.             break;  
  211.             }  
  212.         }  
  213.     }  
  214. }  
  215. void xml_reader::read_offsettime()  
  216. {  
  217.     qDebug()<<"offsettime is: " << readElementText();  
  218. }  
  219. void xml_reader::read_eventdesc()  
  220. {  
  221.     qDebug()<<"Start to read eventdesc...";  
  222.     while(!atEnd())  
  223.     {  
  224.         readNext();  
  225.         if(isStartElement())  
  226.          {  
  227.             if(name() == "eventname")  
  228.             {  
  229.                 read_eventname();  
  230.             }  
  231.             if(name() == "prompt")  
  232.             {  
  233.                 read_prompt();  
  234.             }  
  235.          }  
  236.         if(isEndElement())  
  237.         {  
  238.             if(name() == "eventdesc")  
  239.             {  
  240.                 qDebug()<<"Now at the end of eventdesc...";  
  241.                 break;  
  242.             }  
  243.         }  
  244.     }  
  245. }  
  246. void xml_reader::read_eventname()  
  247. {  
  248.     qDebug()<<"eventname is: " << readElementText();  
  249. }  
  250. void xml_reader::read_prompt()  
  251. {  
  252.     qDebug()<<"prompt is: " << readElementText();  
  253. }  
  254. void xml_reader::read_lasthandle()  
  255. {  
  256.     qDebug()<<"lasthandle is: " << readElementText();  
  257. }  
 main.cpp

 

 

  1. #include <QtCore/QCoreApplication>   
  2. #include "XmlPraser.h"   
  3. int main(int argc, char *argv[])  
  4. {  
  5.     QCoreApplication a(argc, argv);  
  6.     QFile file("praser.xml");  
  7.     XmlPraser reader;  
  8.     if(file.open(QIODevice::ReadOnly | QIODevice::Text))  
  9.     {  
  10.         qDebug()<<"File has loaded...";  
  11.         reader.read(&file);  
  12.     }  
  13.     else  
  14.     {  
  15.         qDebug()<<"No file to read...";  
  16.     }  
  17.     file.close();  
  18.     qDebug()<<"Press ctrl+C to exit...";  
  19.     return a.exec();  
  20. }  
 

 

XML文件範例 praser.xml

 

  1. <?xml version="1.0" encoding="GBK" ?>  
  2. <data>  
  3. <startweek>2010-03-01 00:00:00.000</startweek>  
  4. <eventnumber>2</eventnumber>  
  5. <period>  
  6. <id>223401</id>  
  7. <starttime>2010-03-01 00:00:00.000</starttime>  
  8. <endtime>2010-06-20 23:59:59.999</endtime>  
  9. <exception>  
  10. <subexception>  
  11. <id>01</id>  
  12. <starttime>2010-04-03 00:00:00.000</starttime>  
  13. <endtime>2010-04-05 23:59:59.000</endtime>  
  14. <description>清明節放假三天</description>  
  15. </subexception>  
  16. <subexception>  
  17. <id>02</id>  
  18. <starttime>2010-05-01 00:00:00.000</starttime>  
  19. <endtime>2010-05-03 23:59:59.000</endtime>  
  20. <description>五一勞動節放假三天</description>  
  21. </subexception>  
  22. </exception>  
  23. <duration>0000-00-07 00:00:00.000</duration>  
  24. <event>  
  25. <id>01</id>  
  26. <offsettime>0000-00-00 14:00:00.000</offsettime>  
  27. <eventdesc>  
  28. <eventname>編譯原理</eventname>  
  29. <prompt>ring</prompt>  
  30. </eventdesc>  
  31. <lasthandle>null</lasthandle>  
  32. </event>  
  33. <event>  
  34. <id>02</id>  
  35. <offsettime>0000-00-03 09:50:00.000</offsettime>  
  36. <eventdesc>  
  37. <eventname>編譯原理</eventname>  
  38. <prompt>vibration</prompt>  
  39. </eventdesc>  
  40. <lasthandle>null</lasthandle>  
  41. </event>  
  42. </period>  
  43. </data>  
 

 

 

由於是使用的QXmlStrramReader來進行解析,因而所有的節點都需要自己編寫函數進行相應的處理。

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