c语言如何解析xml并将所有内容存入数组

Python019

c语言如何解析xml并将所有内容存入数组,第1张

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

 *  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>

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

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

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

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

我上次才给人写过

xml文件内容

<?xml version="1.0" encoding="UTF-8" ?>

- <aicomoa_response>

- <country_list>

- <country>

<id>7</id>

<pid>0</pid>

<continent_id>1</continent_id>

<guohao>93</guohao>

<cntitle>阿富汗</cntitle>

<entitle>Afghanistan</entitle>

<hztitle>阿富汗</hztitle>

<jptitle>アフガニスタン</jptitle>

<kotitle>??????</kotitle>

<jp_pinyin>ア</jp_pinyin>

<pinyin>AFuHan</pinyin>

<sid>0</sid>

<jibie>1</jibie>

</country>

- <country>

<id>8</id>

<pid>0</pid>

<continent_id>2</continent_id>

<guohao>355</guohao>

<cntitle>阿尔巴尼亚</cntitle>

<entitle>Albania</entitle>

<hztitle>阿尔巴尼亚</hztitle>

<jptitle>アルバニア</jptitle>

<kotitle />

<jp_pinyin>ア</jp_pinyin>

<pinyin>AErBaNiYa</pinyin>

<sid>0</sid>

<jibie>1</jibie>

</country>

</country_list>

</aicomoa_response>

运行结果

Info[0]=[id:7|pid:0|continent_id:1|guohao:93|cntitle:阿富汗|entitle:Afghanistan|

hztitle:阿富汗|jptitle:アフガニスタン|kotitle:??????|jp_pinyin:ア|pinyin:AFuHan|

sid:0|jibie:1|]

Info[1]=[id:7|pid:0|continent_id:1|guohao:93|cntitle:阿富汗|entitle:Afghanistan|

hztitle:阿富汗|jptitle:アフガニスタン|kotitle:??????|jp_pinyin:ア|pinyin:AFuHan|

sid:0|jibie:1|]

Press any key to continue

代码

#include <stdio.h>

#include <string.h>

main()

{

int i=0

FILE *fp

char szFileBuff[1024] = {0}, szBuff[100][1024]

char id[10] = {0}, pid[10] = {0}, continent_id[10] = {0}, guohao[10] = {0},

cntitle[64]= {0},entitle[64]= {0},hztitle[64] = {0},jptitle[64] = {0},

kotitle[64] = {0},jp_pinyin[64] = {0}, pinyin[64] = {0},sid[10] = {0},jibie[10] = {0}

char *lFirst, *lEnd

fp = fopen("country.txt","r")

if (fp==NULL)

{

printf("read XML file error!\n")

}

while(fgets(szFileBuff, 1023, fp))

{

if ((lFirst = strstr(szFileBuff, "<id>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</id>")

memcpy(id, lFirst + 4, lEnd - lFirst - 4)

}

if ((lFirst = strstr(szFileBuff, "<pid>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</pid>")

memcpy(pid, lFirst + 5, lEnd - lFirst - 5)

}

if ((lFirst = strstr(szFileBuff, "<continent_id>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</continent_id>")

memcpy(continent_id, lFirst + 14, lEnd - lFirst - 14)

}

if ((lFirst = strstr(szFileBuff, "<guohao>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</guohao>")

memcpy(guohao, lFirst + 8, lEnd - lFirst - 8)

}

if ((lFirst = strstr(szFileBuff, "<cntitle>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</cntitle>")

memcpy(cntitle, lFirst + 9, lEnd - lFirst - 9)

}

if ((lFirst = strstr(szFileBuff, "<entitle>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</entitle>")

memcpy(entitle, lFirst + 9, lEnd - lFirst - 9)

}

if ((lFirst = strstr(szFileBuff, "<hztitle>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</hztitle>")

memcpy(hztitle, lFirst + 9, lEnd - lFirst - 9)

}

if ((lFirst = strstr(szFileBuff, "<jptitle>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</jptitle>")

memcpy(jptitle, lFirst + 9, lEnd - lFirst - 9)

}

if ((lFirst = strstr(szFileBuff, "<kotitle>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</kotitle>")

memcpy(kotitle, lFirst + 9, lEnd - lFirst - 9)

}

if ((lFirst = strstr(szFileBuff, "<jp_pinyin>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</jp_pinyin>")

memcpy(jp_pinyin, lFirst + 11, lEnd - lFirst - 11)

}

if ((lFirst = strstr(szFileBuff, "<pinyin>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</pinyin>")

memcpy(pinyin, lFirst + 8, lEnd - lFirst - 8)

}

if ((lFirst = strstr(szFileBuff, "<sid>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</sid>")

memcpy(sid, lFirst + 5, lEnd - lFirst - 5)

}

if ((lFirst = strstr(szFileBuff, "<jibie>")) != NULL)

{

lEnd = strstr(lFirst + 1, "</jibie>")

memcpy(jibie, lFirst + 7, lEnd - lFirst - 7)

}

if ((lFirst = strstr(szFileBuff, "</country>")) != NULL)

{

sprintf(szBuff[i],"id:%s|pid:%s|continent_id:%s|guohao:%s|cntitle:%s|entitle:%s|hztitle:%s|jptitle:%s|kotitle:%s|jp_pinyin:%s|pinyin:%s|sid:%s|jibie:%s|",

id,pid,continent_id,guohao,cntitle,entitle,hztitle,jptitle,kotitle,jp_pinyin, pinyin,sid,jibie)

printf("Info[%d]=[%s]\n",i++, szBuff)

}

}

fclose(fp)

}

补充:你这个就说得太笼统了,

1 你上传的xml文件具体格式是什么?

2 要在网页上显示的具体格式是什么

3 你根本不知道怎么做 所以也不知道怎么问

我不用关心你的c语言的cgi吧?我才不管是用什么上传的

只有你说的嵌入式三个字 给我一点有用信息 就是解析这个xml用插件恐怕是不行

只能C语言

4 我现在只要求你的xml文件格式和 网页上要显示哪些xml中解析出来的信息

只要知道这些 我只需要在我的程序上加上生成html文件就行了