【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檔案:
- <?xmlversion="1.0"?>
- <MessageVersion="1.0">
-
<InfoevaluateType="2"mediaFile
- <Items>
- <ItemframeNum="0"scale="2"/>
- <ItemframeNum="1"scale="2"/>
- <ItemframeNum="2"scale="2"/>
- <ItemframeNum="2913"scale="2">
- <Labeltype="2"l="564"t="178"r="594"b="280"id="15"/>
-
<Labeltype="2"l="528"t="184"r="560"
- <Labeltype="2"l="490"t="182"r="522"b="288"id="16"/>
- <Labeltype="2"l="614"t="358"r="704"b="600"id="4"/>
- </Item>
- </Items>
- </Message>
libxml處理的函式如下:
- string getLabes(char *szDocName, map<pair<int,int>,Rect > &labels){
- xmlDocPtr doc;
- xmlNodePtr curNode;
- xmlChar *szKey;
- string filename="";
- doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER); //解析檔案
- if (doc==NULL){
- fprintf(stderr,"Document not parsed successfully.\n");
- return filename;
- }
- curNode = xmlDocGetRootElement(doc); //確定文件根元素
- if (NULL == curNode){
- fprintf(stderr,"empty document\n");
- xmlFreeDoc(doc);
- return filename;
- }
- if (xmlStrcmp(curNode->name, BAD_CAST "Message")) {
- fprintf(stderr,"document of the wrong type, root node != Message");
- xmlFreeDoc(doc);
- return filename;
- }
- curNode = curNode->xmlChildrenNode;
- xmlNodePtr propNodePtr = curNode;
- xmlNodePtr itemNodePtr;
- while(curNode != NULL){
- //取出檔名稱
- if (xmlHasProp(curNode,BAD_CAST "mediaFile")) {
- propNodePtr = curNode;
- }
- if (!xmlStrcmp(curNode->name, BAD_CAST "Items")) {
- itemNodePtr = curNode->xmlChildrenNode;
- }
- curNode = curNode->next;
- }
- xmlAttrPtr attrPtr = propNodePtr->properties;
- while (attrPtr != NULL){
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "mediaFile")){
- xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "mediaFile");
- char* szAttrG = u2g((char*)szAttr);
- filename = string(szAttrG);
- //cout<<"get filename: "<<filename<<endl;
- xmlFree(szAttr);
- }
- attrPtr = attrPtr->next;
- }
- // Item
- while (itemNodePtr != NULL){
- int frameNum = 0;
- int peopleID = 0;
- Rect rect;
- //<Label type="2" l="620" t="164" r="648" b="234" id="15" />
- xmlAttrPtr attrPtr = itemNodePtr->properties;
- while (attrPtr != NULL){
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "frameNum")){
- xmlChar* szAttr = xmlGetProp(itemNodePtr,BAD_CAST "frameNum");
- frameNum = atoi((char*)szAttr);
- //cout<<"get frameNum: "<<frameNum<<endl;
- xmlFree(szAttr);
- }
- attrPtr = attrPtr->next;
- }
- // Label
- xmlNodePtr childNodePtr = itemNodePtr->xmlChildrenNode;
- while (childNodePtr != NULL){
- int l=0,t=0,r=0,b=0;
- attrPtr = childNodePtr->properties;
- while(attrPtr != NULL){
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "l")){
- xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "l");
- l=atoi((char*)szAttr);
- xmlFree(szAttr);
- }
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "t")){
- xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "t");
- t=atoi((char*)szAttr);
- xmlFree(szAttr);
- }
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "r")){
- xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "r");
- r=atoi((char*)szAttr);
- xmlFree(szAttr);
- }
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "b")){
- xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "b");
- b=atoi((char*)szAttr);
- xmlFree(szAttr);
- }
- if (!xmlStrcmp(attrPtr->name, BAD_CAST "id")){
- xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "id");
- peopleID=atoi((char*)szAttr);
- xmlFree(szAttr);
- }
- attrPtr = attrPtr->next;
- }
- if(!(l==0&&t==0&&b==0&&r==0)){
- rect.x=l;rect.y=t;rect.width=r-l;rect.height=b-t;
- labels[pair<int,int>(frameNum,peopleID)] = rect;
- //cout<<"get label: "<<l<<" "<<t<<" "<<r<<" "<<b<<" "<<" "<<peopleID<<endl;
- }
-
相關推薦
【Android】pull解析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>
【java】xxx.hbm.xml檔案中的many-to-one和one-to-many理解
一、前言 在前幾天中自己在學習ssh的過程中,發現Hibernate需要配置一個名字叫xxx.hbm.xml的檔案,這個檔案主要是使用Hibernate對映到相應的表。自然在這個檔案裡面會
C#通過XPath解析xml檔案
以上主要是我之前蒐集的,但是工作中還是遇到了一些小問題,比如說如何刪除一個XmlNode。為此,我做了以下demo static void Main(string[]
【java】jdom生成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物件,其中
【C】C語言開啟,讀取檔案
文章目錄 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.