问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-24 20:19

我来回答

2个回答

热心网友 时间:2022-04-24 21:48

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

热心网友 时间:2022-04-24 23:06

可以试试libxml追问使用了libxml2 解析做好了 但是xml所有内容保存在哪了

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
注册保险代理有限公司需要什么资料! 现在什么云手机性价比高一点? 50个可接双宾语的动词 为琵琶独奏曲《春江花月夜》配一首词或诗 我经常看到HI语音里会有什么魅力榜、贡献榜这些排名,我也一直在语音直播... 跨行通怎么激活 父母是农民不知道有没有纳税 普通农民可以算纳税人吗? 农民不交农业税了,是不是纳税人? 小红书上女生缺衣服穿的心情说说四十句 忘记密码了,手机号也不用了,怎么取消实名认证 怎么可以注销掉电话号码注册的没实名的? 怎么可以注销掉电话号码注册的没实名的? 什么大摆空城计一化险为夷 填人名:( )大摆空城计——化险为夷 孔明大摆空城计后面是什么 1、( )大摆空城计——化险为夷。 合肥哪里有卖二手课桌椅的 哪里有课桌椅? 什么大摆空城计,化险为夷。 怀化哪里有学校课桌椅卖呢? (?)大摆空城计一一化险为夷 ( )大摆空城计? 在哪可以买到这种桌子? 谁大摆空城计? 什么大摆空城计,化险为夷 哪里有卖小桌子(北京市 海淀区哦) 孔明摆空城计的歇后语是什么? 合肥哪里有卖学生课桌椅的? 微信已实名 限制登录如何注销? 怎样注销名下不用的 德国火车预定后如何取票 求极品透视神医精校版全本小说txt 《最强透视神医》txt下载在线阅读全文,求百度网盘云资源 被盗了怎么注销实名认证? 那部小说女主叫洛晓白,男主叫冷锋,重生文。 购买欧洲通票以后一定要在坐火车的那个火车站预定吗?还是随便那个火车站都可以呢? 透视神医广播剧mp3在线收听,求有声书百度网盘资源 如何购买德国巴符州火车票? 求飞天医生的透视神医txt 4米30厘米写作多少米怎么写 谢谢你回答“德国火车票预定的问题” 我还想问一下 要是现在预定 到时候误点了赶不上火车能 火车票能改时 4米十30厘米=()厘米 4米30厘米十多少厘米等于5米 以前的忘了,怎么注销实名认证 4米30厘米减3米等于多少米多少厘米多少厘米 长4米宽30厘米高30厘米等于几个方 4米,400豪米。30分米,30厘米从大到小安顺序排列 300毫米,4米,30分米,20厘米多大到小 忘记密码了,手机号也不用了,怎么取消实名认证