c语言环境下的xml数据的序列化的过程以机顶盒向手机APK发送数据为例

前端之家收集整理的这篇文章主要介绍了c语言环境下的xml数据的序列化的过程以机顶盒向手机APK发送数据为例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_0@机顶盒向手机apk端发送xml格式的数据流程如下所示:

@H_403_0@1.调用函数 (1) send_xml_data_to _mobile() ;

@H_403_0@2.在函数(1)中调用函数(2)send_common_data_to_mobile();

@H_403_0@3.在函数(2)中调用函数(3)create_xml_buff(),并向函数传递了三个重要的参数,分别是压缩前的xml数据缓存xml_send_buff_before_compress,和一个结构体xml_root,以及xml_type;

@H_403_0@4.在函数(3)中分情况讨论,调用不同的方法创建携带不同信息的xml文件;

@H_403_0@在该项目中携带不同数据信息的xml文件生成主要通过使用libxml2所携带的库函数完成xml文件的创建

@H_403_0@以创建频道节目列表为例:

  1. static BOOL create_channel_list_xml(char *result_buffer,void * buf)
  2. {
  3. xmlTextWriterPtr writer;
  4. int rc;
  5. int program_index = 0,j;
  6. char str[GMS_MAX_BYTE_LENGTH_SERVICE_NAME];
  7. char buff[GMS_MAX_BYTE_LENGTH_SERVICE_NAME];
  8. GS_CHANNEL_LIST* channel_list = buf;
  9. int prog_num;
  10. GMS_PROGRAM_INFO * xml_array;
  11. xmlBufferPtr xml_buf = NULL;
  12.  
  13. if (result_buffer == NULL)
  14. {
  15. return FALSE;
  16. }
  17. prog_num = channel_list->request_program_num;
  18. xml_array = channel_list->program_list;
  19.  
  20. xml_buf = xmlBufferCreateSize(PROGRAM_SMALL_XML_BUFF_LENGTH);
  21.  
  22. if (xml_buf == NULL)
  23. {
  24. return FALSE;
  25. }
  26. LIBXML_TEST_VERSION
  27. writer = xmlNewTextWriterMemory(xml_buf,0);
  28. if (writer == NULL)
  29. {
  30. printf("testXmlwriterFilename: Error creating the xml writer\n");
  31. return FALSE;
  32. }
  33. rc = xmlTextWriterStartDocument(writer,NULL,MY_ENCODING,NULL);
  34.  
  35. if (rc < 0)
  36. {
  37. printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
  38. xmlFreeTextWriter(writer);
  39. return FALSE;
  40. }
  41.  
  42. //Command
  43. rc = xmlTextWriterStartElement(writer,BAD_CAST "Command");
  44. if (rc < 0)
  45. {
  46. printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
  47. xmlFreeTextWriter(writer);
  48. return FALSE;
  49. }
  50.  
  51. for (program_index = 0; program_index < prog_num; program_index++)
  52. {
  53. //parm
  54. rc = xmlTextWriterStartElement(writer,BAD_CAST "parm");
  55. if (rc < 0)
  56. {
  57. printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n");
  58. xmlFreeTextWriter(writer);
  59. return FALSE;
  60. }
  61.  
  62. //ProgramId
  63. rc = xmlTextWriterWriteElement(writer,BAD_CAST "ProgramId",BAD_CAST xml_array[program_index].prog_sat_tp_id);
  64. if (rc < 0)
  65. {
  66. printf("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n");
  67. xmlFreeTextWriter(writer);
  68. return FALSE;
  69. }
  70.  
  71. //ProgramName
  72. convert_windows_to_utf8(xml_array[program_index].prog_name,xml_array[program_index].prog_name,sizeof(xml_array[program_index].prog_name),-1);
  73. rc = xmlTextWriterWriteElement(writer,BAD_CAST "ProgramName",BAD_CAST xml_array[program_index].prog_name);
  74. if (rc < 0)
  75. {
  76. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  77. xmlFreeTextWriter(writer);
  78. return FALSE;
  79. }
  80.  
  81. //ProgamIndex
  82. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "ProgramIndex","%d",xml_array[program_index].prog_index);
  83. if (rc < 0)
  84. {
  85. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  86. xmlFreeTextWriter(writer);
  87. return FALSE;
  88. }
  89.  
  90. //SatName
  91. // rc = xmlTextWriterWriteElement(writer,BAD_CAST "SatName",BAD_CAST xml_array[i].sat_name);
  92. // if (rc < 0)
  93. // {
  94. // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  95. // xmlFreeTextWriter(writer);
  96. // return FALSE;
  97. // }
  98.  
  99. //ProgramType
  100. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "ProgramType",xml_array[program_index].is_scramble);
  101. if (rc < 0)
  102. {
  103. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  104. xmlFreeTextWriter(writer);
  105. return FALSE;
  106. }
  107.  
  108. //Is HD channel
  109. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "IsProgramHD",xml_array[program_index].is_hd);
  110. if (rc < 0)
  111. {
  112. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  113. xmlFreeTextWriter(writer);
  114. return FALSE;
  115. }
  116.  
  117. //FavMark
  118. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "FavMark",xml_array[program_index].fav_mark);
  119. if (rc < 0)
  120. {
  121. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  122. xmlFreeTextWriter(writer);
  123. return FALSE;
  124. }
  125.  
  126. //LockMark
  127. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "LockMark",xml_array[program_index].lock_mark);
  128. if (rc < 0)
  129. {
  130. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  131. xmlFreeTextWriter(writer);
  132. return FALSE;
  133. }
  134.  
  135. //haveEPG
  136. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "HaveEPG",xml_array[program_index].have_epg);
  137. if (rc < 0)
  138. {
  139. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  140. xmlFreeTextWriter(writer);
  141. return FALSE;
  142. }
  143.  
  144. //is_playing
  145. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "IsPlaying",xml_array[program_index].is_playing);
  146. if (rc < 0)
  147. {
  148. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  149. xmlFreeTextWriter(writer);
  150. return FALSE;
  151. }
  152.  
  153. //will_be_played
  154. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "WillBePlayed",xml_array[program_index].will_be_played);
  155. if (rc < 0)
  156. {
  157. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  158. xmlFreeTextWriter(writer);
  159. return FALSE;
  160. }
  161.  
  162. //CurChannelType
  163. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "ChannelType",xml_array[program_index].channel_type);
  164. if (rc < 0)
  165. {
  166. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  167. xmlFreeTextWriter(writer);
  168. return FALSE;
  169. }
  170.  
  171. // //freq
  172. // rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "Frequency",xml_array[i].freq);
  173. // if (rc < 0)
  174. // {
  175. // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  176. // xmlFreeTextWriter(writer);
  177. // return FALSE;
  178. // }
  179. //
  180. // //pol
  181. // rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "Polar",xml_array[i].pol);
  182. // if (rc < 0)
  183. // {
  184. // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  185. // xmlFreeTextWriter(writer);
  186. // return FALSE;
  187. // }
  188.  
  189. //modulation_sys
  190. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "ModulationSystem",xml_array[program_index].modulation_sys);
  191. if (rc < 0)
  192. {
  193. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  194. xmlFreeTextWriter(writer);
  195. return FALSE;
  196. }
  197.  
  198. //modulation_type
  199. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "ModulationType",xml_array[program_index].modulation_type);
  200. if (rc < 0)
  201. {
  202. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  203. xmlFreeTextWriter(writer);
  204. return FALSE;
  205. }
  206.  
  207. //roll_off
  208. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "RollOff",xml_array[program_index].roll_off);
  209. if (rc < 0)
  210. {
  211. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  212. xmlFreeTextWriter(writer);
  213. return FALSE;
  214. }
  215.  
  216. //pilot_tones
  217. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "PilotTones",xml_array[program_index].pilot_tones);
  218. if (rc < 0)
  219. {
  220. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  221. xmlFreeTextWriter(writer);
  222. return FALSE;
  223. }
  224.  
  225. // //sym_rate
  226. // rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "SymbolRate",xml_array[i].sym_rate);
  227. // if (rc < 0)
  228. // {
  229. // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  230. // xmlFreeTextWriter(writer);
  231. // return FALSE;
  232. // }
  233. //
  234. // //fec
  235. // rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "Fec",xml_array[i].fec);
  236. // if (rc < 0)
  237. // {
  238. // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  239. // xmlFreeTextWriter(writer);
  240. // return FALSE;
  241. // }
  242.  
  243. //video_pid
  244. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "VideoPid",xml_array[program_index].video_pid);
  245. if (rc < 0)
  246. {
  247. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  248. xmlFreeTextWriter(writer);
  249. return FALSE;
  250. }
  251.  
  252. //audio_pid
  253. memset(str,0x00,GMS_MAX_BYTE_LENGTH_SERVICE_NAME);
  254. for (j = 0; j < xml_array[program_index].audio_pid_num; j++)
  255. {
  256. if (j > 0)
  257. {
  258. string_append(str,GMS_MAX_BYTE_LENGTH_SERVICE_NAME,",");
  259. itoa(xml_array[program_index].audio_pid[j],buff,10);
  260. string_append(str,buff);
  261. }
  262. else
  263. {
  264. itoa(xml_array[program_index].audio_pid[j],buff);
  265. }
  266. }
  267. rc = xmlTextWriterWriteElement(writer,BAD_CAST "AudioPid",BAD_CAST str);
  268. if (rc < 0)
  269. {
  270. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  271. xmlFreeTextWriter(writer);
  272. return FALSE;
  273. }
  274.  
  275. //ttx_pid
  276. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "TtxPid",xml_array[program_index].ttx_pid);
  277. if (rc < 0)
  278. {
  279. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  280. xmlFreeTextWriter(writer);
  281. return FALSE;
  282. }
  283.  
  284. //sub_pid
  285. memset(str,GMS_MAX_BYTE_LENGTH_SERVICE_NAME);
  286. for (j = 0; j < xml_array[program_index].sub_pid_num; j++)
  287. {
  288. if (j > 0)
  289. {
  290. string_append(str,");
  291. itoa(xml_array[program_index].sub_pid[j],buff);
  292. }
  293. else
  294. {
  295. itoa(xml_array[program_index].sub_pid[j],BAD_CAST "SubPid",__LINE__);
  296. xmlFreeTextWriter(writer);
  297. return FALSE;
  298. }
  299.  
  300. //pmt_pid
  301. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "PmtPid",xml_array[program_index].pmt_pid);
  302. if (rc < 0)
  303. {
  304. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  305. xmlFreeTextWriter(writer);
  306. return FALSE;
  307. }
  308.  
  309. //which tunner
  310. rc = xmlTextWriterWriteFormatElement(writer,BAD_CAST "IsTuner2",xml_array[program_index].is_channel_in_tunner_2);
  311. if (rc < 0)
  312. {
  313. printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n",__LINE__);
  314. xmlFreeTextWriter(writer);
  315. return FALSE;
  316. }
  317.  
  318. //end of parm
  319. rc = xmlTextWriterEndElement(writer);
  320. if (rc < 0)
  321. {
  322. printf("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
  323. xmlFreeTextWriter(writer);
  324. return FALSE;
  325. }
  326. }
  327.  
  328. rc = xmlTextWriterEndElement(writer);
  329. if (rc < 0)
  330. {
  331. printf("testXmlwriterFilename: Error at xmlTextWriterEndElement\n");
  332. xmlFreeTextWriter(writer);
  333. return FALSE;
  334. }
  335.  
  336. xmlFreeTextWriter(writer);
  337. strcpy(result_buffer,(const char *)xml_buf->content);
  338. xmlCleanupParser();
  339. xmlBufferFree(xml_buf);
  340. return TRUE;
  341. }

猜你在找的XML相关文章