欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Xml消息與c語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法及裝置的制作方法

文檔序號:6467761閱讀:663來源:國知局
專利名稱:Xml消息與c語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法及裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及可擴(kuò)展標(biāo)記語言(XML, extensible Markup Language)消息處理技術(shù), 特別是一種XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法及裝置。
背景技術(shù)
XML是軟件應(yīng)用與web服務(wù)之間數(shù)據(jù)交換的一種常用標(biāo)準(zhǔn),特別是在web編程中經(jīng) 常使用XML消息作為消息通信接口。而C語言程序是軟件應(yīng)用中常用的程序設(shè)計(jì)語言,自 然,在C語言程序?qū)崿F(xiàn)的應(yīng)用軟件中不能缺少XML消息的使用。 C語言程序與外部交互接口一般以字節(jié)流消息的形式對外交互,內(nèi)部通常使用結(jié) 構(gòu)體來表示外部信息。實(shí)際應(yīng)用中,C語言程序與web程序之間交換信息,通常有兩種方式, 字節(jié)流方式和XML消息方式 字節(jié)流方式C語言程序處理起來較為容易,要考慮的因素比如字節(jié)序、跨平臺時(shí) 對結(jié)構(gòu)體的填充等;但在恥b程序側(cè)則比較麻煩,通常還要封裝一層進(jìn)行轉(zhuǎn)換;而且字節(jié)流 方式下的消息的表現(xiàn)能力較差,要對字節(jié)進(jìn)行分析才能明白其含義; XML消息方式web程序比較擅長;由于XML消息實(shí)際上是字符串,這樣不存在字 節(jié)序問題和跨平臺問題,而且直接能從XML消息中看出各個(gè)字段的含義及取值,有利于對 消息通信接口的統(tǒng)一分析和測試。問題在于C語言程序?qū)τ赬ML消息的生成和解析比較麻 煩,而且XML消息的信息冗余相對較大。 現(xiàn)有技術(shù)中,通常由程序員來人工完成對于XML消息的生成和解析,當(dāng)XML消息復(fù) 雜時(shí),人工解析難免出現(xiàn)錯(cuò)誤,而且效率不高。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的 方法及裝置,自動(dòng)完成XML消息與C語言程序結(jié)構(gòu)體的轉(zhuǎn)換,提高效率。
為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的
待拷貝權(quán)利要求 本發(fā)明根據(jù)用戶需求預(yù)先設(shè)置XML消息與C語言程序結(jié)構(gòu)體格式之間的對應(yīng)關(guān) 系,通訊時(shí),自動(dòng)完成XML消息的解析,并使得XML消息能直接映射到相應(yīng)的C語言程序結(jié) 構(gòu)體內(nèi)存中,簡化轉(zhuǎn)換工作,從而使得C語言程序能更容易的使用XML消息與外部程序,特 別是web程序進(jìn)行交互。另一方面,根據(jù)C語言程序結(jié)構(gòu)體節(jié)點(diǎn)的信息,也能夠直接轉(zhuǎn)換為 對應(yīng)的XML消息。當(dāng)需要的XML消息格式改變時(shí),更新XML消息與C語言程序結(jié)構(gòu)體格式 之間的對應(yīng)關(guān)系即可滿足新的需求,適應(yīng)性強(qiáng)。


圖1為本發(fā)明XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法的流程圖;
圖2為本發(fā)明方法的一個(gè)實(shí)施例中的C語言程序結(jié)構(gòu)體格式示意 圖3為本發(fā)明XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的裝置結(jié)構(gòu)示意圖。
具體實(shí)施例方式
本發(fā)明通過預(yù)先設(shè)置XML消息與C語言程序結(jié)構(gòu)體格式的對應(yīng)關(guān)系,將XML消息 解析出的字段信息自動(dòng)轉(zhuǎn)換為C語言程序能夠識別的結(jié)構(gòu)體節(jié)點(diǎn)描述,或者將C語言程序 結(jié)構(gòu)體節(jié)點(diǎn)信息轉(zhuǎn)換為XML消息;這種轉(zhuǎn)換自動(dòng)完成,避免了人工轉(zhuǎn)換的各種錯(cuò)誤,同時(shí), 根據(jù)用戶需要可以增加XML消息與C語言程序結(jié)構(gòu)體格式的對應(yīng)關(guān)系。
下面通過具體的實(shí)施例及

本發(fā)明的技術(shù)方案。 本發(fā)明的方法流程如圖1所示,設(shè)置XML消息與C語言程序結(jié)構(gòu)體格式的對應(yīng)關(guān) 系,其中XML消息中的字段名稱、字段類型和各字段的值,映射為C語言程序結(jié)構(gòu)體的節(jié)點(diǎn) 名稱、節(jié)點(diǎn)類型、節(jié)點(diǎn)偏移量和各節(jié)點(diǎn)之間的層次關(guān)系。該方法包括兩部分XML消息轉(zhuǎn)換 為C語言程序結(jié)構(gòu)體,或C語言程序結(jié)構(gòu)體轉(zhuǎn)換為XML消息。 步驟101 、接收并從XML消息中解析出字段信息和所述XML消息對應(yīng)的C語言程序
結(jié)構(gòu)體格式; 例如XML消息 〈? xml version =〃 1.0〃 encoding = 〃 UTF-8" >
〈sp id=〃 structname" >




















4
〈p
〈/sp>
〈sp id 〈p
〈p
〈/sp>
〈sp id 〈p
〈p
〈/sp>
〈/即>
〈/sp> 其中的〈p>〈/p>表示一個(gè)字段及其值,〈sp>〈/sp>表示是一個(gè)結(jié)構(gòu)體,〈ap>〈/ap> 表示是一個(gè)數(shù)組。本發(fā)明只涉及到C語言程序與外界程序用XML消息交互的XML消息的解 析和生成。如果考慮到網(wǎng)絡(luò)程序的傳輸需要,比如TCP傳輸,在XML消息的前面還要加入一 些信息,如消息總長、消息類型等,以供C語言程序正確接收XML消息并處理。這些信息格 式及內(nèi)容不在本發(fā)明范圍。在XML消息的預(yù)留位中設(shè)置XML消息對應(yīng)的C語言程序結(jié)構(gòu)體 格式的編號,這樣,通過這個(gè)編號,確定相應(yīng)的C語言程序結(jié)構(gòu)體格式。
各字段信息包括字段名稱、字段類型和字段的值,上例中的XML消息不能直接 被C語言程序識別,需要首先解析該XML消息對應(yīng)的C語言程序結(jié)構(gòu)體,進(jìn)而分析XML消 息包含的字段信息,每個(gè)字段都有一個(gè)C語言程序結(jié)構(gòu)體節(jié)點(diǎn)與之對應(yīng),如圖2所示,與 該XML消息對應(yīng)的C語言程序結(jié)構(gòu)體名稱為c_java_firstmsg_info_t,包括5個(gè)第一層 節(jié)點(diǎn)第一個(gè)節(jié)點(diǎn)名稱Int32Element,類型為整型(int),偏移量根據(jù)Int32Element的大 小及C_jaVa_firStmSg_inf0_t結(jié)構(gòu)體內(nèi)存開始地址起始位置計(jì)算得到;第二個(gè)節(jié)點(diǎn)名稱 為Int32ElementArray,類型為數(shù)組(Array),偏移量根據(jù)計(jì)算所得,該節(jié)點(diǎn)包含兩個(gè)下一 層節(jié)點(diǎn),即c_java_firstmSg_inf0_t結(jié)構(gòu)體的第二層節(jié)點(diǎn)名稱分別為1和2,類型均為 int ;c_java_firstmsg_info_t結(jié)構(gòu)體的第一層第三個(gè)節(jié)點(diǎn)名稱為Int8ElementArray,類 型為字符串(string),字符串的最大長度為4(包括70'),偏移量根據(jù)計(jì)算所得;c_jaVa_ firstmsg_info_t結(jié)構(gòu)體的第一層第四個(gè)節(jié)點(diǎn)名稱為StructElement,類型為結(jié)構(gòu)體,包 括兩個(gè)第二層節(jié)點(diǎn)第一個(gè)節(jié)點(diǎn)名稱為Uint32Element,類型為int ;第二個(gè)節(jié)點(diǎn)名稱為 Uint8Element,類型為String,字符串最大長度為ll(包括'0/'),偏移量均通過計(jì)算得 到;c_java_firstmsg_info_t結(jié)構(gòu)體的第一層第五個(gè)節(jié)點(diǎn)名稱為SturctElementArray,類 型為數(shù)組,包括兩個(gè)第二層節(jié)點(diǎn)第一個(gè)節(jié)點(diǎn)名稱為l,類型為結(jié)構(gòu)體,該節(jié)點(diǎn)包含兩個(gè)第 三層節(jié)點(diǎn)第一個(gè)節(jié)點(diǎn)名稱為Int8Element,類型為數(shù)組,該數(shù)組包含兩個(gè)第四層節(jié)點(diǎn),名 稱分別為1和2,類型均為int ;第二層節(jié)點(diǎn)結(jié)構(gòu)體1的第二個(gè)節(jié)點(diǎn)名稱為Int32Element, 類型為字符串;SturctElementArray數(shù)組的第二個(gè)第二層節(jié)點(diǎn)名稱為2,類型為結(jié)構(gòu)體,該 節(jié)點(diǎn)包含兩個(gè)第三層節(jié)點(diǎn)第一個(gè)節(jié)點(diǎn)名稱為Int8Element,類型為數(shù)組,該數(shù)組包含兩個(gè) 第四層節(jié)點(diǎn),名稱分別為1和2,類型均為int ;第二層節(jié)點(diǎn)結(jié)構(gòu)體2的第二個(gè)節(jié)點(diǎn)名稱為 Int32Element,類型為字符串;各層節(jié)點(diǎn)的偏移量的計(jì)算與C語言程序中通常偏移量計(jì)算
id = Int32Elementvalue =
=〃 3〃 >
id=〃 Int8Element〃 value ="
id =〃 Int32Element〃 value =
=〃 4 〃 >
id=〃 Int8Element〃 value ="
id =〃 Int32Element〃 value =方式相似,此不再贅述。 步驟102、根據(jù)所述字段信息和C語言程序結(jié)構(gòu)體格式,建立相應(yīng)的C語言程序結(jié) 構(gòu)體。 與XML消息反應(yīng)的字段信息對應(yīng)的C語言程序結(jié)構(gòu)體名稱為c_java_firstmSg_ info—t,具體為 typedef struct_tmp_struct_l_t { int Uint32Element ; char Uint8Element[11]; }tmp_struct_l_t ; typedef struct_tmp_struct_2_t { int Int8Element[2]; char Int32Element [5]; } tmp_struct_2_t ; typedef struct_c_java_firstmsg_info_t { int Int32Element ; int Int32ElementArray[2]; char Int8ElementArray [4]; tmp_struct_l_tStructElement ; tmp_struct_2_tSturctElementArray[2]; }c_java_firstmsg_info_t ; 該結(jié)構(gòu)體中體現(xiàn)的層次關(guān)系為 typedef struct_xmlagt_st:ruct_info_t xmlagt_struct_info_t ; struct_xmlagt_struct_info_t
{ char_key[128] ;/*節(jié)點(diǎn)的名稱.*/ int_offset ;/*節(jié)點(diǎn)的起始地址,相對于結(jié)構(gòu)體的開始地址.*/ int_type ;/*節(jié)點(diǎn)的類型*/ int_strLen ;/*只當(dāng)節(jié)點(diǎn)是string(即char[])時(shí)有效,代表了字符串
長度, 包括了' \0' */ xmlagt_struct_info_t*_memberInfo ;/*此節(jié)點(diǎn)的下一級節(jié)點(diǎn)的信息
承/ int_memberNum ;/*此節(jié)點(diǎn)的下一級節(jié)點(diǎn)的數(shù)目*/ }; /*目前能處理四種數(shù)據(jù)類型int, char[] , array, struct. */ e皿m
info_t))
XMLAGT_TYPE_INT = 0, XMLAGT_TYPE_STRING = 1, XMLAGT_TYPE_ARRAY = 2, XMLAGT_TYPE_STRUCT = 3
static void clientRegFirstRequestMsg()
—firstmsg_info_t tmpMsg ;xmlagt_—struct_info—_t*tmpP ==NULL ;
xmlagt_—struct_info—_t*tmpPl=NULL
xmlagt_—struct_info—_t*tmpP2=NULL
xmlagt_—struct_info—_t*tmpP3=NULL
xmlagt_—struct_info—_t*tmpP4=NULL
這個(gè)結(jié)構(gòu)體有5個(gè)節(jié)點(diǎn).*/
tmpP = (xmlagt—struct—info—t氺)malloc(sizeof(xmlagt_struct_
:f(tmpP
NULL)
printf(〃 malloc tmpP fail ! \n〃 ); exit(l); memset (tmpP, 0x00, sizeof (xmlagt_struct_info_t)); tmpP->_type = XMLAGT_TYPE_STRUCT ; tmpP_>_offset = 0 ; tmpP_>_membe:rNum = 5 ; tmpP_>_memberInfo = (xmlagt—struct—info—t氺)malloc(5氺 sizeof(xmlagt_struct_info_t)); if (tmpP_>_memberInf o ==亂U { printf(" malloc fail ! \n〃 ); exit(l); } memset(tmpP_>_memberInfo, 0x00, 5氺sizeof(xmlagt_struct_info_t)); 根據(jù)所述字段信息和所述XML消息對應(yīng)的C語言程序結(jié)構(gòu)體格式,建立當(dāng)前字段
對應(yīng)的C語言程序結(jié)構(gòu)體節(jié)點(diǎn); /*第一個(gè)節(jié)點(diǎn),名稱為Int32Element,類型為int,偏移量為計(jì)算所得*/ tmpPl = tmpP_>_memberInfo ; strcpy(tmpP1—>_key, 〃 Int32Element〃 );
7
tmpPl->_type = XMLAGT_TYPE_INT ; tmpPl_>_offset = (char*)&(tmpMsg. Int32Element)_(char*)&tmpMsg ;
分析當(dāng)前字段是否包含下一層字段,如果是,建立當(dāng)前字段的下一層字段對應(yīng)的C 語言程序結(jié)構(gòu)體節(jié)點(diǎn);直至完成當(dāng)前字段的第N層字段的C語言程序結(jié)構(gòu)體節(jié)點(diǎn)建立;
第一個(gè)字段不含下一層字段,所以繼續(xù)建立C_java_firStmSg_inf0_t的第二個(gè) 節(jié)點(diǎn); /*第二個(gè)節(jié)點(diǎn),名稱為Int32ElementArray,類型為數(shù)組,偏移量為計(jì)算所得,這 個(gè)數(shù)組中又有兩個(gè)int元素*/ tmpPl = tmpP->_memberInfo+l ; strcpy(tmpPl_>_key, 〃 Int32ElementArray〃 ); tmpPl->_type = XMLAGT—TYPE—ARRAY ; tmpPl_>_offset = (char氺)(tmpMsg. Int32ElementArray)_(char *)&tmpMsg; tmpPl_>_memberNum = 2 ; tmpPl_>_memberInfo = (xmlagt—struct—info—t氺)malloc(2氺 sizeof(xmlagt_struct_info_t)); if (tmpPl_>_memberInfo == NULL) { printf(" malloc fail ! \n〃 ); exit(l); } memset(tmpPl_>_memberInfo, 0x00, 2氺sizeof(xmlagt_struct_info_ t)); tmpP2 = tmpPl-〉—memberlnfo ; strcpy(tmpP2->_key, 〃 1〃 ); tmpP2->_type = XMLAGT_TYPE_INT ; tmpP2_>_offset = (char*) (&(tmpMsg. Int32ElementArray
))_(char *)&tmpMsg; tmpP2 = tmpPl->_memberInfo+l ; strcpy(tmpP2->_key, 〃 2〃 ); tmpP2->_type = XMLAGT_TYPE_INT ; tmpP2_>_offset = (char*)(&(tmpMsg. Int32ElementArray[1]))_(char *)&tmpMsg; 第三個(gè)節(jié)點(diǎn)至第五個(gè)節(jié)點(diǎn)建立過程與前兩個(gè)節(jié)點(diǎn)類似,具體如下 /*第三個(gè)節(jié)點(diǎn),名稱為Int8ElementArray,類型為string,這個(gè)string最大長度
為4(包括'\0'),其偏移量為計(jì)算所得*/ tmpPl = tmpP_>_memberInfo+2 ; strcpy(tmpPl_>_key, 〃 Int8ElementArray〃 ); tmpPl->_type = XMLAGT_TYPE_STRING ;0162] tmpPl_>_offset = (char氺)(tmpMsg. Int8ElementArray)_(char
0163] *)&tmpMsg;
0164] tmpPB—strLen = 4 ;
0165] /*第四個(gè)節(jié)點(diǎn),名稱為StructElement,類型為結(jié)構(gòu)體,偏移量為計(jì)算所得。這個(gè) 結(jié)構(gòu)體中又有兩個(gè)節(jié)點(diǎn),分別為int和string類型*/ 0166] tmpPl = tmpP_>_memberInfo+3 ; 0167] strcpy(tmpPl_>_key, 〃 St潔tElement〃 ); 0168] tmpPl->_type = XMLAGT_TYPE_STRUCT ;
tmpPl_>_offset = (char承)(&(tmpMsg. StructElement))_(char 氺)&tmpMsg ;
tmpPl_>_memberNum = 2 ;
tmpPl->_memberInfo = (xmlagt_struct_info_t*)malloc(2* sizeof(xmlagt_struct_info_t));
if (tmpPl_>_memberInfo == NULL)
0169] 0170] 0171] 0172] 0173] 0174] 0175] 0176] 0177] 0178] 0179] t)); 0180] 0181] 0182] 0183]
printf(" malloc fail ! \n〃 ); exit(l);
memset(tmpPl_>_memberInfo, 0x00, 2氺sizeof(xmlagt_struct_info_
tmpP2 = tmpPl_>_memberInfo ; strcpy(tmpP2_>_key, 〃 Uint32Element〃 ); tmpP2->_type = XMLAGT_TYPE_INT ;
tmpP2_>_offset = (char*) (&(tmpMsg. StructElement. Uint32Element))-0184] (char*)&tmpMsg ;
0185] tmpP2 = tmpPl->_memberInfo+l ;
0186] strcpy(tmpP2_>_key, 〃 Uint8Element〃 );
0187] tmpP2->_type = XMLAGT_TYPE_STRING ;
0188] tmpP2_>_offset = (char*) (tmpMsg. StructElement.
Uint8Element)_(char 0189] *)&tmpMsg; 0190] tmpP2_>_strLen = 11 ;
0191] /*第五個(gè)節(jié)點(diǎn),名稱為SturctElementArray,類型為數(shù)組,其偏移量為計(jì)算所得c 這個(gè)數(shù)組中又有兩個(gè)結(jié)構(gòu)體節(jié)點(diǎn)*/ 0192] tmpPl = tmpP_>_memberInfo+4 ;
0193] strcpy(tmpPl_>_key, 〃 SturctElementArray");
0194] tmpPl->_type = XMLAGT—TYPE—ARRAY ;
0195] tmpPl_>_offset = (char氺)(tmpMsg. SturctElementArray)_(char
*)&tmpMsg; tmpPl-〉—memberN咖=2 ; tmpPl_>_memberInfo = (xmlagt—struct—info—t氺)malloc(2氺 sizeof(xmlagt_struct_info_t)); if (tmpPl_>_memberInfo = = NULL) { printf(" mal loc fail ! \n〃 ); exit(l); } memset(tmpPl_>_memberInfo, 0x00, 2氺sizeof(xmlagt_struct_info— t)); tmpP2 = tmpPl-〉—memberlnfo ; strcpy(tmpP2->_key, 〃 1〃 ); tmpP2->_type = XMLAGT_TYPE_STRUCT ; tmpP2_>_offset = (char*)(&(tmpMsg. SturctElementArray
))_(char *)&tmpMsg; tmpP2_>_memberNum = 2 ; tmpP2_>_memberInfo = (xmlagt—struct—info—t氺)malloc(2* sizeof (xmlagt_struct_info_t)); if (tmpP2_>_memberInfo = = NULL) { printf(" mal loc fail ! \n〃 ); exit(l); } memset(tmpP2_>_memberInfo, 0x00, 2氺sizeof(xmlagt_struct_info— t)); tmpP3 = tmpP2_>_memberInfo ; strcpy(tmpP3->_key, 〃 Int8Element〃 ); tmpP3->_type = XMLAGT_TYPE_ARRAY ; tmpP3_>_offset = (char氺)(tmpMsg. SturctElementArray
.
Int8Element)_ (char *) &tmpMsg ; tmpP3_>_memberNum = 2 ; tmpP3_>_memberInfo = (xmlagt—struct—info—t氺)malloc(2* sizeof (xmlagt_struct_info_t)); if (tmpP3_>_memberInfo = = NULL) { printf(" mal loc fail ! \n〃 );:(〃u
} [6則 (Tl服==ojui j叫腦—〈-^加"[8則
:((3"oju廠:pru4s飛gBirax) j09Z]:s [z^20]
氺2) 301iT3ui(氺i—oju]:—lc)ru:is—igT3irax) = ojuiJ:9qra9ra—〈—2ddrai [9s20]
:2 =闊j叫腦—〈-2dd叫 [swo]
:Ss,m (* O,]
Sswduu)^(*JBHci) = :^3sjjo — 〈 — zdduu [s則
:丄3朋丄S—3d人丄—丄3VlWX = 3dAf 〈—2dd叫 [^20]
:(〃Z 〃 '一—〈-2d加"XctoJis [隨]
:T+ojuiJ叫腦—〈-Tdd叫=2d加l ,0]
:g = iraiJ^s—〈—gdd叫 [6剛
:Ss,m — ,0]
:3NIMS—3d人丄—丄3VlWX = 3dAf 〈—gd加i [91720]
:(j腦e孤giui 〃 '一—〈—ed加"Xdca^s [s剛
:T+ojuiJ叫腦—〈-2dd叫=Sd加l ,0]
gs,^ ci)_(([i],ra i .
XBj早腦3ig:p與s .3s,"影(* ,0]
= ^sjJo—〈—wd叫 [Z剛
:丄N廠3d入丄—丄3VlWX = 3cMf 〈—w加^ [lwo]
:(/,Z 〃 '一—〈-,d加"Xdca^s ,0]
:T+ojuiJ叫腦—〈-Sdd叫=,dd叫 [6,
:Ss,m (
_ ((
}腦 1 [o] XBj早腦3ig:p與s .ojuiSsra .Ss,"影(* [8,
:丄N廠3d入丄—丄3VlWX = 3(Mf 〈—w加^ [9s20]
:(/,1 /, '一—〈-,d加"Xdca^s [se20]
:ojuiJ叫腦—〈-gdd叫=,dd叫 [
:((fo與
{
M n/6
樂的說
memset(tmpP2_>_memberInfo, 0x00, 2氺sizeof(xmlagt_struct_info— t)); tmpP3 = tmpP2_>_memberInfo ; strcpy(tmpP3->_key, 〃 Int8Element〃 ); tmpP3->_type = XMLAGT_TYPE_ARRAY ; tmpP3_>_offset = (char氺)(tmpMsg. SturctElementArray[1].
Int8Element)_ (char*) &tmpMsg ; tmpP3_>_memberNum = 2 ; tmpP3_>_memberInfo = (xmlagt—struct—info—t氺)malloc(2* sizeof(xmlagt_struct_info_t)); if (tmpP3->_memberInfo = = NULL) { printf(" malloc fail ! \n〃 ); exit(l); } memset(tmpP3_>_memberInfo, 0x00, 2氺sizeof(xmlagt_struct_info— t)); tmpP4 = tmpP3_>_memberInfo ; strcpy(tmpP4_>_key, 〃 1〃 ); tmpP4->_type = XMLAGT_TYPE_INT ; tmpP4_>_off set = (char *)&(tmpMsg. SturctElementArray[1]. Int8Element
)_(char*)&tmpMsg ; tmpP4 = tmpP3->_memberInfo+l ; strcpy(tmpP4_>_key, 〃 2〃 ); tmpP4->_type = XMLAGT_TYPE_INT ; tmpP4_>_offset = (char *)&(tmpMsg. SturctElementArray[1]. Int8Element[1])_(char*)&tmpMsg ; tmpP3 = tmpP2_>_memberInfo+l ; strcpy(tmpP3->_key, 〃 Int32Element〃 ); tmpP3->_type = XMLAGT_TYPE_STRING ; tmpP3_>_offset = (char*)tmpMsg. SturctElementArray[1].
Int32Element_ (char*) &tmpMsg ; tmpP3_>_strLen = 5 ; /*記下這個(gè)結(jié)構(gòu)體的層次樹,以結(jié)構(gòu)體類型定義名稱" c_java_f irstmsg_info_t"為關(guān)鍵字*/ xmlagtRegStructlnfoToXml(〃 c_java_firstmsg_info_t〃 ,
sizeof (c_java_f irstmsg_info_t) , tmpP);
return ; } 可以看到,在建立這個(gè)層次關(guān)系時(shí),對每個(gè)字段都有其名稱(與XML消息中相同)、 數(shù)據(jù)類型(如XMLAGT_TYPE_INT,XMLAGT_TYPE_STRING,XMLAGT_TYPE_ARRAY,XMLAGT_TYPE_ STRUCT)和相對于結(jié)構(gòu)體內(nèi)存開始地址的偏移,如果是數(shù)組類型或者結(jié)構(gòu)體類型還要分配 下一層的節(jié)點(diǎn);如果是字符串類型則要記下其最大長度以防溢出。然后,通過結(jié)構(gòu)體的名稱 C_java_firStmSg_inf0_t,與各節(jié)點(diǎn)的層次關(guān)系建立起圖2所示的C語言程序能夠直接識 別的結(jié)構(gòu)體。 j吏用時(shí),i周用類4以ParseCall (char氺pBuf, int bufLen, void氺pStruct, intst潔tLen, const char*pStructTypeName)這樣的接口 ,其中pBuf是XML消息;bufLen 是XML消息的長度;pStruct,返回的對應(yīng)此條XML消息的結(jié)構(gòu)體的指針,對應(yīng)到示例就是指 向一個(gè)c_java_firstmsg_info_t結(jié)構(gòu)體;structLen,對應(yīng)此條XML消息的結(jié)構(gòu)體的size, 對應(yīng)至Ll示例就是sizeof (c_java_f irstmsg_info_t) ;pSt潔tTypeName,對應(yīng)此條XML消息 的結(jié)構(gòu)體的類型名稱,對應(yīng)到示例就是"c_java_firstmsg_info_t〃 。
在這個(gè)ParseCall()接口中就可以封裝某個(gè)C/C++xml庫(比如libxml2)的 函數(shù),一級一級的解開,同時(shí)將各個(gè)字段的名字(如〈P id = 〃 Int32Element〃 value =〃 1〃 /〉,這個(gè)字段的名字是"Int32Element",其值為1)與結(jié)構(gòu)體的層次樹中字段的名 稱對應(yīng)起來,如果這個(gè)字段的類型不是數(shù)組類型或者結(jié)構(gòu)體類型,將字段的值寫入這個(gè)字 段的偏移量;如果這個(gè)字段的類型是數(shù)組或者結(jié)構(gòu)體,那么還要繼續(xù)向下解出下一層字段 的值。 以上是解析XML消息的處理過程,當(dāng)需要從C語言程序結(jié)構(gòu)體轉(zhuǎn)換為XML消息時(shí), 采用步驟103 :根據(jù)C語言程序結(jié)構(gòu)體和所述對應(yīng)關(guān)系,建立與該C語言程序結(jié)構(gòu)體對應(yīng)的 XML消息。 生成XML消息的過程相對簡單,將XML消息的各字段視為字符串,根據(jù)C語言程序 結(jié)構(gòu)體和該結(jié)構(gòu)體與XML消息的對應(yīng)關(guān)系,即取得C語言程序結(jié)構(gòu)體的節(jié)點(diǎn)層次關(guān)系樹、每 個(gè)節(jié)點(diǎn)的數(shù)據(jù)類型、每個(gè)節(jié)點(diǎn)在內(nèi)存中的位置,將結(jié)構(gòu)體內(nèi)存中的數(shù)據(jù)寫入XML消息各字 段,從而建立相應(yīng)的XML消息。 本發(fā)明還提供了相應(yīng)的XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的裝置,如圖3所示,該 裝置包括存儲模塊和執(zhí)行模塊,其中, 存儲模塊用于存儲設(shè)置的XML消息與C語言程序結(jié)構(gòu)體的對應(yīng)關(guān)系; 執(zhí)行模塊用于將XML消息轉(zhuǎn)換為相應(yīng)的C語言程序結(jié)構(gòu)體,或者,將C語言程序結(jié)
構(gòu)體轉(zhuǎn)換為對應(yīng)的XML消息。 所述執(zhí)行模塊包括解析模塊、轉(zhuǎn)換模塊和封裝模塊,其中,
解析模塊用于接收并從XML消息中解析出字段信息; 轉(zhuǎn)換模塊用于根據(jù)解析的XML消息的字段信息和所述對應(yīng)關(guān)系,建立相應(yīng)的C語 言程序結(jié)構(gòu)體; 封裝模塊用于根據(jù)C語言程序結(jié)構(gòu)體和所述對應(yīng)關(guān)系,建立相應(yīng)的XML消息。
以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
一種XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法,其特征在于,設(shè)置XML消息與C語言程序結(jié)構(gòu)體格式的對應(yīng)關(guān)系,該方法包括A1、接收并從XML消息中解析出字段信息和所述XML消息對應(yīng)的C語言程序結(jié)構(gòu)體格式;根據(jù)所述字段信息和C語言程序結(jié)構(gòu)體格式,建立相應(yīng)的C語言程序結(jié)構(gòu)體;或者,A2、根據(jù)C語言程序結(jié)構(gòu)體和所述對應(yīng)關(guān)系,建立與該C語言程序結(jié)構(gòu)體對應(yīng)的XML消息。
2. 根據(jù)權(quán)利要求1所述的XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法,其特征在于,根據(jù) 所述字段信息和C語言程序結(jié)構(gòu)體格式,建立相應(yīng)的C語言程序結(jié)構(gòu)體具體包括All、根據(jù)所述字段信息和所述XML消息對應(yīng)的C語言程序結(jié)構(gòu)體格式,建立當(dāng)前字段 對應(yīng)的C語言程序結(jié)構(gòu)體節(jié)點(diǎn);A12、分析當(dāng)前字段是否包含下一層字段,如果是,建立當(dāng)前字段的下一層字段對應(yīng)的C 語言程序結(jié)構(gòu)體節(jié)點(diǎn);直至完成當(dāng)前字段的第N層字段的C語言程序結(jié)構(gòu)體節(jié)點(diǎn)建立;A13、建立XML消息下一個(gè)字段對應(yīng)的C語言程序結(jié)構(gòu)體節(jié)點(diǎn),直至完成XML消息所有 字段對應(yīng)的C語言程序結(jié)構(gòu)體節(jié)點(diǎn)建立。
3. 根據(jù)權(quán)利要求1所述的XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法,其特征在于,所述 XML消息與C語言程序結(jié)構(gòu)體格式一一對應(yīng)。
4. 根據(jù)權(quán)利要求1所述的XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法,其特征在于,所述 XML消息的字段類型或C語言程序結(jié)構(gòu)體的節(jié)點(diǎn)類型包括整型、字符型、數(shù)組型或結(jié)構(gòu)體。
5. —種XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的裝置,其特征在于,該裝置包括存儲模塊和 執(zhí)行模塊,其中,存儲模塊用于存儲設(shè)置的XML消息與C語言程序結(jié)構(gòu)體的對應(yīng)關(guān)系; 執(zhí)行模塊用于將XML消息轉(zhuǎn)換為相應(yīng)的C語言程序結(jié)構(gòu)體,或者,將C語言程序結(jié)構(gòu)體 轉(zhuǎn)換為對應(yīng)的XML消息。
6. 根據(jù)權(quán)利要求5所述的XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的裝置,其特征在于,所述 執(zhí)行模塊包括解析模塊、轉(zhuǎn)換模塊和封裝模塊,其中,解析模塊用于接收并從XML消息中解析出字段信息;轉(zhuǎn)換模塊用于根據(jù)解析的XML消息的字段信息和所述對應(yīng)關(guān)系,建立相應(yīng)的C語言程 序結(jié)構(gòu)體;封裝模塊用于根據(jù)C語言程序結(jié)構(gòu)體和所述對應(yīng)關(guān)系,建立相應(yīng)的XML消息。
全文摘要
本發(fā)明公開了一種XML消息與C語言程序結(jié)構(gòu)體轉(zhuǎn)換的方法,設(shè)置XML消息與C語言程序結(jié)構(gòu)體格式的對應(yīng)關(guān)系,該方法包括接收并從XML消息中解析出字段信息和所述XML消息對應(yīng)的C語言程序結(jié)構(gòu)體格式;根據(jù)所述字段信息和C語言程序結(jié)構(gòu)體格式,建立相應(yīng)的C語言程序結(jié)構(gòu)體;或者,根據(jù)C語言程序結(jié)構(gòu)體和所述對應(yīng)關(guān)系,建立與該C語言程序結(jié)構(gòu)體對應(yīng)的XML消息。本發(fā)明還公開了相應(yīng)裝置,包括存儲模塊和執(zhí)行模塊。本發(fā)明能夠自動(dòng)完成XML消息與C語言程序結(jié)構(gòu)體的轉(zhuǎn)換,減少錯(cuò)誤,提高效率。
文檔編號G06F9/44GK101739245SQ20081017368
公開日2010年6月16日 申請日期2008年11月7日 優(yōu)先權(quán)日2008年11月7日
發(fā)明者楊軍, 王華馳, 閆京生, 黃治華 申請人:武漢虹信通信技術(shù)有限責(zé)任公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1
颍上县| 汽车| 南华县| 兴山县| 昆明市| 洞口县| 庆云县| 西青区| 宁阳县| 定西市| 抚顺市| 汾阳市| 江华| 泾川县| 汕尾市| 临沭县| 岳阳市| 淮滨县| 安塞县| 焉耆| 临沭县| 彭州市| 明水县| 库伦旗| 宝兴县| 汉沽区| 渝北区| 宕昌县| 济南市| 灌云县| 达孜县| 延寿县| 宁陕县| 永吉县| 阳高县| 永清县| 永清县| 萨嘎县| 龙里县| 荣成市| 三穗县|