【C++】使用libxml解析XML文件

1.     构建xmlDocPtr对象,xmlParseMemory(str,str.len) 字符串转为XML文档 , 从文件读取内容构建xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER)

2.     xmlDocGetRootElement(),获取XML文档根节点

3.     xmlStrcmp,比较XML字符串,与strcmp差不多 ,

4.     curr = curr->xmlChildrenNode,XML节点指针指向第一个子节点;curr->properties 节点属性

5.     curr = curr->next,XML节点指针指向下一个兄弟节点

6.     xmlNodeGetContent,获取XML节点的内容;xmlGetProp获取属性

7.     xmlFreeDoc,释放节点,与free差不多




OpenCV中使用FileStorage创建和解析XML文件。但FileStorage不能处理节点为空的情况,且对属性也不友好。例子见这里

libxml是C接口的处理xml文件的开源代码库。可以在这里下载。

对于一段如下的xml文件:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0"?>  
  2. <Message Version="1.0">  
  3.   <Info evaluateType="2" mediaFile="1.avi">1</Info>  
  4.   <Items>  
  5.     <Item frameNum="0" scale="2" />  
  6.     <Item frameNum="1" scale="2" />  
  7.     <Item frameNum="2" scale="2" />  
  8.     <Item frameNum="2913" scale="2">  
  9.       <Label type="2" l="564" t="178" r="594" b="280" id="15" />  
  10.       <Label type="2" l="528" t="184" r="560" b="288" id="11" />  
  11.       <Label type="2" l="490" t="182" r="522" b="288" id="16" />  
  12.       <Label type="2" l="614" t="358" r="704" b="600" id="4" />  
  13.     </Item>  
  14.   </Items>  
  15. </Message>  
  16.     

libxml处理的函数如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. string getLabes(char *szDocName, map<pair<int,int>,Rect > &labels){  
  2.     xmlDocPtr doc;            
  3.     xmlNodePtr curNode;        
  4.     xmlChar *szKey;            
  5.     string filename="";  
  6.   
  7.     doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER); //解析文件  
  8.   
  9.     if (doc==NULL){    
  10.         fprintf(stderr,"Document not parsed successfully.\n");       
  11.         return filename;   
  12.   
  13.     }   
  14.   
  15.     curNode = xmlDocGetRootElement(doc); //确定文档根元素  
  16.     if (NULL == curNode){   
  17.         fprintf(stderr,"empty document\n");  
  18.         xmlFreeDoc(doc);   
  19.         return filename;   
  20.     }   
  21.   
  22.     if (xmlStrcmp(curNode->name, BAD_CAST "Message")) {  
  23.         fprintf(stderr,"document of the wrong type, root node != Message");   
  24.         xmlFreeDoc(doc);  
  25.         return filename;   
  26.     }   
  27.   
  28.     curNode = curNode->xmlChildrenNode;  
  29.     xmlNodePtr propNodePtr = curNode;  
  30.     xmlNodePtr itemNodePtr;    
  31.   
  32.     while(curNode != NULL){  
  33.         //取出文件名称  
  34.         if (xmlHasProp(curNode,BAD_CAST "mediaFile")) {  
  35.             propNodePtr = curNode;  
  36.   
  37.         }   
  38.         if (!xmlStrcmp(curNode->name, BAD_CAST "Items")) {  
  39.             itemNodePtr = curNode->xmlChildrenNode;  
  40.         }   
  41.         curNode = curNode->next;  
  42.     }  
  43.   
  44.     xmlAttrPtr attrPtr = propNodePtr->properties;  
  45.     while (attrPtr != NULL){  
  46.         if (!xmlStrcmp(attrPtr->name, BAD_CAST "mediaFile")){  
  47.             xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "mediaFile");  
  48.             char* szAttrG = u2g((char*)szAttr);  
  49.             filename = string(szAttrG);  
  50.             //cout<<"get filename: "<<filename<<endl;  
  51.             xmlFree(szAttr);  
  52.         }  
  53.         attrPtr = attrPtr->next;  
  54.     }  
  55.   
  56.     // Item  
  57.     while (itemNodePtr != NULL){  
  58.         int frameNum = 0;  
  59.         int peopleID = 0;  
  60.         Rect rect;  
  61.   
  62.         //<Label type="2" l="620" t="164" r="648" b="234" id="15" />  
  63.         xmlAttrPtr attrPtr = itemNodePtr->properties;  
  64.         while (attrPtr != NULL){  
  65.             if (!xmlStrcmp(attrPtr->name, BAD_CAST "frameNum")){  
  66.                 xmlChar* szAttr = xmlGetProp(itemNodePtr,BAD_CAST "frameNum");  
  67.                 frameNum = atoi((char*)szAttr);  
  68.                 //cout<<"get frameNum: "<<frameNum<<endl;  
  69.                 xmlFree(szAttr);  
  70.             }  
  71.             attrPtr = attrPtr->next;  
  72.         }  
  73.   
  74.         // Label  
  75.         xmlNodePtr childNodePtr = itemNodePtr->xmlChildrenNode;  
  76.         while (childNodePtr != NULL){  
  77.             int l=0,t=0,r=0,b=0;  
  78.             attrPtr = childNodePtr->properties;   
  79.             while(attrPtr != NULL){  
  80.                 if (!xmlStrcmp(attrPtr->name, BAD_CAST "l")){  
  81.                     xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "l");  
  82.                     l=atoi((char*)szAttr);  
  83.                     xmlFree(szAttr);  
  84.                 }  
  85.                 if (!xmlStrcmp(attrPtr->name, BAD_CAST "t")){  
  86.                     xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "t");  
  87.                     t=atoi((char*)szAttr);  
  88.                     xmlFree(szAttr);  
  89.                 }  
  90.                 if (!xmlStrcmp(attrPtr->name, BAD_CAST "r")){  
  91.                     xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "r");  
  92.                     r=atoi((char*)szAttr);  
  93.                     xmlFree(szAttr);  
  94.                 }  
  95.                 if (!xmlStrcmp(attrPtr->name, BAD_CAST "b")){  
  96.                     xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "b");  
  97.                     b=atoi((char*)szAttr);  
  98.                     xmlFree(szAttr);  
  99.                 }  
  100.                 if (!xmlStrcmp(attrPtr->name, BAD_CAST "id")){  
  101.                     xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "id");  
  102.                     peopleID=atoi((char*)szAttr);  
  103.                     xmlFree(szAttr);  
  104.                 }  
  105.                 attrPtr = attrPtr->next;  
  106.             }  
  107.             if(!(l==0&&t==0&&b==0&&r==0)){  
  108.                 rect.x=l;rect.y=t;rect.width=r-l;rect.height=b-t;  
  109.                 labels[pair<int,int>(frameNum,peopleID)] = rect;  
  110.                 //cout<<"get label: "<<l<<" "<<t<<" "<<r<<" "<<b<<" "<<" "<<peopleID<<endl;  
  111.             }  
  112.             childNodePtr = childNodePtr->next;  
  113.         }  
  114.   
  115.         itemNodePtr = itemNodePtr->next;  
  116.     }  
  117.   
  118.     xmlFreeDoc(doc);  
  119.     return filename;  
  120. }  


int GetSituation(const std::string&response) const
{
        int situation = -1;
        if(true)
        {
                const char* xmlContent = response.c_str();

                xmlDocPtr doc;
                xmlNodePtr cur;
                doc = xmlParseMemory(xmlContent, strlen(xmlContent));
                if(doc == NULL) {
                        LOG(ERROR) << "document not parsed successully.";
                        return situation;
                }
                cur = xmlDocGetRootElement(doc);
                if(cur == NULL) {
                        LOG(ERROR) << "document is empty.";
                        return situation;
                }
                if(xmlStrcmp(cur->name, (const xmlChar*) "result")) {
                        LOG(ERROR) << "document of wrong type.";
                        return situation;
                }
                cur = cur->xmlChildrenNode;
                while(cur != NULL)
                {
                        if(!xmlStrcmp(cur->name, (const xmlChar*) "situation")) {
                          char* situStr = (char*)xmlNodeGetContent(cur);
                                LOG(INFO) << "situation is: " << situStr;
                                situation = atoi(situStr);
                                xmlFree(situStr);
                                return situation;
                        }
                        cur = cur->next;
                }
        }
        return situation;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值