c语言环境下的xml数据的序列化的过程以机顶盒向手机APK发送数据为例
2015-08-19 17:12
417 查看
机顶盒向手机apk端发送xml格式的数据流程如下所示:
1.调用函数 (1) send_xml_data_to _mobile() ;
2.在函数(1)中调用函数(2)send_common_data_to_mobile();
3.在函数(2)中调用函数(3)create_xml_buff(),并向函数传递了三个重要的参数,分别是压缩前的xml数据缓存xml_send_buff_before_compress,和一个结构体xml_root,以及xml_type;
4.在函数(3)中分情况讨论,调用不同的方法创建携带不同信息的xml文件;
在该项目中携带不同数据信息的xml文件的生成主要通过使用libxml2所携带的库函数完成xml文件的创建
以创建频道节目列表为例:
1.调用函数 (1) send_xml_data_to _mobile() ;
2.在函数(1)中调用函数(2)send_common_data_to_mobile();
3.在函数(2)中调用函数(3)create_xml_buff(),并向函数传递了三个重要的参数,分别是压缩前的xml数据缓存xml_send_buff_before_compress,和一个结构体xml_root,以及xml_type;
4.在函数(3)中分情况讨论,调用不同的方法创建携带不同信息的xml文件;
在该项目中携带不同数据信息的xml文件的生成主要通过使用libxml2所携带的库函数完成xml文件的创建
以创建频道节目列表为例:
static BOOL create_channel_list_xml(char *result_buffer, void * buf) { xmlTextWriterPtr writer; int rc; int program_index = 0, j; char str[GMS_MAX_BYTE_LENGTH_SERVICE_NAME]; char buff[GMS_MAX_BYTE_LENGTH_SERVICE_NAME]; GS_CHANNEL_LIST* channel_list = buf; int prog_num; GMS_PROGRAM_INFO * xml_array; xmlBufferPtr xml_buf = NULL; if (result_buffer == NULL) { return FALSE; } prog_num = channel_list->request_program_num; xml_array = channel_list->program_list; xml_buf = xmlBufferCreateSize(PROGRAM_SMALL_XML_BUFF_LENGTH); if (xml_buf == NULL) { return FALSE; } LIBXML_TEST_VERSION writer = xmlNewTextWriterMemory(xml_buf, 0); if (writer == NULL) { printf("testXmlwriterFilename: Error creating the xml writer\n"); return FALSE; } rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); xmlFreeTextWriter(writer); return FALSE; } //Command rc = xmlTextWriterStartElement(writer, BAD_CAST "Command"); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); xmlFreeTextWriter(writer); return FALSE; } for (program_index = 0; program_index < prog_num; program_index++) { //parm rc = xmlTextWriterStartElement(writer, BAD_CAST "parm"); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterStartElement\n"); xmlFreeTextWriter(writer); return FALSE; } //ProgramId rc = xmlTextWriterWriteElement(writer, BAD_CAST "ProgramId", BAD_CAST xml_array[program_index].prog_sat_tp_id); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteFormatElement\n"); xmlFreeTextWriter(writer); return FALSE; } //ProgramName convert_windows_to_utf8(xml_array[program_index].prog_name, xml_array[program_index].prog_name, sizeof(xml_array[program_index].prog_name), -1); rc = xmlTextWriterWriteElement(writer, BAD_CAST "ProgramName", BAD_CAST xml_array[program_index].prog_name); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //ProgamIndex rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ProgramIndex", "%d", xml_array[program_index].prog_index); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //SatName // rc = xmlTextWriterWriteElement(writer, BAD_CAST "SatName", BAD_CAST xml_array[i].sat_name); // if (rc < 0) // { // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); // xmlFreeTextWriter(writer); // return FALSE; // } //ProgramType rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ProgramType", "%d", xml_array[program_index].is_scramble); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //Is HD channel rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IsProgramHD", "%d", xml_array[program_index].is_hd); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //FavMark rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "FavMark", "%d", xml_array[program_index].fav_mark); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //LockMark rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "LockMark", "%d", xml_array[program_index].lock_mark); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //haveEPG rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HaveEPG", "%d", xml_array[program_index].have_epg); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //is_playing rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IsPlaying", "%d", xml_array[program_index].is_playing); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //will_be_played rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "WillBePlayed", "%d", xml_array[program_index].will_be_played); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //CurChannelType rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ChannelType", "%d", xml_array[program_index].channel_type); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } // //freq // rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Frequency", "%d", xml_array[i].freq); // if (rc < 0) // { // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); // xmlFreeTextWriter(writer); // return FALSE; // } // // //pol // rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Polar", "%d", xml_array[i].pol); // if (rc < 0) // { // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); // xmlFreeTextWriter(writer); // return FALSE; // } //modulation_sys rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ModulationSystem", "%d", xml_array[program_index].modulation_sys); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //modulation_type rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ModulationType", "%d", xml_array[program_index].modulation_type); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //roll_off rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "RollOff", "%d", xml_array[program_index].roll_off); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //pilot_tones rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PilotTones", "%d", xml_array[program_index].pilot_tones); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } // //sym_rate // rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SymbolRate", "%d", xml_array[i].sym_rate); // if (rc < 0) // { // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); // xmlFreeTextWriter(writer); // return FALSE; // } // // //fec // rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Fec", "%d", xml_array[i].fec); // if (rc < 0) // { // printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); // xmlFreeTextWriter(writer); // return FALSE; // } //video_pid rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "VideoPid", "%d", xml_array[program_index].video_pid); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //audio_pid memset(str, 0x00, GMS_MAX_BYTE_LENGTH_SERVICE_NAME); for (j = 0; j < xml_array[program_index].audio_pid_num; j++) { if (j > 0) { string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, ","); itoa(xml_array[program_index].audio_pid[j], buff, 10); string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff); } else { itoa(xml_array[program_index].audio_pid[j], buff, 10); string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff); } } rc = xmlTextWriterWriteElement(writer, BAD_CAST "AudioPid", BAD_CAST str); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //ttx_pid rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "TtxPid", "%d", xml_array[program_index].ttx_pid); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //sub_pid memset(str, 0x00, GMS_MAX_BYTE_LENGTH_SERVICE_NAME); for (j = 0; j < xml_array[program_index].sub_pid_num; j++) { if (j > 0) { string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, ","); itoa(xml_array[program_index].sub_pid[j], buff, 10); string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff); } else { itoa(xml_array[program_index].sub_pid[j], buff, 10); string_append(str, GMS_MAX_BYTE_LENGTH_SERVICE_NAME, buff); } } rc = xmlTextWriterWriteElement(writer, BAD_CAST "SubPid", BAD_CAST str); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //pmt_pid rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PmtPid", "%d", xml_array[program_index].pmt_pid); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //which tunner rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IsTuner2", "%d", xml_array[program_index].is_channel_in_tunner_2); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterWriteElement LINE:%d\n", __LINE__); xmlFreeTextWriter(writer); return FALSE; } //end of parm rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); xmlFreeTextWriter(writer); return FALSE; } } rc = xmlTextWriterEndElement(writer); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterEndElement\n"); xmlFreeTextWriter(writer); return FALSE; } xmlFreeTextWriter(writer); strcpy(result_buffer,(const char *)xml_buf->content); xmlCleanupParser(); xmlBufferFree(xml_buf); return TRUE; }
相关文章推荐
- 由C语言位域(冒号)谈C语言的结构体、枚举、共用体
- C++堆栈问题
- c++primer之函数(函数基础和参数传递)
- 值得推荐的C/C++框架和库
- VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)
- C++指针探秘
- C语言
- 使用c++代替使用的c包!
- C语言格式化输出(整理1)
- Implement strStr() (C,C++,Java,Python)
- 黑马程序员———C语言———【strlen()和sizeof()的区别、排序、算法】
- VC++ MFC中如何将应用程序的配置信息保存到注册表中(一)
- Java与C++实现相同的MD5加密算法
- c++编译器对多态的实现原理总结
- C++之常量与指针
- (C++ 11) 关联容器
- c++中static总结
- c++ primer plus 第九章《编程题9.6.2》
- c++ primer plus 第八章《编程题8.8.7》
- 腾讯电面——C/C++基础之关键字