C读取XML配置文件开源项目SCEW

本文介绍了一个名为SCEW的C语言开源项目,该库专门用于读取和处理XML配置文件。通过提供的INSTALL指南,用户可以了解如何安装和在自己的项目中集成这个库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 SCEW的目的是提供在XML围绕一个简单的接口
Expat解析器,以及用于创建新的XML的简单接口
文档。它提供的功能来加载和访问XML元素
而不需要每次都创建外籍​​事件处理例程
要加载一个新的XML文档。

这些是主要的SCEW特点:

    
- 使用新的或解析XML文档的DOM样的对象模型。
    
- 支持级联加载XML文档。
    
- 可以复制和比较完整的XML文档,元素或属性。
    
- 写XML文档到多个输出。
    
- 允许轻松添加新的I / O资源。
    
- UTF-8,ISO-8859-1和US-ASCII编码(和UTF-16在Windows中)。

项目主页:http://www.nongnu.org/scew/

SCEW是自由软件[0]。请参阅文件COPYING获取详细信息。

对于安装说明,请参阅INSTALL文件。

例子:

S32 Mp2pCfgInfoGet(Mp2pStackObj *pMp2pStackObj)
{
    FILE *cfgFileHandle = NULL;
    S8  getXMLStr[MAX_CFG_INFO_XML_LEN]={0};
    S32 getXmlStrLen = -1;


    /////////////////////////////////////////////////////////
    scew_parser     *pXmlParser = NULL;         /*XML������*/
    scew_tree       *pNewXmlTree = NULL;        /*XML��*/
    scew_element    *root = NULL;
    scew_element    *elementLevelOne = NULL;

    XML_Char const  *name = NULL;
    XML_Char const  *contents = NULL;


    ///////////////////////////////////////////////////////////////

    //��ȡ�����ļ�
    cfgFileHandle = fopen("../../comm/Mp2pConfig.xml" , "r+");
    if(NULL == cfgFileHandle)
    {
        LOG_INFO(MOD_MP2P, "no config file: ../../comm/Mp2pConfig.xml\n");
        RETVALUE(RERROR);
    }

    getXmlStrLen = fread(getXMLStr , 1 , MAX_CFG_INFO_XML_LEN , cfgFileHandle);
    if (getXmlStrLen < 12)
    {
        LOG_ERR(MOD_MP2P, "No config information in ../../comm/Mp2pConfig.xml. err: %s\r\n", strerror(errno));
        goto errFileRead;
    }
    

    /*����XML������*/
    pXmlParser = scew_parser_create();
    if (NULL == pXmlParser)
    {
        LOG_ERR(MOD_MP2P, "parser create failed.\r\n");
        goto errParseCreate;
    }
    scew_parser_ignore_whitespaces(pXmlParser, 1);

    /*װ��XML��*/
    if (!scew_parser_load_buffer(pXmlParser, getXMLStr, getXmlStrLen))
    {
        LOG_ERR(MOD_MP2P, "xml string load failed. getXmlStrLen:%d\r\n", getXmlStrLen);
        goto errLoadXmlStr;
    }

    /*����XML��*/
    scew_parser_ignore_whitespaces(pXmlParser, 1);
    pNewXmlTree = scew_parser_tree(pXmlParser);
    if(NULL == pNewXmlTree)
    {
        LOG_ERR(MOD_MP2P, "xml string parse failed.\r\n");
        goto errParseTree;
    }   

    //�������ڵ�    
    root = scew_tree_root(pNewXmlTree);
    if (NULL == root)
    {
        LOG_ERR(MOD_MP2P, "no root node.\r\n");
        goto errParseElement;
    }   

    elementLevelOne = scew_element_next(root , elementLevelOne);
    while (NULL != elementLevelOne)
    {
        name = scew_element_name(elementLevelOne);
        contents = scew_element_contents(elementLevelOne);
        if(0 == strcmp(name , "HA"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_HA] = atoi(contents);
        }
        else if(0 == strcmp(name , "ICMS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_ICMS] = atoi(contents);
        }
        else if(0 == strcmp(name , "NM"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_NM] = atoi(contents);
        }
        else if(0 == strcmp(name , "CTC"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_CTC] = atoi(contents);
        }
        else if(0 == strcmp(name , "CTL"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_CTL] = atoi(contents);
        }
        else if(0 == strcmp(name , "MSN"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_SMS] = atoi(contents);
        }
        else if(0 == strcmp(name , "GSLB"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_GSLB] = atoi(contents);
        }
        else if(0 == strcmp(name , "VCC"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_VCC] = atoi(contents);
        }
        else if(0 == strcmp(name , "HLC"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_HLC] = atoi(contents);
        }
        else if(0 == strcmp(name , "HLS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_HLS] = atoi(contents);
        }
        else if(0 == strcmp(name , "OCMS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_OCMS] = atoi(contents);
        }
        else if(0 == strcmp(name , "ONM"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_ONM] = atoi(contents);
        }
        else if(0 == strcmp(name , "OMS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_OMS] = atoi(contents);
        }
        else if(0 == strcmp(name , "FLC"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_FLC] = atoi(contents);
        }
        else if(0 == strcmp(name , "FLS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_FLS] = atoi(contents);
        }
        else if(0 == strcmp(name , "LTS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_LTS] = atoi(contents);
        }
        else if(0 == strcmp(name , "HTS"))
        {
            pMp2pStackObj->m_sModDefaultSrvPort[MOD_CDN_HTS] = atoi(contents);
        }
        else
        {
            LOG_ERR(MOD_MP2P, "unkown element name %s\n", name);
        } 

       //read next element
        elementLevelOne = scew_element_next(root , elementLevelOne);
    }
    
    /*�ͷ�XML��*/
    scew_tree_free(pNewXmlTree);
    pNewXmlTree =  NULL;

    /*�ͷ�XML������*/
    scew_parser_free(pXmlParser);
    pXmlParser = NULL;

    /*�ر����ݿ�����*/
    if(NULL != cfgFileHandle)
    {
        fclose(cfgFileHandle);
        cfgFileHandle = NULL;
    }   

    RETVALUE(ROK);


errParseElement:        
    scew_tree_free(pNewXmlTree);

errParseTree:       
errLoadXmlStr:
    scew_parser_free(pXmlParser);

errParseCreate:
errFileRead:
    if(NULL != cfgFileHandle)
    {
        fclose(cfgFileHandle);
        cfgFileHandle = NULL;
    }

    RETVALUE(RERROR);
}


纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值