Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1050903
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 20:18:31

编译命令

点击(此处)折叠或打开

  1. cc -I /home/eas/src/libxml/libxml2-2.6.30/include/ -I /home/eas/src/libiconv/libiconv-1.13.1/include/ -L/home/eas/src/libxml/libxml2-2.6.30/.libs -L/home/eas/src/libiconv/libiconv-1.13.1/lib/.libs/ -lxml2 -liconv -lz -lpthread -lm -o request request.c


点击(此处)折叠或打开

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4. #include    <math.h>
  5. #include    <ctype.h>
  6. #include    <sys/stat.h>
  7. #include    <unistd.h>

  8. #include    <libxml/parser.h>                /* LIBXML2 Header File */
  9. #include    <libxml/tree.h>                    /* LIBXML2 Header File */
  10. #include     <libxml/xmlmemory.h>            /* LIBXML2 Header File */
  11. #include    <libxml/xpath.h>                /* LIBXML2 Header File */
  12. #include    <iconv.h>                        /* LIBXML2 Header File */

  13. #define FMLFLD_NOTARRAY 0 /* 非数组(用于下标参数) */
  14. #define FMLFLD_OPTIONAL 0 /* 可选域 */
  15. #define FMLFLD_REQUIRED 1 /* 必需域 */
  16. #define    SYM_FML_FS    0x40    /* 域分隔符0x1E*/
  17. #define    SYM_FML_NV    ':'     /* 名值分隔符*/
  18. #define    SYM_FML_AN    '#'     /* 数组下标起始符*/
  19. #define RC_SUCC 0
  20. #define RC_NFND -1
  21. #define RC_NSPC -2

  22. #define SZ_DATA_BUS (32*1024)            /* 数据总线宽度 */
  23. typedef char T_DATABUS[SZ_DATA_BUS];    /* 数据总线 */

  24. void FmlDataClear(char * cFmlData);
  25. char *FmlFieldSeek(const char *cFmlData, const char *cFieldName,int    iIndex);
  26. int    FmlFieldPut(char *cFmlData,int iBufSize,char *cFieldName,int iIndex,char *cFieldValue);
  27. int FmlFieldGet(const char *cFmlData,const char *cFieldName,int    iIndex,    char *cFieldValue,int iValueSize);
  28. int    FmlFieldNum(const char *cFmlData, const char *cFieldName, int *iNum);

  29. int CodeConvert(char* from_charset, char* to_charset, char* inbuf,size_t inlen, char* outbuf, size_t outlen);
  30. char* u2g(char *inbuf);
  31. char* g2u(char *inbuf);
  32. char * StrTrim(char * pstr);
  33. int JugeFileExist(char *lFileName);

  34. int GetXmlThirdNodeNum(T_DATABUS tDataBus, char* pFilename, int iQueryNum, int * iRowNum, char* secNodeName);
  35. int GetXmlSecNodeNum(T_DATABUS tDataBus, char* pFilename, int * iQueryNum, char* secNodeName);
  36. int XmlParseFile(T_DATABUS tDataBus, char* pFilename, int iQueryNum, int iRowNum, char* secNodeName);

  37. int main(int argc, char **argv)
  38. {
  39.     FILE *    fp = NULL;
  40.     int        i = -1;
  41.     int        j = -1;
  42.     int        iRet = -1;
  43.     int        secNodNum = -1;            /*xml报文2级节点数*/
  44.     int        thirdNodNum = -1;        /*xml报文3级节点row数*/
  45.     char    secNodName[128];        /*2级节点名*/
  46.     char    filename[1024];
  47.     char    sParsefile[1024];
  48.     char    sXmlBuf[1024*1000*8];    /*从报文文件中读取的内容*/
  49.     char    sChildBuf[10240];        /*存放一次读取的文件内容*/
  50.     int        iXmlByteNum = 0;
  51.     
  52.     if(argc < 2)
  53.     {
  54.         printf("参数个数不对,应为2个!\n");
  55.         return -1;
  56.     }
  57.     
  58.     T_DATABUS tDataBus;
  59.      T_DATABUS tDataTmp;
  60.     FmlDataClear(tDataBus);
  61.     FmlDataClear(tDataTmp);
  62.     
  63.     memcpy(tDataTmp,tDataBus,SZ_DATA_BUS);
  64.     
  65.     memset(filename, 0x00, sizeof(filename));
  66.     memset(sParsefile, 0x00, sizeof(sParsefile));
  67.     memset(sXmlBuf, 0x00, sizeof(sXmlBuf));
  68.     memset(sChildBuf, 0x00, sizeof(sChildBuf));
  69.     
  70.     strcpy(filename, argv[1]);
  71.     StrTrim(filename);
  72.     sprintf(sParsefile, "%s%s%s", getenv("HOME"), "/src/xml_fun/", filename);
  73.     StrTrim(sParsefile);
  74.     
  75.     printf("***************************************************\n");
  76.     iRet = JugeFileExist(sParsefile);
  77.     if(iRet != RC_SUCC)
  78.     {
  79.         printf("文件[%s]不存在\n", sParsefile);
  80.         return -1;
  81.     }
  82.     
  83.     if((fp = fopen(sParsefile, "r")) == NULL)
  84.     {
  85.         printf("打开dmz文件[%s]失败\n", sParsefile);
  86.         return -1;
  87.     }
  88.     while(NULL != fgets(sChildBuf, sizeof(sChildBuf), fp))
  89.     {
  90.         strcat(sXmlBuf, sChildBuf);
  91.         memset(sChildBuf, 0, sizeof(sChildBuf));
  92.     }
  93.     iXmlByteNum = strlen(sXmlBuf);
  94.     printf("读取文件[%s],文件长度=[%d]\n", sParsefile, iXmlByteNum);    
  95.     printf("文件数据如下:\n[%s]", sXmlBuf);    
  96.     printf("***************************************************\n");
  97.     strncpy(secNodName, "balance_query", strlen("balance_query"));
  98.     /*获取xml文件中2级节点的数目*/
  99.     iRet = GetXmlSecNodeNum(tDataBus, sParsefile, &secNodNum, secNodName);
  100.     if( iRet != 0 )
  101.     {
  102.         printf("GetXmlSecNodeNum失败[%d]\n",iRet);
  103.         return -1;
  104.     }
  105.     /* 主机对公夜市余额查询交易 */
  106.     for(i=0; i<secNodNum; i++)
  107.     {
  108.         /*获取xml文件中当前2级节点对应的row节点的数目*/
  109.         iRet = GetXmlThirdNodeNum(tDataBus, sParsefile, i, &thirdNodNum, secNodName);
  110.         if( iRet != 0 )
  111.         {
  112.             printf("GetXmlThirdNodeNum失败[%d]\n",iRet);
  113.             return -1;
  114.         }
  115.         for(j=0; j<thirdNodNum; j++)
  116.         {
  117.             FmlDataClear(tDataBus);
  118.             memcpy(tDataBus,tDataTmp,SZ_DATA_BUS);
  119.             iRet = XmlParseFile(tDataBus, sParsefile, i, j, secNodName);
  120.             if( iRet != 0 )
  121.             {
  122.                 printf("xml文件解析失败[%d]\n",iRet);
  123.                 return -1;
  124.             }
  125.             printf("***************************************************\n");
  126.             printf("总线[%d][%d]=\n[%s]\n",i,j, tDataBus);
  127.             printf("***************************************************\n");
  128.         }
  129.     }
  130.     
  131.     return 0;
  132. }

  133. int CodeConvert(char* from_charset, char* to_charset, char* inbuf,size_t inlen, char* outbuf, size_t outlen)
  134. {
  135.     iconv_t cd;
  136.     char** pin = &inbuf;
  137.     char** pout = &outbuf;
  138.     cd = iconv_open(to_charset,from_charset);
  139.     if(cd == (iconv_t)-1)
  140.         return -1;
  141.     memset(outbuf,0,outlen);
  142.     if(iconv(cd,(char**)pin,(size_t *)&inlen,(char**)pout,(size_t*)&outlen) == -1)
  143.         return -1;
  144.     iconv_close(cd);
  145.     return 0;
  146. }

  147. /*************************************************************
  148.  * 函 数 名:u2g()
  149.  * 功能描述: UTF-8码转成GBK码
  150.  * 输入参数:inbuf    - 转入字符
  151.  * 输出参数:
  152.  * 返 回:szOut - 成功; NULL - 失败
  153.  * 说 明:成功则返回一个动态分配的char*变量,需要在使用
  154.  *             完毕后手动free,失败返回NULL,使用有风险,调用需谨慎
  155.  ************************************************************/
  156. char* u2g(char *inbuf)
  157. {
  158.     size_t nOutLen = 0;
  159.     char* szOut = NULL;
  160.     if(!strlen(inbuf))
  161.         return NULL;
  162.     nOutLen = 2 * strlen(inbuf) - 1;
  163.     szOut = (char*)malloc(nOutLen);
  164.     if (-1 == CodeConvert("UTF-8","GBK",inbuf,strlen(inbuf),szOut,nOutLen))
  165.     {
  166.         free(szOut);
  167.         szOut = NULL;
  168.     }
  169.     return szOut;
  170. }

  171. /*************************************************************
  172.  * 函 数 名:g2u()
  173.  * 功能描述: GBK码转成UTF-8码
  174.  * 输入参数:inbuf    - 转入字符
  175.  * 输出参数:
  176.  * 返 回:szOut - 成功; NULL - 失败
  177.  * 说 明:成功则返回一个动态分配的char*变量,需要在使用
  178.  *             完毕后手动free,失败返回NULL,使用有风险,调用需谨慎
  179.  ************************************************************/
  180. char* g2u(char *inbuf)
  181. {
  182.     size_t nOutLen = 0;
  183.     char* szOut = NULL;
  184.     if(!strlen(inbuf))
  185.         return NULL;
  186.     nOutLen = 2 * strlen(inbuf) - 1;
  187.     szOut = (char*)malloc(nOutLen);
  188.     if (-1 == CodeConvert("GBK","UTF-8",inbuf,strlen(inbuf),szOut,nOutLen))
  189.     {
  190.         free(szOut);
  191.         szOut = NULL;
  192.     }
  193.     return szOut;
  194. }

  195.  /*************************************************************
  196.  * 函 数 名:GetXmlThirdNodeNum()
  197.  * 功能描述: 获取xml文件中当前2级节点中row节点的数目
  198.  * 输入参数:tDataBus - 数据总线
  199.  *             pFilename - 文件全路径
  200.  *             iQueryNum - 当前2级节点的编号
  201.  *             secNodeName- 2级节点名
  202.  * 输出参数:tDataBus    - 数据总线
  203.  *             iRowNum - 当前2级节点对应的row节点的数目
  204.  * 返 回:0 - 成功 ;-1 - 失败
  205.  * 说 明:
  206.  ************************************************************/
  207. int GetXmlThirdNodeNum(T_DATABUS tDataBus, char* pFilename, int iQueryNum, int * iRowNum, char* secNodeName)
  208. {
  209.     int iTrade = 0; /*当前2级节点数*/
  210.     int i = 0;
  211.     char secNodName[1024];
  212.     xmlNodePtr propNodePtr;
  213.     xmlAttrPtr attrPtr;

  214.     /* 定义解析文档指针 */
  215.     xmlDocPtr doc;
  216.     /* 定义结点指针 */
  217.     xmlNodePtr curNode;

  218.     if( !pFilename )
  219.     {
  220.         printf("未指定文件名\n");
  221.         return -1;
  222.     }

  223.     memset(secNodName, 0x00, sizeof(secNodName));
  224.     if(secNodeName != NULL)
  225.     {
  226.         strcpy(secNodName, secNodeName);
  227.     }
  228.     else
  229.     {
  230.         printf("2级节点名空\n");
  231.         return -1;
  232.     }
  233.     /* 解析文件 */
  234.     doc = xmlReadFile(pFilename,"GB2312",XML_PARSE_NOBLANKS);
  235.     if (NULL == doc)
  236.     {
  237.         printf("未指定文件名\n");
  238.         return -1;
  239.     }
  240.     /* 确定文档根元素 */
  241.     curNode = xmlDocGetRootElement(doc);
  242.     if (NULL == curNode)
  243.     {
  244.         printf("Empty File!filename[%s]\n",pFilename);
  245.         xmlFreeDoc(doc);
  246.         return -1;
  247.     }
  248.     /*检查确认当前文档中包含内容*/
  249.     if (xmlStrcmp(curNode->name, BAD_CAST "request"))
  250.     {
  251.         printf("root node != request\n");
  252.         xmlFreeDoc(doc);
  253.         return -1;
  254.     }
  255.     printf("开始查找节点\n");
  256.     curNode = curNode->children;
  257.     if( !xmlStrcmp(curNode->name,BAD_CAST secNodName) )
  258.     {
  259.         while(1)
  260.         {
  261.             /*找到要查询的当前2级节点*/
  262.             if(iTrade == iQueryNum)
  263.             {
  264.                 /*指向row节点*/
  265.                 curNode = curNode->children;
  266.                 while( curNode != NULL )
  267.                 {
  268.                     if( !xmlStrcmp(curNode->name,BAD_CAST "row") )
  269.                     {
  270.                         if((xmlHasProp(curNode,BAD_CAST "row")) == 0)
  271.                         {
  272.                             curNode = curNode->next;
  273.                             /*当前trade_query级节点数加1*/
  274.                             i++;
  275.                         }
  276.                         else
  277.                         {
  278.                             printf("XML文件未找到row属性\n");
  279.                             xmlFreeDoc(doc);
  280.                             return -1;
  281.                         }
  282.                     }
  283.                 }
  284.                 /*已寻找完毕*/
  285.                 break;
  286.             }
  287.             else if(iTrade > iQueryNum)
  288.             {
  289.                 printf("iQueryNum参数错误\n");
  290.                 xmlFreeDoc(doc);
  291.                 return -1;
  292.             }
  293.             else
  294.             {
  295.                 iTrade++;
  296.                 /*指向以下个2级节点*/
  297.                 curNode = curNode->next;
  298.             }
  299.         }
  300.     }
  301.     else
  302.     {
  303.         printf("root node != [%s]\n", secNodName);
  304.         xmlFreeDoc(doc);
  305.         return -1;
  306.     }

  307.     *iRowNum = i;
  308.     xmlFreeDoc(doc);
  309.     printf("XML文件[%s][%d]级节点数=[%d]\n",secNodName, iQueryNum, *iRowNum);
  310.     return 0;
  311. }

  312. /*************************************************************
  313.  * 函 数 名:GetXmlSecNodeNum()
  314.  * 功能描述: 获取xml文件中2级节点的数目
  315.  * 输入参数:tDataBus - 数据总线
  316.  *              pFilename - 文件全路径
  317.  *             secNodeName- 2级节点名
  318.  * 输出参数:tDataBus    - 数据总线
  319.  *             iQueryNum - 2级节点的数目
  320.  * 返 回:0 - 成功 ;-1 - 失败
  321.  * 说 明:
  322.  ************************************************************/
  323. int GetXmlSecNodeNum(T_DATABUS tDataBus, char* pFilename, int * iQueryNum, char* secNodeName)
  324. {
  325.     int i=0;
  326.     char secNodName[128];
  327.     /* 定义解析文档指针 */
  328.     xmlDocPtr doc;
  329.     /* 定义结点指针 */
  330.     xmlNodePtr curNode;

  331.     if( !pFilename )
  332.     {
  333.         printf("未指定文件名\n");
  334.         return -1;
  335.     }
  336.     memset(secNodName, 0x00, sizeof(secNodName));
  337.     if(secNodeName != NULL)
  338.     {
  339.         strcpy(secNodName, secNodeName);
  340.     }
  341.     else
  342.     {
  343.         printf("2级节点名空\n");
  344.         return -1;
  345.     }
  346.     /* 解析文件 */
  347.     doc = xmlReadFile(pFilename,"GB2312",XML_PARSE_NOBLANKS);
  348.     if (NULL == doc)
  349.     {
  350.         printf("未指定文件名\n");
  351.         return -1;
  352.     }
  353.     /* 确定文档根元素 */
  354.     curNode = xmlDocGetRootElement(doc);
  355.     /*检查确认当前文档中包含内容*/
  356.     if (NULL == curNode)
  357.     {
  358.         printf("Empty File!filename[%s]\n",pFilename);
  359.         xmlFreeDoc(doc);
  360.         return -1;
  361.     }
  362.     if (xmlStrcmp(curNode->name, BAD_CAST "request"))
  363.     {
  364.         printf("root node != request\n");
  365.         xmlFreeDoc(doc);
  366.         return -1;
  367.     }
  368.     while( curNode != NULL )
  369.     {
  370.         if( !xmlStrcmp(curNode->name,BAD_CAST secNodName) )
  371.         {
  372.             curNode = curNode->next;
  373.             /*当前trade_query级节点数加1*/
  374.             i++;
  375.         }
  376.         else
  377.         {
  378.             curNode = curNode->children;
  379.         }
  380.     }
  381.     *iQueryNum = i;
  382.     xmlFreeDoc(doc);
  383.     printf("XML文件[%s]级节点数=[%d]\n", secNodName, *iQueryNum);
  384.     return 0;
  385. }

  386. /*************************************************************
  387.  * 函 数 名:XmlParseFile()
  388.  * 功能描述: 将xml文件解析成数据总线格式
  389.  * 输入参数:pFilename - 文件全路径
  390.  *             iQueryNum    - 当前2级节点的编号
  391.  *             iRowNum - 当前Row节点的编号
  392.  *             secNodeName- 2级节点名
  393.  * 输出参数:tDataBus    - 数据总线
  394.  * 返 回:0 - 成功 ;-1 - 失败
  395.  * 说 明:
  396.  ************************************************************/
  397. int XmlParseFile(T_DATABUS tDataBus, char* pFilename, int iQueryNum, int iRowNum, char* secNodeName)
  398. {
  399.     int i=0;
  400.     char secNodName[128];
  401.     char *eleName;
  402.     char *eleValue;
  403.     char buffer[1024];
  404.     xmlChar* szAttr;
  405.     xmlAttrPtr attrPtr;

  406.     /* 定义解析文档指针 */
  407.     xmlDocPtr doc;
  408.     /* 定义结点指针 */
  409.     xmlNodePtr curNode;

  410.     memset(secNodName, 0x00, sizeof(secNodName));

  411.     printf("XML文件单笔解析开始....\n");
  412.     if( !secNodeName )
  413.     {
  414.         printf("2级节点名空\n");
  415.         return -1;
  416.     }
  417.     strcpy(secNodName, secNodeName);
  418.     printf("secNodName=[%s]", secNodName);
  419.     if( !pFilename )
  420.     {
  421.         printf("未指定文件名\n");
  422.         return -1;
  423.     }
  424.     printf("pFilename=[%s]\n", pFilename);
  425.     /* 解析文件 */
  426.     doc = xmlReadFile(pFilename,"GBK",XML_PARSE_NOBLANKS);
  427.     if (NULL == doc)
  428.     {
  429.         printf("未指定文件名\n");
  430.         return -1;
  431.     }
  432.     /* 确定文档根元素 */
  433.     curNode = xmlDocGetRootElement(doc);
  434.     /*检查确认当前文档中包含内容*/
  435.     if (NULL == curNode)
  436.     {
  437.         printf("Empty File!filename[%s]\n",pFilename);
  438.         xmlFreeDoc(doc);
  439.         return -1;
  440.     }
  441.     if( !xmlStrcmp(curNode->name,BAD_CAST "request") )
  442.     {
  443.         for( attrPtr =curNode->properties ; attrPtr ; attrPtr = attrPtr->next )
  444.         {
  445.             szAttr = xmlGetProp(curNode,attrPtr->name);
  446.             eleName = u2g((char*)attrPtr->name);
  447.             eleValue = u2g((char*)szAttr);
  448.             if(eleValue != NULL)
  449.                 FmlFieldPut(tDataBus, SZ_DATA_BUS, eleName, 0, eleValue);
  450.             else
  451.                 FmlFieldPut(tDataBus, SZ_DATA_BUS, eleName, 0, "");
  452.             xmlFree(szAttr);
  453.             if( eleName != NULL )
  454.             {
  455.                 free(eleName);
  456.                 eleName = NULL;
  457.             }
  458.             if( eleValue != NULL )
  459.             {
  460.                 free(eleValue);
  461.                 eleValue = NULL;
  462.             }
  463.         }
  464.     }
  465.     else
  466.     {
  467.         printf("root node != request\n");
  468.         xmlFreeDoc(doc);
  469.         return -1;
  470.     }
  471.     curNode = curNode->children; /*指向2级节点*/
  472.     /*
  473.     char * tempnodeName;
  474.     tempnodeName = u2g((char*)curNode->name);
  475.     printf("******************************************\n");
  476.     printf("curNode->name=[%s]\n", curNode->name);
  477.     xmlNodePtr tempcurNode;
  478.     tempcurNode = curNode->parent; //指向该节点的父节点
  479.     
  480.     xmlChar* tempszAttr = xmlNodeGetContent(tempcurNode);
  481.     tempnodeName = u2g((char*)tempcurNode->name);
  482.     printf("tempcurNode->name=[%s]\n", tempcurNode->name);
  483.     printf("******************************************\n");
  484.     */
  485.     
  486.     for(i=0; i<iQueryNum; i++)
  487.     {
  488.         curNode = curNode->next; /*当前2级节点平移iTradeNum次*/
  489.     }
  490.     if( !xmlStrcmp(curNode->name,BAD_CAST secNodName) )
  491.     {
  492.         for( attrPtr =curNode->properties ; attrPtr ; attrPtr = attrPtr->next )
  493.         {
  494.             szAttr = xmlGetProp(curNode,attrPtr->name);
  495.             eleName = u2g((char*)attrPtr->name);
  496.             eleValue = u2g((char*)szAttr);
  497.             if(eleValue != NULL)
  498.                 FmlFieldPut(tDataBus, SZ_DATA_BUS, eleName, 0, eleValue);
  499.             else
  500.                 FmlFieldPut(tDataBus, SZ_DATA_BUS, eleName, 0, "");
  501.             xmlFree(szAttr);
  502.             if( eleName != NULL )
  503.             {
  504.                 free(eleName);
  505.                 eleName = NULL;
  506.             }
  507.             if( eleValue != NULL )
  508.             {
  509.                 free(eleValue);
  510.                 eleValue = NULL;
  511.             }
  512.         }
  513.     }
  514.     else
  515.     {
  516.         printf("root node != [%s]\n", secNodName);
  517.         xmlFreeDoc(doc);
  518.         return -1;
  519.     }

  520.     curNode = curNode->children; /*指向row节点*/
  521.     for(i=0; i<iRowNum; i++)
  522.     {
  523.         curNode = curNode->next; /*当前row级节点平移iRowNum次*/
  524.     }
  525.     if( !xmlStrcmp(curNode->name,BAD_CAST "row") )
  526.     {
  527.         for( attrPtr =curNode->properties ; attrPtr ; attrPtr = attrPtr->next )
  528.         {
  529.             szAttr = xmlGetProp(curNode,attrPtr->name);
  530.             eleName = u2g((char*)attrPtr->name);
  531.             eleValue = u2g((char*)szAttr);
  532.             /*
  533.             if( !xmlStrcmp(attrPtr->name, BAD_CAST "currency") )
  534.             {
  535.                 memset(buffer,0,sizeof(buffer));
  536.                 ChangeCurCodeFrom3To2(tDataBus,eleValue,buffer,0);
  537.                 StrTrim(buffer);
  538.                 memset(eleValue,0,strlen(eleValue));
  539.                 strcpy(eleValue,buffer);
  540.             }
  541.             */
  542.             if(eleValue != NULL)
  543.                 FmlFieldPut(tDataBus, SZ_DATA_BUS, eleName, 0, eleValue);
  544.             else
  545.                 FmlFieldPut(tDataBus, SZ_DATA_BUS, eleName, 0, "");
  546.             xmlFree(szAttr);
  547.             if( eleName != NULL )
  548.             {
  549.                 free(eleName);
  550.                 eleName = NULL;
  551.             }
  552.             if( eleValue != NULL )
  553.             {
  554.                 free(eleValue);
  555.                 eleValue = NULL;
  556.             }
  557.         }
  558.     }
  559.     else
  560.     {
  561.         printf("root node != row\n");
  562.         xmlFreeDoc(doc);
  563.         return -1;
  564.     }

  565.     xmlFreeDoc(doc);
  566.     printf("XML文件解析成功结束单笔....\n");
  567.     return 0;
  568. }

  569. /*FmlDataClear 函数功能:清空数据总线函数*/
  570. void FmlDataClear(char *    cFmlData)
  571. {
  572.     cFmlData[0] = 0;
  573. }

  574. /*FmlFieldErase函数:擦除总线数据中的指定域,没有这个域就不擦除*/
  575. void    FmlFieldErase(char *cFmlData, const char *cFieldName,int iIndex)
  576. {
  577.     char    *p, *q;
  578.     if ( ( p = FmlFieldSeek( cFmlData, cFieldName, iIndex ) ) == NULL )
  579.         return; /*p指向指定的域名的起始地址*/
  580.     if ( ( q = strchr( p, SYM_FML_FS ) ) == NULL ) /*SYM_FML_FS:域分割符^^*/
  581.         q = p + strlen( p );
  582.     else
  583.         q ++; /*q指向域尾*/
  584.     strcpy( p, q ); /*p到q之间的被跳过*/
  585. }

  586. /*FmlFieldSeek函数功能:检索总线中指定域函数,返回指定域的起始地址*/
  587. char *FmlFieldSeek(const char *cFmlData, const char *cFieldName,int    iIndex)
  588. {
  589.     char    *p = (char *) cFmlData;
  590.     char    *n, *q, *v;
  591.     int    r;

  592.     while ( ( n = strchr( p, SYM_FML_FS ) ) != NULL )/*SYM_FML_FS:域分割符^^*/
  593.     {    
  594.         *n = 0; /*n指向下一个域分割符^^,并截断*/
  595.         q = strchr( p, SYM_FML_NV ); /*SYM_FML_NV:名值分割符:*/
  596.         *n = SYM_FML_FS; /*恢复域分割符,重新连上总线*/
  597.         if ( q != NULL )
  598.         {
  599.             *q = 0; /*q指向名值分割符:,并截断*/
  600.             if ( ( v = strchr( p, SYM_FML_AN ) ) != NULL ) /*0下标时,v=NULL*/
  601.                 *v = 0; /*v指向数组下标起始符#,并截断*/
  602.             if ( ( r = strcmp( p, cFieldName ) ) == 0 ) /*比较p指向的是不是待检索的域名*/
  603.             {
  604.                 if ( v == NULL && iIndex != FMLFLD_NOTARRAY || v != NULL && atoi( v + 1 ) != iIndex )
  605.                     r = -1; /*对下标值的检查,出错时r=-1*/
  606.             }
  607.             if ( v != NULL )
  608.                 *v = SYM_FML_AN; /*重新连上总线*/
  609.             *q = SYM_FML_NV; /*重新连上总线*/
  610.             if ( r == 0 ) /*域名匹配,下标也正确时,查找完毕*/
  611.                 return p; /*返回域名起始地址*/
  612.         }
  613.         p = n + 1; /*p指向下一个域名起始地址,继续循环查找*/
  614.     }
  615.     return NULL;
  616. }


  617. /*FmlFieldPut() 功能描述: 为总线中指定域赋值函数*/
  618. int    FmlFieldPut(char *cFmlData,int iBufSize,char *cFieldName,int iIndex,char *cFieldValue)
  619. {
  620.     int    s, l;
  621.     char    a[12];

  622.     FmlFieldErase( cFmlData, cFieldName, iIndex ); /*擦除指定域名域值*/

  623.     if ( iIndex == FMLFLD_NOTARRAY ) /*FMLFLD_NOTARRAY=0,判断是否是0下标*/
  624.         s = 0; /*0下标时,没有数组下标起始符#,也没有小标值0的显示*/
  625.     else
  626.         s = snprintf( a, sizeof( a ), "%d", iIndex ) + 1; /*下标的长度+#号码长度*/
  627.     if ( ( l = strlen( cFmlData ) ) + strlen( cFieldName ) + s + strlen( cFieldValue ) + 2 > iBufSize )
  628.         return RC_NSPC; /*判断是否溢出,其中2=域分隔符+'\0'*/
  629.     if ( l > 0 && cFmlData[l-1] != SYM_FML_FS ) /*SYM_FML_FS域分割符^^,原串没有域分割符时*/
  630.     {
  631.         cFmlData[l] = SYM_FML_FS; /*原串尾加上域分隔符*/
  632.         l ++; /*原串长+1*/
  633.     }

  634.     if ( s != 0 ) /*非0下标时*/
  635.         /*a中保存的是下标值*/
  636.         sprintf( cFmlData + l, "%s%c%s%c%s%c", cFieldName, SYM_FML_AN, a, SYM_FML_NV, cFieldValue, SYM_FML_FS );
  637.     else /*0下标时*/
  638.         sprintf( cFmlData + l, "%s%c%s%c", cFieldName, SYM_FML_NV,
  639.         cFieldValue, SYM_FML_FS );

  640.     return RC_SUCC;
  641. }


  642. /*FmlFieldGet() 功能描述: 从总线中取指定域值函数*/
  643. int FmlFieldGet(const char *cFmlData,const char *cFieldName,int    iIndex,    char *cFieldValue,int iValueSize)
  644. {
  645.     char    *p, *q, *v;
  646.     int    l;
  647.     
  648.     if ( ( p = FmlFieldSeek( cFmlData, cFieldName, iIndex ) ) == NULL )
  649.         return RC_NFND; /*p指向指定域名的起始地址*/
  650.     q = strchr( p, SYM_FML_NV ) + 1; /*SYM_FML_NV名值分隔符:,q指向域值的起始地址*/
  651.     if ( ( v = strchr( q, SYM_FML_FS ) ) == NULL ) /*SYM_FML_FS域分隔符^^,v指向域值的尾部地址*/
  652.         l = strlen( q ); /*没有串尾符^^的长度*/
  653.     else
  654.         l = v - q; /*l=域值的长度*/
  655.     if ( l >= iValueSize ) /*要放域值的空间不能小于域值的长度*/
  656.         return RC_NSPC;
  657.     memcpy( cFieldValue, q, l );
  658.     cFieldValue[l] = 0; /*域值的地址加字符串的结束符*/
  659.     return RC_SUCC;
  660. }


  661. /*FmlFieldNum() 功能描述: 统计总线中重复域的个数函数*/
  662. int    FmlFieldNum(const char *cFmlData, const char *cFieldName, int *iNum)
  663. {
  664.     char    *p = (char *) cFmlData;
  665.     char    *n, *q, *v;
  666.     int    r;
  667.     int    num,flag;

  668.     num=0;
  669.     flag=0;

  670.     while ( ( n = strchr( p, SYM_FML_FS ) ) != NULL )
  671.     {
  672.         *n = 0;
  673.         q = strchr( p, SYM_FML_NV );
  674.         *n = SYM_FML_FS;
  675.         if ( q != NULL )
  676.         {
  677.             *q = 0;
  678.             if ( ( v = strchr( p, SYM_FML_AN ) ) != NULL )
  679.                 *v = 0;
  680.             else
  681.             {
  682.                 *iNum=0;
  683.                 if( v != NULL)
  684.                     *v=SYM_FML_AN;
  685.                 *q=SYM_FML_NV;
  686.                 p = n + 1;
  687.                 continue;
  688.             }
  689.             if ( ( r = strcmp( p, cFieldName ) ) == 0 )
  690.             {
  691.                 num++;
  692.                 flag=1;
  693.             }
  694.                 *v=SYM_FML_AN;
  695.                 *q=SYM_FML_NV;
  696.         }
  697.         p = n + 1;
  698.     }
  699.     *iNum=num;
  700.     if(flag == 1)
  701.         return RC_SUCC;
  702.     else
  703.         return RC_NFND;
  704. }

  705. char * StrTrim(char * pstr)
  706. {
  707.     if(NULL == pstr)
  708.     {
  709.         return NULL;
  710.     }
  711.     char * phead = pstr;
  712.     char * ptail = pstr + strlen(pstr) - 1;
  713.     while((*phead == ' ')&&(phead < ptail)) phead++;
  714.     while((*ptail == ' ')&&(ptail > phead)) ptail--;
  715.     *(ptail + 1) = '\0';
  716.     memcpy(pstr, phead, sizeof(char)*(ptail - phead + 2));
  717.     return pstr;
  718. }

  719. /***********************************************************
  720.  * 函 数: JugeFileExist()
  721.  * 功能描述: 判断文件是否存在
  722.  * 输入参数:lFilename    -    长文件名
  723.  * 返 回:0-文件存在;1-文件不存在
  724.  * 流程描述:
  725.  *    说 明:
  726.  * 修改记录:
  727.  * [修改人] [日期][描述]
  728. ***********************************************************/
  729. int JugeFileExist(char *lFileName)
  730. {
  731.     struct stat statbuf;
  732.     memset(&statbuf,0,sizeof(statbuf));
  733.     stat(lFileName,&statbuf);
  734.     if(statbuf.st_mode & S_IFREG)
  735.         return 0;
  736.     else
  737.         return 1;
  738. }
解析的文件

点击(此处)折叠或打开

  1. <request req_no="137041258840" from="shfe" to="ccb" req_date="20130605" req_time="14:09:48">
  2.   <balance_query size="3">
  3.    <row acct_no="31001559100059010111" currency="CNY" branch_no="52311" />
  4.    <row acct_no="31001559100059010111" currency="CNY" branch_no="52311" />
  5.    <row acct_no="31001559100059010222" currency="CNY" branch_no="52322" />
  6.    <row acct_no="31001559100059010333" currency="CNY" branch_no="52333" />
  7.    <row acct_no="31001559100059010444" currency="CNY" branch_no="52344" />
  8.    <row acct_no="31001559100059010555" currency="CNY" branch_no="52355" />
  9.    <row acct_no="31001559100059010666" currency="CNY" branch_no="52366" />
  10.    <row acct_no="31001559100059010777" currency="CNY" branch_no="52377" />
  11.    <row acct_no="31001559100059010888" currency="CNY" branch_no="52388" />
  12.    <row acct_no="31001559100059010999" currency="CNY" branch_no="52399" />
  13.    <row acct_no="31001559100059010AAA" currency="CNY" branch_no="523AA" />
  14.    <row acct_no="31001559100059010BBB" currency="CNY" branch_no="523BB" />
  15.    <row acct_no="31001559100059010CCC" currency="CNY" branch_no="523CC" />
  16.    <row acct_no="31001559100059010DDD" currency="CNY" branch_no="523DD" />
  17.    <row acct_no="31001559100059010EEE" currency="CNY" branch_no="523EE" />
  18.    <row acct_no="31001559100059010FFF" currency="CNY" branch_no="523FF" />
  19.    <row acct_no="31001559100059010GGG" currency="CNY" branch_no="523GG" />
  20.    <row acct_no="31001559100059010HHH" currency="CNY" branch_no="523HH" />
  21.   </balance_query>
  22. </request>

阅读(736) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~