最近在做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,給套接字起個名字,用系統呼叫...