libxml的使用(1) 讀取xml

2022-06-24 14:36:13 字數 3671 閱讀 1707

libxml是乙個用於解析xml檔案的庫,在各個平台下都能使用,也支援多種語言,如c,python等。這裡是官方**。上面有libxml的api和一些code examples,都是英文的。不過比較簡單。

libxml的基礎功能就是對xml的讀和寫。下面將簡單介紹libxml的讀的功能。(大部分內容是參照libxml tutorial 的文件)

0 編譯程式

因為本人是在linux下用c語言來介紹libxml的,所以使用了gcc編譯器。其他的編譯命令請參照官網。

我們知道,gcc 最簡單的編譯命令為gcc filename.c 。只要給這個命令新增標頭檔案和鏈結庫的位址就可以使用libxml。而libxml也提供了乙個指令碼xml2-config來配置這些位址。所以編譯時將命令改為gcc filename.c `xml2-config --cflags --libs`即可。cflags在編譯時提供標頭檔案的位址,而libs在鏈結時提供庫檔案的位址。

1 分析檔案--parse file

先簡單介紹xml檔案。

<?xml version="1.0" encoding="utf-8"?>

content1

content2

go上面是乙個簡單的xml檔案。從檔案中很容易就能看出整個檔案的結構和要表達的意思。下面我會結合xml的基本型別介紹這個檔案。

檔案的第一行是xml檔案的一些屬性,可以看出編碼方式是utf-8 。libxml只能處理uft-8 和 utf-16編碼的檔案,如果你的檔案不是這兩種編碼,需要在使用前進行轉換。

是xml的乙個節點,即xmlnode。而xmlnodeptr 表示指向xmlnode的指標--xmlnode*。,,是這個node的子node,即xmlnodeptr->children或xmlnodeptr->xmlchildrennode。所以就是的子node。

接下來就是解析檔案了。

[cpp]view plain

copy

print

?#include 

#include 

#include 

#include 

#include 

檔案中需要包含這兩個標頭檔案。

[cpp]view plain

copy

print

?xmldocptr doc = null;  

xmlnodeptr node = null;  

doc = xmlparsefile(filename);  

if(null  == doc)   

xmldocptr 表示指向xmldoc的指標。從tutorial中我們可以知道,xmldoc是乙個包含了已解析的檔案生成的節點樹的結構體。

[cpp]view plain

copy

print

?node = xmldocgetrootelement(doc);  

if(null == node)   

xmldocgetrootelement(doc)可以得到整個檔案的根節點,所有的操作都是從根節點開始的。

現在我們已經有了乙個包含這個節點樹的結構體指標xmldocptr doc,有了乙個可以操作節點的結構體指標xmlnodeptr node,我們就可以讀取各個節點的資訊了。

節點包含這麼幾個資訊:

node->name:節點的名字,如node1,node2,subnode等

node->xmlchildrennode:節點的子節點

node->last:節點的最後乙個子節點

node->parent:節點的父節點

node->next:節點的兄弟節點,對於node1來說,node2和node3都是其兄弟節點,node1的next指向node2

由於節點的內容是其子節點(對於node1,content1可以說是其子節點),所以我們需要使用xmlnodegetcontent來取出內容。

[cpp]view plain

copy

print

?node = node->xmlchildrennode;  

while(node != null)   

這是完整的原始碼。

[cpp]view plain

copy

print

?#include 

#include 

#include 

#include 

static int  

parsedoc(char* docname)   

cur = xmldocgetrootelement(doc);  

if(cur == null)   

if(xmlstrcmp(cur->name, (const xmlchar*)"root"))   

cur = cur->children;  

while(cur != null)   

xmlfreedoc(doc);  

return 0;  

}  int main()   

[cpp]view plain

copy

print

?name=text content=  

name=node1 content=content1  

name=text content=  

name=node2 content=content2  

name=text content=  

name=node3 content=  

go  

name=text content=  

這是因為libxml預設將各個節點間的空格當作乙個節點,只要在呼叫xmlparsefile之前呼叫xmlkeepblanksdefault(0)即可。

修改後結果如下:

[cpp]view plain

copy

print

?name=node1 content=content1  

name=node2 content=content2  

name=node3 content=go  

2 讀取記憶體中的xml文件。

很多時候我們需要對記憶體中的xml文件進行操作。比如在網路程式設計的時候經常會從server那裡接受一些客戶端的配置資訊,這些配置資訊大部分都是使用xml語言描述的。在你將這些資訊讀入到buffer中後,你無需將他們寫入檔案當中再分析,直接可以呼叫xmlreadmemory函式就可以得到乙個xmldocptr。這個函式接受五個引數,第乙個引數為快取區的指標,第二個引數為快取區大小,其他引數具體看api文件。當然另外乙個函式xmlreaddoc也能實現這樣的功能。

[cpp]view plain

copy

print

?static char* config = "";  

xmldocptr doc = null;  

xmlkeepblanksdefault(0);  

doc = xmlreadmemory(config, strlen(config), "in_memory.xml", null, 0);  

//handle doc  

xmlfreedoc(doc);  頂0

libxml的使用(1) 讀取xml

libxml是乙個用於解析xml檔案的庫,在各個平台下都能使用,也支援多種語言,如c,python等。這裡是官方 上面有libxml的api和一些code examples,都是英文的。不過比較簡單。libxml的基礎功能就是對xml的讀和寫。下面將簡單介紹libxml的讀的功能。大部分內容是參照l...

libxml的使用(1) 讀取xml

libxml是乙個用於解析xml檔案的庫,在各個平台下都能使用,也支援多種語言,如c,python等。這裡是 官方 上面有libxml的api和一些code examples,都是英文的。不過比較簡單。libxml的基礎功能就是對xml的讀和寫。下面將簡單介紹libxml的讀的功能。大部分內容是參照...

c 中使用libxml2讀取xml檔案

bbbbb 一種aaaaa bbbbb 整理一下,本文要讀取的d.xml為 aaaaa bbbbb 目的為取出其它的 b的值和node2的屬性值 ok,開工 include include int main int argc,char argv curnode xmldocgetrootelemen...