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

2025-03-27 07:35:11
推荐回答(2个)
回答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;
}


    
        1
        kmh
        字段1
        VARCHAR(11)
    

    
        2
        dfkmh
        字段2
        VARCHAR(11)
    

    
        3
        hbh
        字段3
        INTEGER(10)
    

回答2:

可以试试libxml