C语言xml解析

Python017

C语言xml解析,第1张

把所有的数据当做一个字符串

收到数据后先strstr(buffer,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>")

如果返回的是NULL则表示没有这段 退出

buffer是你收到的数据起始地址

/* 前段时间恰好做过类似的东西,代码可以给你参考下。

 *  Xml配置见最后

 */

typedef struct SrcFileFmt

{

    int   ColID

    char  ColCode[64]      /* 字段英文名称 */

    char  ColName[128]     /* 字段中文名称*/

    char  ColType[20]      /* 字段类型(包含长度) */

    char  ColComment[128]  /* 字段描述 */

}SrcFileFmt

int main(int argc, char **argv)

{

    SrcFileFmt SrcFileFmt[128]

    int iNum = -1

    if ( 2 > argc )

    {

        printf("Usage: %s SrcXmlFile\n", argv[0])

        return -1

    }

    iNum = parseSourceCfg(SrcCfgFile, SrcFileFmt)

    if (iNum == -1)

    {

        return -1

    }

    return 0

}

/* 调用此函数后,xml文件的内容会被存储到结构体数组SrcFileFmt srcfilefmt[]中

 * 此函数依赖于libxml2-2.9.2.tar.xz

 */

int parseSourceCfg(char *FileName, SrcFileFmt srcfilefmt[])

{ /* 解析源文件xml,FileName 为源xml文件名 */

    xmlDocPtr doc

    xmlNodePtr cur, root

    char sFileName[64] = {'\0'}

    int cnt = 0

    if (FileName == NULL)

    {

        return -1

    }

    sprintf(sFileName, "%s.xml", FileName)

    doc = xmlParseFile(sFileName)

    if (doc == NULL)

    {

        return -1

    }

    root = xmlDocGetRootElement(doc)

    if (root == NULL) {

        xmlFreeDoc(doc)

        return(-1)

    }

    if (xmlStrcmp(root->name, (const xmlChar *) "SrcRoot"))

    {

        xmlFreeDoc(doc)

        return -1

    }

    

    cur = root->xmlChildrenNode

    while (cur != NULL) 

    {

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

        {

            xmlChar *key

            xmlNodePtr cur_sub = cur

            cur_sub = cur_sub->xmlChildrenNode

            while (cur_sub != NULL) 

            {

                if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColID"))) {

                    key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1)

                    killblank((char*)key)

                    srcfilefmt[cnt].ColID = atoi((char*)key)

                    xmlFree(key)

                }

                if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColCode"))) {

                    key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1)

                    killblank((char*)key)

                    strcpy(srcfilefmt[cnt].ColCode, (char*)key)

                    xmlFree(key)

                }

                else if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColName"))) {

                    key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1)

                    killblank((char*)key)

                    strcpy(srcfilefmt[cnt].ColName, (char*)key)

                    xmlFree(key)

                }

                else if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColType"))) {

                    key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1)

                     killblank((char*)key)

                    strcpy(srcfilefmt[cnt].ColType, (char*)key)

                    xmlFree(key)

                }

                else if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColComment"))) {

                    key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1)

                    killblank((char*)key)

                    strcpy(srcfilefmt[cnt].ColComment, (char*)key)

                    xmlFree(key)

                }

                cur_sub = cur_sub->next

            }

            cnt++

        }

        cur = cur->next

    }

    xmlFreeDoc(doc) 

    return cnt

}

<SrcRoot>

    <Column>

        <ColID>1</ColID>

        <ColCode>kmh</ColCode>

        <ColName>字段1</ColName>

        <ColType>VARCHAR(11)</ColType>

    </Column>

    <Column>

        <ColID>2</ColID>

        <ColCode>dfkmh</ColCode>

        <ColName>字段2</ColName>

        <ColType>VARCHAR(11)</ColType>

    </Column>

    <Column>

        <ColID>3</ColID>

        <ColCode>hbh</ColCode>

        <ColName>字段3</ColName>

        <ColType>INTEGER(10)</ColType>

    </Column>

</SrcRoot>