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
- libxml2 解析xml字符串
- libxml2如何解析xml格式的字符串
- libxml2如何解析xml格式的字符串
- 使用Libxml2解析xml
- libxml2解析XML
- libxml2-xml 解析
- libxml2解析xml
- libxml2解析xml总结
- IPhone开发中,用libxml2解析xml字符串
- libxml2 xmlTextReader 解析xml实例
- libxml2解析xml文件记录
- linux下 libxml2 xml解析
- 采用libxml2解析xml资源
- xml 解析,libxml2的使用
- 如何使用libxml2解析xml
- [libxml2]小心libxml2解析含有中文字符串时的误解
- [Linux C]利用libxml2解析xml文件
- 使用libxml2读取文件解析xml
- 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
- Android 获取本机IP、Mac、名称
- 树莓派Raspbian系统启用ROOT用户
- html手机端禁止放大缩小
- 不开心的时候,看看
- libxml2 解析xml字符串
- 206. Reverse Linked List
- Manacher 算法模板
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener错误
- why-not 和 why 问题简介
- lintcode——栅栏染色
- JDBC编程六步曲
- Head First Python学习总结
- Assign Cookies