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
intparsedoc(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);
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的讀的功能。大部分內容是參照l...
c 中使用libxml2讀取xml檔案
bbbbb 一種aaaaa bbbbb 整理一下,本文要讀取的d.xml為 aaaaa bbbbb 目的為取出其它的 b的值和node2的屬性值 ok,開工 include include int main int argc,char argv curnode xmldocgetrootelemen...