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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言如何解析xml并将所有内容存入数组相关的知识,希望对你有一定的参考价值。

/* 前段时间恰好做过类似的东西,代码可以给你参考下。
 *  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>
参考技术A 可以试试libxml追问

使用了libxml2 解析做好了 但是xml所有内容保存在哪了

追答

你可以看文档,也可以试一下这个网页:
http://www.cnblogs.com/shanzhizi/archive/2012/07/09/2583739.html
或者试试这个:
http://www.cnblogs.com/Anker/p/3542058.html

怎么用c语言解析xml文件

嵌入式用c语言写个cgi 然后通过网页上传xml文件 最后将上传的xml文件解析出来显示在网页上

我上次才给人写过
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文件就行了追问

就是上传.xml格式的文件 在html上显示.xml文件的内容

追答

看来你真不懂

我上面贴的你看懂了么?

我问的是你xml文件里内容的格式

如果不明白 能不能把你的xml文件给我发一份

我写个程序 保证你一运行就能生成一个带有xml中信息的html文件

追问



content of node 1
node has attributes
other way to create content

追答

第一 xml文件你没贴完整,所以文件格式不完整

第二 你的html网页上要显示xml中的哪些节点内容

其实我上面贴的例子已经很明显了

也是先贴了xml文件内容

然后贴了 提取出来的内容

再下面是代码 你这个只不过是要把显示的写入html文件而已

追问

先写个网页用post的方法把xml文件上传到arm上的web服务器上然后服务器返回xml文件的内容,上传文件的网页好些,但是cgi怎么写才能将xml文件的内容解析出来??哥们我说明白吗??

追答

我明白 我就没考虑怎么做那个上传

我现在就是妖你xml的完整内容格式 你明白么?

把xml全贴上来 或者发给我

我也不问你要html显示什么了

我把我抓出来的都用表格显示好了

话说你有Q么? 这样说很累

参考技术A 推荐使用libxml2,专门解析xml文件的opensource library 参考技术B 直接打开 支持的

以上是关于c语言如何解析xml并将所有内容存入数组的主要内容,如果未能解决你的问题,请参考以下文章

在linux上用c语言进行xml解析

c解析xml文件

php解析xml,并将xml转换为层级数组

c#解析XML字符串

C语言 如何读取xml文件中的数据并存入一个结构体中

groovy怎么解析xml文件