1. 程式人生 > >【C++】使用libxml解析XML檔案

【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檔案:

  1. <?xmlversion="1.0"?>
  2. <MessageVersion="1.0">
  3.   <InfoevaluateType="2"mediaFile
    ="1.avi">1</Info>
  4.   <Items>
  5.     <ItemframeNum="0"scale="2"/>
  6.     <ItemframeNum="1"scale="2"/>
  7.     <ItemframeNum="2"scale="2"/>
  8.     <ItemframeNum="2913"scale="2">
  9.       <Labeltype="2"l="564"t="178"r="594"b="280"id="15"/>
  10.       <Labeltype="2"l="528"t="184"r="560"
    b="288"id="11"/>
  11.       <Labeltype="2"l="490"t="182"r="522"b="288"id="16"/>
  12.       <Labeltype="2"l="614"t="358"r="704"b="600"id="4"/>
  13.     </Item>
  14.   </Items>
  15. </Message>

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

    Androidpull解析xml檔案+將資料儲存為xml格式,並儲存在記憶體裡

    在解析中,常用到的還有一種解析就是pull去解析xml格式的檔案。事實上android內部也是這樣做的。今天這個demo是來自傳智播客,可能技術已經被翻新了。 但是基礎原理還是那樣,希望基礎學習者,能夠理解,並實際寫一寫。 首先在src目錄下匯入我們將要解析的xml檔案:

    C++使用libxml解析XML檔案

    1.     構建xmlDocPtr物件,xmlParseMemory(str,str.len) 字串轉為XML文件 , 從檔案讀取內容構建xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER) 2.     xmlDocG

    C++ 使用TinyXML解析XML檔案

    1.介紹   讀取和設定xml配置檔案是最常用的操作,TinyXML是一個開源的解析XML的C++解析庫,能夠在Windows或Linux中編譯。這個解析庫的模型通過解析XML檔案,然後在記憶體中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹。     下載TinyXML的網址:http

    C++讀寫CSV檔案

    新建CSV檔案:建txt——另存(UTF-8)——字尾.csv CSVparser.hpp #ifndef _CSVPARSER_HPP_ # define _CSVPARSER_HPP_ # include <stdexcept>

    javaxxx.hbm.xml檔案中的many-to-one和one-to-many理解

    一、前言       在前幾天中自己在學習ssh的過程中,發現Hibernate需要配置一個名字叫xxx.hbm.xml的檔案,這個檔案主要是使用Hibernate對映到相應的表。自然在這個檔案裡面會

    C#通過XPath解析xml檔案

    以上主要是我之前蒐集的,但是工作中還是遇到了一些小問題,比如說如何刪除一個XmlNode。為此,我做了以下demo static void Main(string[]

    javajdom生成xml檔案

    上篇介紹了jdom解析xml檔案。這篇就介紹jdom生成xml。這樣就會對jdom操作xml有一個徹底的瞭解了。一個是正向解析,另一個是方向生成。 package com.rthb.test; import java.io.FileNotFoundException; i

    Linux C]利用libxml2解析xml檔案

    為了解析xml,可以使用Linux下預設安裝的libxml2。/*     a.c     功能:利用libxml2解析xml檔案 */#include <stdio.h>#include <stdlib.h>#include <string.h

    C#XML檔案格式的寫入

    寫入 //在記憶體中構建一個Dom物件 XmlDocument xmlDoc = new XmlDocument(); //增加一個文件說明 Xml

    電信計費系統專案實戰基礎篇---解析XML檔案

    寫在前面 這一篇介紹如何解析xml檔案,因專案中的角色管理有個許可權列表 為了方便管理,我們用privileges.xml儲存許可權操作資訊。 解析xml檔案 用privileges.xml儲存許可權操作資訊的程式碼如下: <?xml

    dom4j dom4j 生成並解析xml檔案

    使用場景:最近參與了一個寫三方介面的專案,期間學了一些小知識,記錄一下。 一、XML和JSON兩種資料交換格式的比較 XML:extensible markup language,一種類似於HTML的語言,他沒有預先定義的標籤,使用DTD(docum

    Android基礎知識網路獲取Xml檔案解析

    從伺服器獲取xml內容並解析 girls.xml <?xml version="1.0" encoding="utf-8"?> <girls> <girl> <name>tian</name> <a

    C++cmdline —— 輕量級的C++命令行解析

    pre eas 很好 -- 創建 tar mod ans valid 平時用C++寫一些命令行工具,須要解析命令行的輸入參數,這是一項繁瑣而且easy出錯的工作,我們不應該將主要精力放在這上面。能夠考慮使用開源的庫。以下的cmdline就是當中很好用

    C++error LNK2019: 無法解析的外部符號

    轉:C++ error LNK2019: 無法解析的外部符號 錯誤解決方案 今天在實現類模板特例化的時候遇到一個問題,就是把類模板函式實現放到類的cpp檔案中,然後在main函式中使用這個類的時候,就會出現無法解析的外部符號:函式名(xxxx)等錯誤,那麼出現這個錯誤的原因是什麼呢? 原

    Linux C/C++ 第06講 檔案IO

    一 IO的基礎      1.1 認識核心物件              Linux不允許直接訪問核心裝置和記憶體,但可以通過核心系統函式去訪問      

    C++STL:map引數解析

    如果基礎薄弱,那麼在看這篇部落格時,請先檢視map的例子。 map 是一種有序無重複的關聯容器。 關聯容器與順序容器不同,他們的元素是按照關鍵字來儲存和訪問的,而順序元素是按照它們在容器中的位置儲存和訪問的。 map儲存的是一種 key - value 的pair物件,其中

    CC語言開啟,讀取檔案

    文章目錄 C語言開啟,讀取檔案 一、明明白白我的心 二、程式碼飛起來 三、過程不重要,重點看結果 C語言開啟,讀取檔案 一、明明白白我的心   &nbs

    C++C++ 檔案讀寫 ofstream和ifstream詳細用法

      此文貌似值得一讀:https://www.cnblogs.com/hdk1993/p/5853233.html   原文自:https://www.cnblogs.com/batman425/p/3179520.html 原文出自【位元網】,轉載請保留原文連結

    C#C# 操作XML

    private void addBugCommentToDB(string header, string text) { string xmlContent = myManageDB.getDataFromCell("bugComment", "BugManage

    C++檔案專案extern的用法

    目錄 extern定義與使用 全域性變數和函式重定義 專案生成過程 extern定義與使用 extern告訴編譯器在某一個cpp檔案中,存在該函式或該全域性變數的定義。 (1)宣告外部函式; (2)宣告外部全域性變數。 程式功能:輸入半徑,求面積。 main.