linux c xml 程式設計

2021-05-25 13:12:23 字數 4625 閱讀 7152

最近在做linux c xml 程式設計測試。

在網路上似乎找不到太多的資料。

我覺得

的教程不錯。給大家介紹一下。。是英文,不過很簡單。相信做程式設計的人不會看不懂。。

給出國內的一資料,寫得也很不錯。(程式 我測試過了)

使用簡介

資料型別:

xmlchar  替代char,使用utf-8編碼的一位元組字串。如果你的資料使用其它編碼,它必須被轉換到utf-8才能使用libxml的函式。

xmldoc 包含由解析文件建立的樹結構,xmldocptr是指向這個結構的指標。

xmlnodeptr and xmlnode 包含單一結點的結構

xmlnodeptr是指向這個結構的指標,它被用於遍歷文件樹。

優點:1.   安裝、使用比較簡單,容易入門;2.   支援的編碼格式較多,能很好的解決中文問題(使用乙個很簡單的編碼轉換函式);3.   支援xpath解析(這點對於任意定位xml文件中的節點還是很有用的哦);4.支援well-formed 和valid驗證,具體而言支援dtd驗證,schema驗證功能正在完善中(目前多數解析器都還不完全支援shema驗證功能);5.   支援目前通用的dom、sax方式解析等等。

不足:1.  指標太多,使用不當時就會出現錯誤,在linux系統中表現為常見的段錯誤,同樣管理不當易造成記憶體洩漏;2.個人認為內面有些函式的功能設計的不是很好(比如獲取xpath函式,它不獲取節點屬性,這樣子有些情況會定位不准)。

在學習libxml2中,最好的學習手冊就是由官方開發者提供的開發手冊就是libxml2-devel-2.6.19,rpm –q –d libxml2獲得文件路徑,就是它了。

關於xml

開始研究 libxml2 庫之前,讓我們先來鞏固一下 xml 的相關基礎。xml 是一種基於文字的格式,它可用來建立能夠通過各種語言和平台訪問的結構化資料。它包括一系列類似 html 的標記,並以樹型結構來對這些標記進行排列。

例如,可參見清單 1 中介紹的簡單文件。這是配置檔案部分中研究的配置檔案示例的簡化版本。為了更清楚地顯示 xml 的一般概念,所以對其進行了簡化。

清單 1. 乙個簡單的 xml 檔案

<?

xmlversion = "1.0"

encoding = "utf-8"

?>

<

files

>

<

owner

> root

owner

>

<

action

> delete

action

>

<

ageunits = "days"

> 10

age>

files

>

清 單 1 中的第一行是 xml 宣告,它告訴負責處理 xml 的應用程式,即解析器,將要處理的 xml 的版本。大部分的檔案使用版本 1.0 編寫,但也有少量的版本 1.1 的檔案。它還定義了所使用的編碼。大部分檔案使用 utf-8,但是,xml 設計用來整合各種語言中的資料,包括那些不使用英語字母的語言。

接下來出現的是元素。乙個元素以開始標記開始(如 ),並以結束標記結束(如 ),其中使用斜線 (/) 來區別於開始標記。

元 素是node的一種型別。xml 文件物件模型 (dom) 定義了幾種不同的nodes型別,包括elements(如files或者age)、attributes(如units)和 text(如root或者10)。元素可以具有子節點。例如,age 元素有乙個子元素,即文字節點10。而 files 元素有七個子元素。其中三個很明顯。它們分別是三個子元素:owner、action和age。其他四個分別是元素前後的空白文字符號。

xml 解析器可以利用這種父子結構來遍歷文件,甚至修改文件的結構或內容。libxml2 是這樣的解析器中的其中一種,並且文中的示例應用程式正是使用這種結構來實現該目的。對於各種不同的環境,有許多不同的解析器和庫。libxml2 是用於 unix 環境的解析器和庫中最好的一種,並且經過擴充套件,它提供了對幾種指令碼語言的支援,如 perl 和 python。

1 tree

/*******************************************

* compile: gcc -i/usr/include/libxml2/ -lxml2 tree1.c

* usage: create a xml tree

********************************************/

#include 

#include 

#include 

int  main( int  argc,  char  **argv)

生成的xml:

[denny@localhost xml]$ gcc -i/usr/include/libxml2/ -lxml2 tree1.c

[denny@localhost xml]$ ./a.out

<?

xmlversion = "1.0"

encoding = "utf-8"

?>

<

root

>

<

node1

> content of node1

node1

>

<

node3

attribute = "yes"

> node has attributes

node3

>

<

node4

> other way to create content

node4

>

root

>

執行序列:

1 宣告指標:文件指標(xmldocptr),結點指標(xmlnodeptr);

2 生成文件doc:xmlnewdoc

3 生成根結點root_node: xmlnewdocnode ,xmlnewnode

4 文件與根結點**: xmldocsetrootelement

5 結點操作

1)建立子結點:xmlnewchild或xmlnewnode

2)設定結點屬性:xmlnewprop

3)設定結點值:xmlnewtext,xmlnewchild, xmladdchild

6 釋放記憶體:xmlfreedoc,xmlmemorydump

7 lib的載入退出: libxml_test_version , xmlcleanupparser

2 parse

對於應用程式來說,讀取 xml 檔案的第一步是載入該資料並將其解析為乙個document物件。在此基礎上,可以對 dom 樹進行遍歷以獲取特定的節點。

/*******************************************

* compile: gcc -i/usr/include/libxml2/ -lxml2 tree1.c

* usage: tree2 filename_or_url

********************************************/

#include 

#include 

#include 

#ifdef libxml_tree_enabled

static

void

print_element_names(xmlnode * a_node)

print_element_names(cur_node->children);

} }

/*** ****** example to parse a file called "file.xml",

* walk down the dom, and print the name of the

* xml elements nodes.

*/int

main( int  argc,  char  **argv)

/*get the root element node */

root_element = xmldocgetrootelement(doc);

print_element_names(root_element);

/*free the document */

xmlfreedoc(doc);

//xmlcleanupparser();

return  0;

} #else

int  main( void ) 

#endif

執行序列:

1 宣告指標:文件指標(xmldocptr),結點指標(xmlnodeptr);

2 得到文件doc: xmlreadfile

3 得到根結點root_node:xmldocgetrootelement

4 結點操作:

1)獲得到結點值:xmlnodegetcontent(對應於xmlfree)

2)遍歷:

指向下乙個結點:xmlnodeptr ->children

結點值:xmlnodeptr->name,

結點內遍歷:xmlnodeptr->next

5 釋放記憶體:xmlfreedoc,xmlfree

from :

ps:取得節點內容, xmlnodegetcontent(curnode);

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...

LINUX程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...