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

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 19:54:37

编译命令:

点击(此处)折叠或打开

  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 creat creat.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    <stdbool.h>
  9. #include    <sys/timeb.h>
  10. #include    <time.h>
  11. #include     <sys/time.h>
  12. #include     <sys/timeb.h>

  13. #include    <libxml/parser.h>                /* LIBXML2 Header File */
  14. #include    <libxml/tree.h>                    /* LIBXML2 Header File */
  15. #include     <libxml/xmlmemory.h>            /* LIBXML2 Header File */
  16. #include    <libxml/xpath.h>                /* LIBXML2 Header File */
  17. #include    <iconv.h>                        /* LIBXML2 Header File */

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

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

  29. void FmlDataClear(char *    cFmlData);
  30. char *FmlFieldSeek(const char *cFmlData, const char *cFieldName,int    iIndex);
  31. int    FmlFieldPut(char *cFmlData,int iBufSize,char *cFieldName,int iIndex,char *cFieldValue);
  32. int FmlFieldGet(const char *cFmlData,const char *cFieldName,int    iIndex,    char *cFieldValue,int iValueSize);
  33. int    FmlFieldNum(const char *cFmlData, const char *cFieldName, int *iNum);

  34. int CodeConvert(char* from_charset, char* to_charset, char* inbuf,size_t inlen, char* outbuf, size_t outlen);
  35. char* u2g(char *inbuf);
  36. char* g2u(char *inbuf);
  37. char * StrTrim(char * pstr);
  38. int    GetDateTime(char * cDate, char * cTime);

  39. /*需要注意的是,并没有xmlDelNode或xmlRemoveNode函数,我们删除节点使用的是以下一段代码:
  40. 即将当前节点从文件中断链(unlink),这样本文件就不会再包含这个子节点。
  41. 这样做需要使用一个临时变量来存储断链节点的后续节点,并记得要手动删除断链节点的内存*/
  42. int xmlRemoveNode(xmlNodePtr curNode, xmlChar * nodeName)
  43. {
  44.     while(1)
  45.     {
  46.         if(xmlStrcmp(curNode->name, nodeName) == 0)
  47.         {
  48.             printf("已经找到节点:\n");
  49.             xmlNodePtr tempNode;
  50.             /*tempNode = curNode->next;*/ /*保存要删除节点的下一个节点*/
  51.             
  52.             /*curNode->prev->next = tempNode;*/ /*将断链的部分连接起来*/
  53.             
  54.             /*xmlUnlinkNode函数功能:断开当前节点,断开处的前后节点会自动连接起来*/
  55.             xmlUnlinkNode(curNode);
  56.             xmlFreeNode(curNode);
  57.             break;
  58.         }
  59.         else
  60.         {
  61.             printf("继续寻找下一个节点...........\n");
  62.             curNode = curNode->next;    
  63.             continue;
  64.         }
  65.     }    
  66.     return 0;
  67. }

  68. int main(int argc, char **argv)
  69. {
  70.     xmlNodePtr node;
  71.     xmlNodePtr curnode;
  72.     xmlNodePtr content;
  73.     
  74.     
  75.     xmlNodePtr root_node;
  76.     xmlDocPtr doc;
  77.     int iRet = -1;
  78.     
  79.     /*xmlNewDoc函数功能:在内存中创建一个新的XML文档。
  80.     参数说明:version:XML标准的版本,目前只能指定为“1.0”*/
  81.     doc = xmlNewDoc(BAD_CAST"1.0");
  82.     if(doc == NULL)
  83.     {
  84.         printf("doc = NULL\n");
  85.     }
  86.     else
  87.     {
  88.         printf("doc != NULL\n");
  89.     }
  90.     
  91.     /*xmlNewNode函数功能:创建一个新的节点指针 root_node;*/
  92.     root_node = xmlNewNode(NULL, BAD_CAST "root");
  93.     
  94.     /*xmlDocSetRootElement函数功能:将root_node节点设置为根节点*/
  95.        node = xmlDocSetRootElement(doc, root_node);
  96.     if(node == NULL)
  97.     {
  98.         printf("根节点设置失败!\n");
  99.     }
  100.     
  101.     /*xmlNewTextChild函数功能:在根节点中直接添加一个文本子节点*/
  102.     xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");
  103.     xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "");
  104.     
  105.     curnode = root_node->children;
  106.     xmlNodeSetContentLen(curnode, "java", strlen("java"));
  107.     curnode = curnode->next;
  108.     /*xmlNodeSetContentLen函数功能:设置节点的内容+长度*/
  109.     /*xmlNodeSetContent(curnode, "zhangqiuping");*/
  110.     xmlNodeSetContentLen(curnode, "zhangqiuping123", xmlStrlen("zhangqiuping123"));
  111.     xmlNodeAddContent(curnode, "_wangxiancai456");
  112.     
  113.     /*xmlNodeAddContentLen(curnode, "_wangxiancai", xmlStrlen("_wangxiancai"));*/
  114.     
  115.     xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "QT");
  116.     
  117.     /*xmlNodeSetName函数功能:更改节点名*/
  118.     xmlNodeSetName(root_node->children->next->next,"program_language");
  119.     
  120.     node = xmlNewNode(NULL,BAD_CAST"newNode4");
  121.     /*xmlNewText函数功能:创建一个描述节点,没有 <> 符号,需要添加到其他节点上。*/
  122.     content = xmlNewText(BAD_CAST"java");
  123.     xmlTextConcat(content, "_xyz", xmlStrlen("_xyz"));
  124.     
  125.     /*xmlAddChild函数功能:把一个节点设置为另外一个节点的子节点。
  126.       xmlAddChild (pnode1,xmlNewText (BAD_CAST "这是更低的节点,子子子节点1"));
  127.      会出现下面的结果:<子子节点1>这是更低的节点,子子子节点1</子子节点1>*/
  128.     xmlAddChild(root_node,node);
  129.     
  130.     /*xmlNodeSetContent(node,content);*/
  131.     xmlAddChild(node,content);
  132.     
  133.     /*xmlNewProp函数功能:给一个节点增加属性信息,包括在 <>*/
  134.     xmlAttrPtr AttrPtr1 = xmlNewProp(node, BAD_CAST "name", BAD_CAST "very_CD");
  135.     
  136.     /*设置节点属性*/
  137.     xmlSetProp(node, BAD_CAST "name", BAD_CAST "zhangqiuping******");
  138.     xmlAttrPtr AttrPtr2 = xmlCopyProp(node, AttrPtr1);
  139.     xmlChar * AttrName = AttrPtr2->name;
  140.     xmlChar * AttrValue = xmlGetProp(node, AttrName);
  141.     printf("xmlCopyProp AttrName2 = [%s]\n", (char *)AttrName);
  142.     printf("xmlCopyProp AttrValue2 = [%s]\n", (char *)AttrValue);
  143.     
  144.     //创建一个儿子和孙子节点
  145.     curnode = xmlNewNode(NULL, BAD_CAST "newNode5");
  146.     xmlAddChild(root_node,curnode);
  147.     /*xmlNodeSetContentLen(curnode, "abc*********abc", xmlStrlen("abc*********abc"));*/
  148.     
  149.     /*xmlNewProp函数功能:给一个节点增加属性信息,包括在 <>*/
  150.     AttrPtr1 = xmlNewProp(curnode, BAD_CAST "date", BAD_CAST "20130603");
  151.     xmlAttrPtr AttrPtr10 = xmlNewProp(curnode, BAD_CAST "time", BAD_CAST "23:31:24");
  152.     
  153.     xmlNewProp(curnode, AttrName, AttrValue);
  154.     
  155.     /*设置节点属性(如果该属性已经存在,则替换其值)*/
  156.     xmlSetProp(curnode, BAD_CAST "date", BAD_CAST "20130604");
  157.     
  158.     /*xmlRemoveProp函数功能:删除属性*/
  159.     xmlRemoveProp(AttrPtr10);
  160.     /*xmlFreeProp函数功能:释放属性指针*/
  161.     //xmlFreeProp(AttrPtr10);
  162.     
  163.     /*xmlUnsetProp函数功能:删除属性*/
  164.     /*xmlUnsetProp(curnode, BAD_CAST "time");*/
  165.     
  166.     AttrPtr2 = xmlCopyProp(node, AttrPtr1);
  167.     AttrName = (char *)AttrPtr2->name;
  168.     printf("AttrName2 = [%s]\n", AttrName);
  169.     
  170.     char * str1=g2u((char*)("小儿子"));
  171.     /*xmlChar * str2=BAD_CAST str1;*/
  172.     xmlChar * str2=BAD_CAST g2u((char*)("小儿子"));
  173.     xmlNodePtr son = xmlNewNode(NULL, str2);
  174.     xmlAddChild(curnode,son);
  175.     char * str3=g2u((char*)("姓名"));
  176.     xmlChar * str4=BAD_CAST str3;
  177.     xmlSetProp(son, str4, BAD_CAST "wxc");
  178.     
  179.        str1=g2u((char*)("孙子"));
  180.     str2=BAD_CAST str1;
  181.     xmlNodePtr grandson = xmlNewNode(NULL, str2);
  182.     xmlAddChild(son,grandson);
  183.     
  184.     str1=g2u((char*)("c++语言"));
  185.     str2=BAD_CAST str1;
  186.     /*xmlNewText函数功能:创建一个描述节点,没有 <> 符号,需要添加到其他节点上。*/
  187.     xmlAddChild(grandson, xmlNewText(str2));
  188.     
  189.     str1=g2u((char*)("大儿子"));
  190.     str2=BAD_CAST str1;
  191.     str3=g2u((char*)("大儿子叫什么啊?"));
  192.     str4=BAD_CAST str3;
  193.     /*xmlNewChild函数功能:指定一个节点,会创建这个节点的子节点。
  194.     这样不需要使用 xmlNewNode 创建一个节点,再使用 xmlAddChild 添加到其父节点中。*/
  195.     xmlNewChild (curnode, NULL, str2, str4);
  196.     
  197.     /*xmlCopyNode函数功能:复制当前节点*/
  198.     /*node = xmlCopyNode (curnode, 0);*//*只保留复制的节点名*/
  199.     /*node = xmlCopyNode (curnode, 1);*//*完全保留复制的节点的所有内容*/
  200.     /*node = xmlCopyNode (curnode, 2);*//*只保留复制的节点的属性名+属性值*/
  201.     /*node = xmlCopyNode (curnode, 3);*//*3以上是完全保留复制的节点的所有内容*/
  202.     node = xmlCopyNode (curnode, 4);
  203.     /*XMLPUBFUN xmlNodePtr XMLCALL
  204.         xmlReplaceNode(xmlNodePtr old, xmlNodePtr cur);*/
  205.     xmlAddChild(root_node, node);
  206.     
  207.     char * nodename = (char *)node->name;
  208.     printf("nodename = [%s]\n", nodename);
  209.     
  210.     /*xmlAddSibling函数功能:添加兄弟节点*/
  211.     curnode = xmlNewNode(NULL, BAD_CAST g2u((char*)("节点7")));
  212.     xmlNewProp(curnode, BAD_CAST g2u((char*)("大学名称")), BAD_CAST g2u((char*)("湖北科技学院")));
  213.     xmlAddSibling (node, curnode);
  214.     
  215.     /*xmlAddNextSibling函数功能:添加后一个兄弟节点*/
  216.     curnode = xmlNewNode(NULL, BAD_CAST "newNode_x");
  217.     xmlAddNextSibling (node, curnode);
  218.     
  219.     /*xmlAddPrevSibling函数功能:添加前一个兄弟节点*/
  220.     curnode = xmlNewNode(NULL, BAD_CAST "newNode_y");
  221.     xmlAddPrevSibling (node, curnode);
  222.     curnode = xmlNewNode(NULL, BAD_CAST "newNode_z");
  223.     /*xmlReplaceNode函数功能:替换节点*/
  224.     /*xmlReplaceNode(node, curnode);*/
  225.     
  226.     /*删除节点*/
  227.     node = root_node->children->next->next->next;
  228.     //xmlUnlinkNode(node);
  229.     //xmlFreeNode(node);
  230.     /*xmlRemoveNode(root_node->children, BAD_CAST "newNode3");*/
  231.     
  232.     curnode = root_node->children;
  233.     int i = 0;
  234.     while(curnode != NULL)
  235.        {
  236.            printf("i = [%d]\n", i);
  237.            curnode = curnode->next;
  238.            i++;
  239.        }
  240.     
  241.     printf("******************************************\n");
  242.     //存储xml文件
  243.     char    date[32];
  244.     char    time[32];
  245.     char    filename[128];
  246.     memset(date,0,sizeof(date));
  247.     memset(time,0,sizeof(time));
  248.     memset(filename,0,sizeof(filename));
  249.     printf("111******************************************\n");
  250.     GetDateTime(date,time);
  251.     StrTrim(date);
  252.     StrTrim(time);
  253.     printf("222******************************************\n");
  254.     sprintf(filename, "Created_%s_%s.xml", date, time);
  255.     printf("333******************************************\n");
  256.     /*iRet = xmlSaveFormatFileEnc(filename, doc, "GBK", 1);*/
  257.     /*iRet = xmlSaveFile(filename,doc);*/
  258.     /*iRet = xmlSaveFormatFile(filename, doc, 1);*/
  259.     /*xmlOutputBufferPtr buf;
  260.     iRet = xmlSaveFileTo(buf, doc, "GBK"); */
  261.     /*iRet = xmlSaveFileEnc(filename, doc, "GBK"); */
  262.     iRet = xmlSaveFormatFileEnc(filename, doc, "GB2312", 1);
  263.     if (iRet != -1)
  264.     {
  265.        printf("CreatedXml.xml文件已创建成功\n");
  266.     }
  267.     //释放文件内节点动态申请的内存
  268.     xmlFreeDoc(doc);

  269.     printf("444***************************************************\n");
  270.     
  271.     return 0;
  272. }


  273. /***********************************************************
  274. * 函 数 名:GetDateTime()
  275. * 功能描述: 分别获取系统日期时间
  276. * 输入参数:
  277. *            cDate-日期接收缓冲区;
  278. *            cTime-日期接收缓冲区;
  279. * 输出参数:cDate
  280. * 返 回:0 成功
  281. * 流程描述:
  282. * 说明: 返回日期格式:YYYYMMDD
  283. * 修改记录:
  284. * [修改人] [日期] - [描述]
  285. ***********************************************************/
  286. int    GetDateTime(char * cDate, char * cTime)
  287. {
  288.     struct tm *    cur;
  289.     time_t    timep;

  290.     struct timeb time_msec;
  291.     unsigned short msec;

  292.     time(&timep);
  293.     cur = localtime(&timep);

  294.     ftime(&time_msec);
  295.     msec=time_msec.millitm;

  296.     sprintf(cDate,"%04d%02d%02d",cur->tm_year+1900,cur->tm_mon+1,cur->tm_mday);
  297.     cDate[8]=0;
  298.     sprintf(cTime,"%02d%02d%02d%03d",cur->tm_hour,cur->tm_min,cur->tm_sec,msec);
  299.     cTime[9]=0;

  300.     return 0;
  301. }


  302. int CodeConvert(char* from_charset, char* to_charset, char* inbuf,size_t inlen, char* outbuf, size_t outlen)
  303. {
  304.     iconv_t cd;
  305.     char** pin = &inbuf;
  306.     char** pout = &outbuf;
  307.     cd = iconv_open(to_charset,from_charset);
  308.     if(cd == (iconv_t)-1)
  309.         return -1;
  310.     memset(outbuf,0,outlen);
  311.     if(iconv(cd,(char**)pin,(size_t *)&inlen,(char**)pout,(size_t*)&outlen) == -1)
  312.         return -1;
  313.     iconv_close(cd);
  314.     return 0;
  315. }

  316. /*************************************************************
  317.  * 函 数 名:u2g()
  318.  * 功能描述: UTF-8码转成GBK码
  319.  * 输入参数:inbuf    - 转入字符
  320.  * 输出参数:
  321.  * 返 回:szOut - 成功; NULL - 失败
  322.  * 说 明:成功则返回一个动态分配的char*变量,需要在使用
  323.  *             完毕后手动free,失败返回NULL,使用有风险,调用需谨慎
  324.  ************************************************************/
  325. char* u2g(char *inbuf)
  326. {
  327.     size_t nOutLen = 0;
  328.     char* szOut = NULL;
  329.     if(!strlen(inbuf))
  330.         return NULL;
  331.     nOutLen = 2 * strlen(inbuf) - 1;
  332.     szOut = (char*)malloc(nOutLen);
  333.     if (-1 == CodeConvert("UTF-8","GBK",inbuf,strlen(inbuf),szOut,nOutLen))
  334.     {
  335.         free(szOut);
  336.         szOut = NULL;
  337.     }
  338.     return szOut;
  339. }

  340. /*************************************************************
  341.  * 函 数 名:g2u()
  342.  * 功能描述: GBK码转成UTF-8码
  343.  * 输入参数:inbuf    - 转入字符
  344.  * 输出参数:
  345.  * 返 回:szOut - 成功; NULL - 失败
  346.  * 说 明:成功则返回一个动态分配的char*变量,需要在使用
  347.  *             完毕后手动free,失败返回NULL,使用有风险,调用需谨慎
  348.  ************************************************************/
  349. char* g2u(char *inbuf)
  350. {
  351.     size_t nOutLen = 0;
  352.     char* szOut = NULL;
  353.     if(!strlen(inbuf))
  354.         return NULL;
  355.     nOutLen = 2 * strlen(inbuf) - 1;
  356.     szOut = (char*)malloc(nOutLen);
  357.     if (-1 == CodeConvert("GBK","UTF-8",inbuf,strlen(inbuf),szOut,nOutLen))
  358.     {
  359.         free(szOut);
  360.         szOut = NULL;
  361.     }
  362.     return szOut;
  363. }

  364. /*FmlDataClear 函数功能:清空数据总线函数*/
  365. void FmlDataClear(char *    cFmlData)
  366. {
  367.     cFmlData[0] = 0;
  368. }

  369. /*FmlFieldErase函数:擦除总线数据中的指定域,没有这个域就不擦除*/
  370. void    FmlFieldErase(char *cFmlData, const char *cFieldName,int iIndex)
  371. {
  372.     char    *p, *q;
  373.     if ( ( p = FmlFieldSeek( cFmlData, cFieldName, iIndex ) ) == NULL )
  374.         return; /*p指向指定的域名的起始地址*/
  375.     if ( ( q = strchr( p, SYM_FML_FS ) ) == NULL ) /*SYM_FML_FS:域分割符^^*/
  376.         q = p + strlen( p );
  377.     else
  378.         q ++; /*q指向域尾*/
  379.     strcpy( p, q ); /*p到q之间的被跳过*/
  380. }

  381. /*FmlFieldSeek函数功能:检索总线中指定域函数,返回指定域的起始地址*/
  382. char *FmlFieldSeek(const char *cFmlData, const char *cFieldName,int    iIndex)
  383. {
  384.     char    *p = (char *) cFmlData;
  385.     char    *n, *q, *v;
  386.     int    r;

  387.     while ( ( n = strchr( p, SYM_FML_FS ) ) != NULL )/*SYM_FML_FS:域分割符^^*/
  388.     {    
  389.         *n = 0; /*n指向下一个域分割符^^,并截断*/
  390.         q = strchr( p, SYM_FML_NV ); /*SYM_FML_NV:名值分割符:*/
  391.         *n = SYM_FML_FS; /*恢复域分割符,重新连上总线*/
  392.         if ( q != NULL )
  393.         {
  394.             *q = 0; /*q指向名值分割符:,并截断*/
  395.             if ( ( v = strchr( p, SYM_FML_AN ) ) != NULL ) /*0下标时,v=NULL*/
  396.                 *v = 0; /*v指向数组下标起始符#,并截断*/
  397.             if ( ( r = strcmp( p, cFieldName ) ) == 0 ) /*比较p指向的是不是待检索的域名*/
  398.             {
  399.                 if ( v == NULL && iIndex != FMLFLD_NOTARRAY || v != NULL && atoi( v + 1 ) != iIndex )
  400.                     r = -1; /*对下标值的检查,出错时r=-1*/
  401.             }
  402.             if ( v != NULL )
  403.                 *v = SYM_FML_AN; /*重新连上总线*/
  404.             *q = SYM_FML_NV; /*重新连上总线*/
  405.             if ( r == 0 ) /*域名匹配,下标也正确时,查找完毕*/
  406.                 return p; /*返回域名起始地址*/
  407.         }
  408.         p = n + 1; /*p指向下一个域名起始地址,继续循环查找*/
  409.     }
  410.     return NULL;
  411. }

  412. /*FmlFieldPut() 功能描述: 为总线中指定域赋值函数*/
  413. int    FmlFieldPut(char *cFmlData,int iBufSize,char *cFieldName,int iIndex,char *cFieldValue)
  414. {
  415.     int    s, l;
  416.     char    a[12];

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

  418.     if ( iIndex == FMLFLD_NOTARRAY ) /*FMLFLD_NOTARRAY=0,判断是否是0下标*/
  419.         s = 0; /*0下标时,没有数组下标起始符#,也没有小标值0的显示*/
  420.     else
  421.         s = snprintf( a, sizeof( a ), "%d", iIndex ) + 1; /*下标的长度+#号码长度*/
  422.     if ( ( l = strlen( cFmlData ) ) + strlen( cFieldName ) + s + strlen( cFieldValue ) + 2 > iBufSize )
  423.         return RC_NSPC; /*判断是否溢出,其中2=域分隔符+'\0'*/
  424.     if ( l > 0 && cFmlData[l-1] != SYM_FML_FS ) /*SYM_FML_FS域分割符^^,原串没有域分割符时*/
  425.     {
  426.         cFmlData[l] = SYM_FML_FS; /*原串尾加上域分隔符*/
  427.         l ++; /*原串长+1*/
  428.     }

  429.     if ( s != 0 ) /*非0下标时*/
  430.         /*a中保存的是下标值*/
  431.         sprintf( cFmlData + l, "%s%c%s%c%s%c", cFieldName, SYM_FML_AN, a, SYM_FML_NV, cFieldValue, SYM_FML_FS );
  432.     else /*0下标时*/
  433.         sprintf( cFmlData + l, "%s%c%s%c", cFieldName, SYM_FML_NV,
  434.         cFieldValue, SYM_FML_FS );

  435.     return RC_SUCC;
  436. }

  437. /*FmlFieldGet() 功能描述: 从总线中取指定域值函数*/
  438. int FmlFieldGet(const char *cFmlData,const char *cFieldName,int    iIndex,    char *cFieldValue,int iValueSize)
  439. {
  440.     char    *p, *q, *v;
  441.     int    l;
  442.     
  443.     if ( ( p = FmlFieldSeek( cFmlData, cFieldName, iIndex ) ) == NULL )
  444.         return RC_NFND; /*p指向指定域名的起始地址*/
  445.     q = strchr( p, SYM_FML_NV ) + 1; /*SYM_FML_NV名值分隔符:,q指向域值的起始地址*/
  446.     if ( ( v = strchr( q, SYM_FML_FS ) ) == NULL ) /*SYM_FML_FS域分隔符^^,v指向域值的尾部地址*/
  447.         l = strlen( q ); /*没有串尾符^^的长度*/
  448.     else
  449.         l = v - q; /*l=域值的长度*/
  450.     if ( l >= iValueSize ) /*要放域值的空间不能小于域值的长度*/
  451.         return RC_NSPC;
  452.     memcpy( cFieldValue, q, l );
  453.     cFieldValue[l] = 0; /*域值的地址加字符串的结束符*/
  454.     return RC_SUCC;
  455. }

  456. /*FmlFieldNum() 功能描述: 统计总线中重复域的个数函数*/
  457. int    FmlFieldNum(const char *cFmlData, const char *cFieldName, int *iNum)
  458. {
  459.     char    *p = (char *) cFmlData;
  460.     char    *n, *q, *v;
  461.     int    r;
  462.     int    num,flag;

  463.     num=0;
  464.     flag=0;

  465.     while ( ( n = strchr( p, SYM_FML_FS ) ) != NULL )
  466.     {
  467.         *n = 0;
  468.         q = strchr( p, SYM_FML_NV );
  469.         *n = SYM_FML_FS;
  470.         if ( q != NULL )
  471.         {
  472.             *q = 0;
  473.             if ( ( v = strchr( p, SYM_FML_AN ) ) != NULL )
  474.                 *v = 0;
  475.             else
  476.             {
  477.                 *iNum=0;
  478.                 if( v != NULL)
  479.                     *v=SYM_FML_AN;
  480.                 *q=SYM_FML_NV;
  481.                 p = n + 1;
  482.                 continue;
  483.             }
  484.             if ( ( r = strcmp( p, cFieldName ) ) == 0 )
  485.             {
  486.                 num++;
  487.                 flag=1;
  488.             }
  489.                 *v=SYM_FML_AN;
  490.                 *q=SYM_FML_NV;
  491.         }
  492.         p = n + 1;
  493.     }
  494.     *iNum=num;
  495.     if(flag == 1)
  496.         return RC_SUCC;
  497.     else
  498.         return RC_NFND;
  499. }

  500. char * StrTrim(char * pstr)
  501. {
  502.     if(NULL == pstr)
  503.     {
  504.         return NULL;
  505.     }
  506.     char * phead = pstr;
  507.     char * ptail = pstr + strlen(pstr) - 1;
  508.     while((*phead == ' ')&&(phead < ptail)) phead++;
  509.     while((*ptail == ' ')&&(ptail > phead)) ptail--;
  510.     *(ptail + 1) = '\0';
  511.     memcpy(pstr, phead, sizeof(char)*(ptail - phead + 2));
  512.     return pstr;
  513. }
创建的XML文件示例

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <root>
  3.   <newNode1>java</newNode1>
  4.   <newNode2>zqp123_wangxiancai456</newNode2>
  5.   <program_language>QT</program_language>
  6.   <newNode4 name="zqp******">java_xyz</newNode4>
  7.   <newNode5 date="20130604" name="zqp******">
  8.     <小儿子 姓名="wxc">
  9.       <孙子>c++语言</孙子>
  10.     </小儿子>
  11.     <大儿子>大儿子叫什么啊?</大儿子>
  12.   </newNode5>
  13.   <newNode_y/>
  14.   <newNode5 date="20130604" name="zqp******">
  15.     <小儿子 姓名="wxc">
  16.       <孙子>c++语言</孙子>
  17.     </小儿子>
  18.     <大儿子>大儿子叫什么啊?</大儿子>
  19.   </newNode5>
  20.   <newNode_x/>
  21.   <节点7 大学名称="hbkj"/>
  22. </root>

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