QT中使用QXmlStreamReader解析XML文件

XML文件由于其扩展性与兼容性的优点,被广泛用作软件和系统的配置文件。这里简要介绍一下QT下如何来解析XML文件。

源代码:

xml_reader.h

Code:
  1. #ifndefXML_READER_H
  2. #defineXML_READER_H
  3. #include<QtCore>
  4. //#include<QtGui>
  5. classxml_reader:publicQXmlStreamReader
  6. {
  7. //Q_OBJECT
  8. public:
  9. xml_reader();
  10. boolread(QIODevice*device);
  11. private:
  12. voidread_data();
  13. voidread_startweek();
  14. voidread_eventnumber();
  15. voidread_period();
  16. voidread_id();
  17. voidread_starttime();
  18. voidread_endtime();
  19. voidread_exception();
  20. voidread_subexception();
  21. voidread_description();
  22. voidread_duration();
  23. voidread_event();
  24. voidread_offsettime();
  25. voidread_eventdesc();
  26. voidread_eventname();
  27. voidread_prompt();
  28. voidread_lasthandle();
  29. voidread_unknow();
  30. };
  31. #endif//XML_READER_H

xml_reader.cpp

Code:
  1. #include"xml_reader.h"
  2. xml_reader::xml_reader()
  3. {}
  4. boolxml_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. voidxml_reader::read_data()
  21. {
  22. qDebug()<<"Starttoreaddata...";
  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()<<"Nowattheendofdataelement...";
  46. break;
  47. }
  48. }
  49. }
  50. }
  51. voidxml_reader::read_startweek()
  52. {
  53. qDebug()<<"startweekis:"<<readElementText();
  54. }
  55. voidxml_reader::read_eventnumber()
  56. {
  57. qDebug()<<"eventNumberis:"<<readElementText();
  58. }
  59. voidxml_reader::read_period()
  60. {
  61. qDebug()<<"Starttoreadperiod...";
  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()<<"Nowattheendofperiod...";
  97. break;
  98. }
  99. }
  100. }
  101. }
  102. voidxml_reader::read_id()
  103. {
  104. qDebug()<<"idis:"<<readElementText();
  105. }
  106. voidxml_reader::read_starttime()
  107. {
  108. qDebug()<<"starttimeis:"<<readElementText();
  109. }
  110. voidxml_reader::read_endtime()
  111. {
  112. qDebug()<<"endtimeis:"<<readElementText();
  113. }
  114. voidxml_reader::read_exception()
  115. {
  116. qDebug()<<"Starttoreadexception...";
  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()<<"Nowattheendofexception...";
  132. break;
  133. }
  134. }
  135. }
  136. }
  137. voidxml_reader::read_subexception()
  138. {
  139. qDebug()<<"Starttoreadsubexception...";
  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()<<"Nowattheendofsubexception...";
  167. break;
  168. }
  169. }
  170. }
  171. }
  172. voidxml_reader::read_description()
  173. {
  174. qDebug()<<"descriptionis:"<<readElementText();
  175. }
  176. voidxml_reader::read_duration()
  177. {
  178. qDebug()<<"durationis:"<<readElementText();
  179. }
  180. voidxml_reader::read_event()
  181. {
  182. qDebug()<<"Starttoreadevent...";
  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()<<"Nowattheendofevent..";
  210. break;
  211. }
  212. }
  213. }
  214. }
  215. voidxml_reader::read_offsettime()
  216. {
  217. qDebug()<<"offsettimeis:"<<readElementText();
  218. }
  219. voidxml_reader::read_eventdesc()
  220. {
  221. qDebug()<<"Starttoreadeventdesc...";
  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()<<"Nowattheendofeventdesc...";
  241. break;
  242. }
  243. }
  244. }
  245. }
  246. voidxml_reader::read_eventname()
  247. {
  248. qDebug()<<"eventnameis:"<<readElementText();
  249. }
  250. voidxml_reader::read_prompt()
  251. {
  252. qDebug()<<"promptis:"<<readElementText();
  253. }
  254. voidxml_reader::read_lasthandle()
  255. {
  256. qDebug()<<"lasthandleis:"<<readElementText();
  257. }

main.cpp

Code:
  1. #include<QtCore/QCoreApplication>
  2. #include"xml_reader.h"
  3. intmain(intargc,char*argv[])
  4. {
  5. QCoreApplicationa(argc,argv);
  6. QFilefile("praser.xml");
  7. xml_readerreader;
  8. if(file.open(QIODevice::ReadOnly|QIODevice::Text))
  9. {
  10. qDebug()<<"Filehasloaded...";
  11. reader.read(&file);
  12. }
  13. else
  14. {
  15. qDebug()<<"Nofiletoread...";
  16. }
  17. file.close();
  18. qDebug()<<"Pressctrl+Ctoexit...";
  19. returna.exec();
  20. }

XML文件范例praser.xml

Code:
  1. <?xmlversion="1.0"encoding="GBK"?>
  2. <data>
  3. <startweek>2010-03-0100:00:00.000</startweek>
  4. <eventnumber>2</eventnumber>
  5. <period>
  6. <id>223401</id>
  7. <starttime>2010-03-0100:00:00.000</starttime>
  8. <endtime>2010-06-2023:59:59.999</endtime>
  9. <exception>
  10. <subexception>
  11. <id>01</id>
  12. <starttime>2010-04-0300:00:00.000</starttime>
  13. <endtime>2010-04-0523:59:59.000</endtime>
  14. <description>清明节放假三天</description>
  15. </subexception>
  16. <subexception>
  17. <id>02</id>
  18. <starttime>2010-05-0100:00:00.000</starttime>
  19. <endtime>2010-05-0323:59:59.000</endtime>
  20. <description>五一劳动节放假三天</description>
  21. </subexception>
  22. </exception>
  23. <duration>0000-00-0700:00:00.000</duration>
  24. <event>
  25. <id>01</id>
  26. <offsettime>0000-00-0014: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-0309: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来进行解析,因而所有的节点都需要自己编写函数进行相应的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值