libxml2 解析xml字符串

来源:互联网 发布:优酷视频会员淘宝骗局 编辑:程序博客网 时间:2024/05/04 13:17

最近在封装一个sdk接口给内部使用的时候,原来项目都是用c++开发的,xml解析工具用的是:Tinyxml,挺不错,至少不用考虑内存释放问题。这也是c++资源管理的好处。。。

因为提供的是c的接口,所以tinyxml显然不能用了。后面就想到用libxml2,因为他用C语言开发的。网上想找现成的,结果发现都是解析文件的,记录一下解析xml字符串的过程吧,主要是内存的管理小心一点就OK了:

xmlNodePtr GetNextXmlNode(xmlNodePtr pstXmlNode){    pstXmlNode = pstXmlNode->next;    while(pstXmlNode)    {        if (XML_ELEMENT_NODE == pstXmlNode->type)        {            return pstXmlNode;        }        pstXmlNode = pstXmlNode->next;     } }xmlNodePtr GetChildrenXmlNode(xmlNodePtr pstXmlNode){    pstXmlNode = pstXmlNode->children;    while(pstXmlNode)    {        if (XML_ELEMENT_NODE == pstXmlNode->type)        {            return pstXmlNode;        }        pstXmlNode = pstXmlNode->next;     }}

static int ParseAppReqMsg(char *pszPayload , APP_RES_INFO *pstResInfo){     if ((NULL == pstAppResInfo) || (NULL == pszRecvMsg)){        return -1;}    int nXmlSize = 0;     nXmlSize = strlen(pszPayload);    xmlDocPtr pstXmlDoc = NULL;    xmlNodePtr pstXmlNode = NULL;    xmlNodePtr pstXmlSubNode = NULL;    char *pszXmlNodeContent = NULL;    pstXmlDoc = xmlParseMemory(pszPayload, nXmlSize);    if (!pstXmlDoc)    {        printf("%s_%d: xmlParseMemory failed ,the xml is: %s", _LOG_TRACE_, pszPayload);        return -1;    }    pstXmlNode = xmlDocGetRootElement(pstXmlDoc);    if(!pstXmlNode)    {        xmlFreeDoc(pstXmlDoc);        printf("%s_%d: xmlDocGetRootElement failed .", _LOG_TRACE_);        return -1;    }    pstXmlSubNode = GetChildrenXmlNode(pstXmlNode);    while(NULL != pstXmlSubNode)    {        pszXmlNodeContent = (char *)xmlNodeGetContent(pstXmlSubNode);        if (0 == xmlStrncmp(pstXmlSubNode->name,XML_NODE_NAME_MSG_TYPE,sizeof(XML_NODE_NAME_MSG_TYPE)))        {            //to do 判断是否为:UpdateDevConf,目前暂不处理        }        else if (0 == xmlStrncmp(pstXmlSubNode->name,XML_NODE_NAME_MSG_PROTOCAL,sizeof(XML_NODE_NAME_MSG_PROTOCAL)))        {            //to do 判断是否为:1.0版本,目前暂不处理        }        else if (0 == xmlStrncmp(pstXmlSubNode->name,XML_NODE_NAME_MSG_PARAM,sizeof(XML_NODE_NAME_MSG_PARAM)))        {            char *pszXmlParamsContent = NULL;             xmlNodePtr pstXmlSubParamsNode = NULL;            pstXmlSubParamsNode = GetChildrenXmlNode(pstXmlSubNode);            while(NULL != pstXmlSubParamsNode)            {                pszXmlParamsContent = (char *)xmlNodeGetContent(pstXmlSubParamsNode);                if (0 == xmlStrncmp(pstXmlSubNode->name,XML_NODE_NAME_MSG_PARAM_APP_NO,sizeof(XML_NODE_NAME_MSG_PARAM_APP_NO)))                {                    strncpy(pstResInfo->szAppNo, pszXmlParamsContent, APP_NO_SIZE -1);                    pstResInfo->szAppNo[APP_NO_SIZE -1] = 0;                }                else if (0 == xmlStrncmp(pstXmlSubNode->name,XML_NODE_NAME_MSG_PARAM_CONFIGURL,sizeof(XML_NODE_NAME_MSG_PARAM_CONFIGURL)))                {                    strncpy(pstResInfo->szConfigUrl, pszXmlParamsContent, URL_SIZE -1);                    pstResInfo->szAppNo[URL_SIZE -1] = 0;                }                else if (0 == xmlStrncmp(pstXmlSubNode->name,XML_NODE_NAME_MSG_PARAM_CONFIGMD5,sizeof(XML_NODE_NAME_MSG_PARAM_CONFIGMD5)))                {                    strncpy(pstResInfo->szConfigMd5, pszXmlParamsContent, MD5_SIZE -1);                    pstResInfo->szAppNo[MD5_SIZE -1] = 0;                }                                xmlFree(pszXmlParamsContent);                pszXmlParamsContent = NULL;                pstXmlSubParamsNode = GetNextXmlNode(pstXmlSubParamsNode);                            }        }                xmlFree(pszXmlNodeContent);        pszXmlNodeContent= NULL;        pstXmlSubNode = GetNextXmlNode(pstXmlSubNode);            }    xmlFreeDoc(pstXmlDoc);return 0;}


0 0
原创粉丝点击