- 論壇徽章:
- 0
|
我在寫一個通訊程序,報文這一塊我的想法是通過xml來進(jìn)行管理,這樣可以方便的進(jìn)行配置和修改。
這個想法的起因是我看到不少銀行中間業(yè)務(wù)平臺都能夠方便的進(jìn)行通訊報文的修改和配置。我的這個雖然是個小程序,
但我也想實現(xiàn)這樣的功能,為將來的軟件發(fā)展提供一個較好的體系結(jié)構(gòu)。
最開始我的想法是這樣的:
對每一個報文定義類似下面的一個xml結(jié)構(gòu)
<Msg>;
<ID>;1</ID>;
<Type>;1</Type>;
<Name>;簽到交易</Name>;
<AnsMsgGrpID>;2</AnsMsgGrpID>;
<Direct>;0</Direct>;
<Fields>;
<Field>;
<ID>;1</ID>;
<Type>;1</Type>;
<DataType>;1</DataType>;
<Name>;續(xù)包標(biāo)志</Name>;
<Len>;1</Len>;
</Field>;
<Field>;
<ID>;2</ID>;
<Type>;2</Type>;
<DataType>;1</DataType>;
<Name>;交易碼</Name>;
<Len>;4</Len>;
</Field>;
<Field>;
</Field>;
<Fields>;
</Msg>;
對應(yīng)的,我在程序中定義結(jié)束報文配置信息的數(shù)據(jù)結(jié)構(gòu)如下:
struct typFld
{
intiID;//字段序號
intiType;//字段類型
intiDataType;//字段數(shù)據(jù)類型 1-字符型;2-網(wǎng)絡(luò)字節(jié)序
char*sFldNm;//字段名稱
intiLen;//字段的長度
}
struct typFlds
{
intiCnt;//報文中字段的數(shù)目
struct typFld *FldPtr;//在程序中動態(tài)分配空間
}
struct typMsg
{
intiMsgID;//報文ID
int iType;//報文類型
char *sMsgNm;//報文名稱
int iAnsMsgID;//回應(yīng)報文的報文ID
int iDirect;//報文的方向,0--傳入;1--傳出
struct typFlds *FldsPtr;//指向存儲各字段的配置信息的存儲區(qū)域的指針
};
但是后來我發(fā)現(xiàn)報文中有一些特殊情況,采用上面的方式是不能處理的,如:
有一些報文段是需要循環(huán)的,具體循環(huán)的次數(shù)是在程序運行中才能知道的,比如說,用戶多個月的欠費明細(xì)就是這種情況。
還有,有一些報文段是可能有,可能沒有的,比如說:如果用戶有欠費,回應(yīng)報文中就會有用戶各月的欠費明細(xì),
如果用戶沒有欠費,回應(yīng)報文就只返回一個錯誤碼,而沒有任何的欠費明細(xì),這些情況可能會混合起來,我覺得就比較麻煩了,
我上網(wǎng)請教了一些朋友后,目前的思路是這樣的:
報文的xml結(jié)構(gòu)如下:
<Msg>;
<ID>;1</ID>;
<Type>;1</Type>;
<Name>;簽到交易</Name>;
<AnsMsgGrpID>;2</AnsMsgGrpID>;
<Direct>;0</Direct>;
<Fields>;
<Field>;
<ID>;1</ID>;
<Type>;1</Type>;
<DataType>;1</DataType>;
<Name>;續(xù)包標(biāo)志</Name>;
<Len>;1</Len>;
</Field>;
<Field>;
<ID>;2</ID>;
<Type>;2</Type>;
<DataType>;1</DataType>;
<Name>;交易碼</Name>;
<Len>;4</Len>;
</Field>;
<While>;
<If>;一個條件表達(dá)式<If>;
<Loop>;
<iLpCnt>;iQianFeiMonth</iLpCnt>;
<Field>;
<ID>;3</ID>;
<Type>;2</Type>;
<DataType>;1</DataType>;
<Name>;欠費明細(xì)</Name>;
<Len>;10</Len>;
</Field>;
</Loop>;
</While>;
<Field>;
</Field>;
<Fields>;
</Msg>;
因為Fields節(jié)點中現(xiàn)在有不同的節(jié)點了:Field,While,Loop,有些朋友的意見是在Field節(jié)點中使用鏈表的形式。
我考慮了一下,覺得鏈表的編程太繁瑣,還是希望使用數(shù)組的形式。編程簡單。
對應(yīng)的程序中的結(jié)構(gòu)修改如下:
struct typFld
{
intiType;//0-報文字段1-循環(huán)開始2-循環(huán)結(jié)束3-條件開始4-條件結(jié)束
char*sLpCnt;//循環(huán)次數(shù)表達(dá)式
char *sWhile;//條件表達(dá)式
intiID;//字段序號
intiFldType;//字段類型
intiDataType;//字段數(shù)據(jù)類型 1-字符型;2-網(wǎng)絡(luò)字節(jié)序
char*sFldNm;//字段名稱
intiLen;//字段的長度
}
這樣定義一個統(tǒng)一的大的結(jié)構(gòu)
當(dāng)在程序中使用的時候,比如說,根據(jù)定義的報文結(jié)構(gòu)讀取一個報文時,
如果讀到一個"Field"節(jié)點,就根據(jù)這個節(jié)點的屬性讀取相應(yīng)長度的字段;
如果讀到一個"While"節(jié)點,就轉(zhuǎn)化<if>;子節(jié)點中的條件表達(dá)式,如果表達(dá)式為真,就讀取while中的其他子節(jié)點,如果為假,就跳到<While>;節(jié)點的下一個兄弟節(jié)點;
如果讀到一個"Loop"節(jié)點,就根據(jù)<iLpCnt>;節(jié)點中的表達(dá)式的值重復(fù)讀取<Loop>;中的其他子節(jié)點。
我這樣的想法如何?有什么不對或者不妥的地方嗎?歡迎大家討論。
我使用的開發(fā)環(huán)境是sco unix +c +lib2xml
兄弟節(jié)點和子節(jié)點的查找,遍歷方法lib2xml提供了,所以我就不用在結(jié)構(gòu)中定義了
謝謝! |
|