c語言環境下的xml數據的序列化的過程以機頂盒向手機APK發送數據爲例

機頂盒向手機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文件的創建

以創建頻道節目列表爲例:

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;
}



                                

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