📄 masxmlpaz.sqc
字号:
/****************************************************************************** * 文 件 名: masxmlpaz.sqc * 摘 要: 反洗钱xml报文解析 ******************************************************************************/#define EXTERN extern#define CHKDBERR(sChkStr) if (check_error (sChkStr) != 0) return -1;#define PAZNODERR(sPazErr) printf("Parse %s Node Error !!!\n", sPazErr); ErrFlg = 1; return -1;#define RPTCURNEXT RptCur = RptCur->next;RptCur = RptCur->next;#define RPTCURNEXT1 RptCur1 = RptCur1->next;RptCur1 = RptCur1->next;#define RPTCURNEXT2 RptCur2 = RptCur2->next;RptCur2 = RptCur2->next;#include "btpcomm.h"#include "btpcmmcr.h"#include "cmmafld.h"#include "cmmartn.h"#include <libxml/xmlmemory.h>#include <libxml/parser.h>EXEC SQL INCLUDE SQLCA;EXEC SQL BEGIN DECLARE SECTION;/* control variables */ char sMasDBNam[16+1]; /*数据库名称 */ char sRiCd[15+1]; /* 报送机构编码 15 I */ char sTxnDt[10+1]; /* 报送日期 I */ long iSeqNo; /* 报送批次 I */ char sSfId[4+1]; /* 发送正确或错误标识 04 */ long iFsNm; /* 成功发送的文件数 */ long iErTn; /* 错误总数 */ long iNmEr; /* 文件名称错误编号 I */ char sEfNm[41+1]; /* 错误文件名称 41 */ long iEfTn; /* 错误文件总数 */ long iFlEr; /* 错误文件编号 */ long iFcEr; /* 文件内容错误编号 I */ char sErLc[64+1]; /* 文件内容错误定位 64 */ char sErRs[2+1]; /* 文件内容错误原因 02 */ char sFlgArr[20+1]; /* 控制栏位 20 */ char sRem1[64+1]; /* 备注1 64 */ char sRem2[128+1]; /* 备注2 128 */EXEC SQL END DECLARE SECTION;/* globle variables */ char sMasCod[15+1]; /* 金融机构代码 */ char sMasDat[10+1]; /* 报送日期 */ char sMasBat[10+1]; /* 报送批次 */ int iMasBat; /* 报送批次 */ char sBuff[30+1]; int ErrFlg;char * ConvertEnc(char *encFrom, char *encTo, const char *in);/******************************************************************************* * main() function: ******************************************************************************/int main(int argc, char **argv){ char sRptNam[42+1]; /* 回执文件名 */ char sPath[300+1]; /* 回执路径 */ if (argc != 2) { printf("用法: %s 回执报文名\n", argv[0]); return -1; } memset(sPath, '\0', sizeof(sPath)); memset(sRptNam, '\0', sizeof(sRptNam)); memset(sMasCod, '\0', sizeof(sMasCod)); memset(sMasDat, '\0', sizeof(sMasDat)); iMasBat = 0; ErrFlg = 0; memcpy(sRptNam, argv[1], sizeof(sRptNam)); sprintf(sPath, "%s/feedback/%s", getenv("MASDIR"), sRptNam); memcpy(sMasCod, sRptNam + 8, 15); memcpy(sMasDat, sRptNam + 24, 8); memcpy(sMasBat, sRptNam + 33, 4); iMasBat = atoi(sMasBat); /* 连接反洗钱数据库 */ memset(sMasDBNam, '\0', sizeof(sMasDBNam)); sprintf(sMasDBNam, "%s", getenv("BTPDBS")); EXEC SQL CONNECT TO :sMasDBNam; if (sqlca.sqlcode != 0) { printf("连接反洗钱数据库失败,程序退出 !!!\n"); return -1; } /* 解析回执文件 */ MasParseReport(sPath); if (!ErrFlg) { EXEC SQL COMMIT; if (sqlca.sqlcode != 0) EXEC SQL ROLLBACK; printf("反洗钱回执报文解析完毕 !!!\n"); } else printf("反洗钱回执报文解析失败 !!!\n"); EXEC SQL CONNECT RESET; return 0;}/***************************************************************************** * MasParseReport(): 回执解析 *****************************************************************************/int MasParseReport(char *sPath) { xmlDocPtr RptDoc; xmlNodePtr RptCur; xmlChar *sTag; xmlChar *sMasCnt; RptDoc = xmlParseFile(sPath); if (RptDoc == NULL ) { printf("回执解析失败.\n"); ErrFlg = 1; return -1; } RptCur = xmlDocGetRootElement(RptDoc); if (RptCur == NULL) { printf("回执文件为空,请检查.\n"); xmlFreeDoc(RptDoc); ErrFlg = 1; return -1; } if (xmlStrcmp(RptCur->name, "FDBK")) { printf("回执文件类型错误,请检查.\n"); xmlFreeDoc(RptDoc); ErrFlg = 1; return -1; } memset(sRiCd, '\0', sizeof(sRiCd)); memset(sTxnDt, '\0', sizeof(sTxnDt)); iSeqNo = 0; memset(sSfId, '\0', sizeof(sSfId)); iFsNm = 0; iErTn = 0; iEfTn = 0; MasInit(); RptCur = RptCur->xmlChildrenNode; while (RptCur != NULL) { if (!xmlStrcmp(RptCur->name, "SFID")) { sTag = xmlNodeListGetString(RptDoc, RptCur->xmlChildrenNode, 1); /* 回执返回成功 */ if (!memcmp(sTag, CMMASUCC, 4)) { printf("回执文件返回: 文件发送正确!\n"); memcpy(sSfId, CMMASUCC, 4); //返回成功标识 RPTCURNEXT; if ((!xmlStrcmp(RptCur->name, "FSNM"))) { sMasCnt = xmlNodeListGetString(RptDoc, RptCur->xmlChildrenNode, 1); iFsNm = atoi(sMasCnt); //成功发送的文件数 /* 成功回执文件处理 */ printf("回执文件处理中...!\n"); MasIstTbl(); } else { PAZNODERR("FSNM"); } xmlFree(sTag); xmlFree(sMasCnt); break; } /* 回执返回文件名称错误 */ else if (!memcmp(sTag, CMMANMFL, 4)) { printf("回执文件返回: 文件名错误!\n"); memcpy(sSfId, CMMANMFL, 4); //返回文件名称错误标识 RPTCURNEXT; if (!xmlStrcmp(RptCur->name, "ERTN")) { sMasCnt = xmlNodeListGetString(RptDoc, RptCur->xmlChildrenNode, 1); iErTn = atoi(sMasCnt); //错误总数 /* 文件名错误回执处理 */ RPTCURNEXT; printf("回执文件处理中...!\n"); MasNamErr(RptDoc, RptCur); } else { PAZNODERR("ERTN"); } xmlFree(sTag); xmlFree(sMasCnt); break; } /* 回执返回文件内容错误 */ else if (!memcmp(sTag, CMMACTFL, 4)) { printf("回执文件返回: 文件内容错误!\n"); memcpy(sSfId, CMMACTFL, 4); //返回文件内容错误标识 RPTCURNEXT; if (!xmlStrcmp(RptCur->name, "EFTN")) { sMasCnt = xmlNodeListGetString(RptDoc, RptCur->xmlChildrenNode, 1); iEfTn = atoi(sMasCnt); //错误文件总数 RPTCURNEXT; printf("回执文件处理中...!\n"); MasCntErr(RptDoc, RptCur); } else { PAZNODERR("EFTN"); } xmlFree(sTag); xmlFree(sMasCnt); break; } } RptCur = RptCur->next; } xmlFreeDoc(RptDoc); return 0; } /* 文件名称错误回执数据处理 */int MasNamErr(xmlDocPtr RptDoc, xmlNodePtr RptCur){ xmlNodePtr RptCur1; xmlChar *sTag; xmlChar *sProp; char *sBuff; /* 文件名称错误 */ if (!xmlStrcmp(RptCur->name, "NMERs")) { RptCur = RptCur->xmlChildrenNode; RptCur = RptCur->next; } else { PAZNODERR("NMERs"); } while (RptCur != NULL) { /* 错误编号 */ if (!xmlStrcmp(RptCur->name, "NMER")) { sProp = xmlGetProp(RptCur, "seqno"); RptCur1 = RptCur->xmlChildrenNode; RptCur1 = RptCur1->next; } else { PAZNODERR("NMER"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -