rsync安裝與配置-完整版_第1頁
rsync安裝與配置-完整版_第2頁
rsync安裝與配置-完整版_第3頁
rsync安裝與配置-完整版_第4頁
rsync安裝與配置-完整版_第5頁
已閱讀5頁,還剩28頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、使用rsync從linux到linux做備份 一、軟件簡介rsync是Linux系統下的數據鏡像備份工具,從軟件的命名上就可以看出來了remote sync。rsync支持大多數的類Unix系統,無論是Linux、Solaris還是BSD上都經過了良好的測試。它的特性如下:1、可以鏡像保存整個目錄樹和文件系統。2、可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等。3、無須特殊權限即可安裝。4、優化的流程,文件傳輸效率高。5、可以使用rcp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接。本文介紹了如何使用rsync服務從Linux到Windows和linux進行遠程備份二、安

2、裝軟件rysnc的主頁地址為:/,可以從這里下載rsync的安裝軟件。編譯安裝rsync的編譯安裝非常簡單,只需要以下簡單的幾步(在兩臺服務器中都要安裝):$ tar xvf rsync-2.6.3.tgz$ cd rsync-2.6.3$ ./configure$ make$ make install/如果是已安裝了RPM版的Rsync,并且要安裝新版的Rsync,需要先刪除Rsync#rpm -e rsync(Redhat會有一個包依賴rsync,可以使用rpm -e rsync -nodeps卸載)另外,RPM版的rsync帶了一個服務端的啟動腳本,/etc/xinetd.d/rsync

3、可以保留但是需要注意的是必須在主服務器和同步服務器上都安裝rsync,其中主服務器上是以服務器模式運行rsync,而同步上則以客戶端方式運行rsync。這樣在主服務器上運行rsyn守護進程,在同步上用crond定時運行客戶程序來同步主服務器上需要同步的內容。三、配置rsync服務器端rsync服務器的配置文件為/etc/rsyncd.conf,其控制認證、訪問、日志記錄等等。該文件是由一個或多個模塊結構組成。一個模塊定義以方括弧中的模塊名開始,直到下一個模塊定義開始或者文件結束,模塊中包含格式為name=value的參數定義。每個模塊其實就對應需要備份的一個目錄樹,比方說在我們的實例環境中,有

4、三個目錄樹需要備份:/www/和/mirror/file0/和/mirror/file1/目錄,那么就需要在配置文件中定義三個模塊,分別對應三個目錄樹。配置文件是行為單位的,也就是每個新行都表示一個新的注釋、模塊定義或者參數賦值。1 。配置rsync servervi /etc/xinetd.d/rsync將disable=yes改為noservice rsyncdisable = yessocket_type = streamwait = nouser = rootserver = /usr/bin/rsyncserver_args = -daemonlog_on_failure += US

5、ERID確保etc/services中rsync端口號正確roottest etc# vim /etc/servicesrsync 873/tcp # rsyncrsync 873/udp # rsync配置rsync密碼文件/home/rsync.ps(名字隨便寫,只要和配置文件里的一致即可),格式(一行一個用戶)roottest etc# vi /home/rsync.psscihoo:scihoo配置rsync密碼文件權限roottest home# chown root.root rsync.psroottest home# chmod 600 rsync.ps啟動配置roottest

6、 home# /etc/init.d/xinetd restart如果xinetd沒有的話,需要安裝一下roottest home# yum -y install xinetdRSYNC服務端啟動的幾種方法啟動rsync服務端(獨立啟動)roottest home# /usr/bin/rsync -daemon加入rc.local,可以修改使系統啟動時把rsync -daemon加載進去。roottest home# vi /etc/rc.local/usr/local/rsync daemon #加入一行重新載入rsync配置roottest home# /etc/init.d/xinetd

7、 reload檢查rsync是否啟動roottest home# lsof -i :873COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMExinetd 4396 root 5u IPv4 633387 TCP *:rsync (LISTEN) =例子:手動創建rsync的配置文件vi /etc/rsyncd.conf(前面以#開頭的行或注釋可以不用寫入配置文件中)uid = nobody # 備份以什么身份進行,用戶IDgid = nobody # 備份以什么身份進行,組ID#注意這個用戶ID和組ID,如果要方便的話,可以設置成root,這樣rsyn

8、c幾乎就可#以讀取任何文件和目錄了,但是也帶來安全隱患。建議設置成只能讀取你要備份的目錄和文件即可。use chroot = nomax connections = 0 #最大連接數,0代表沒有限制#port = 873 #默認端口873pid file = /var/log/rsync/rsyncd.pid #運行進程的ID寫到哪里#lock file = /var/log/rsync/rsync.locklog file = /var/log/rsync/rsyncd.log #日志記錄文件motd file = /var/log/rsync/rsyncd.motd #歡迎消息strict

9、 modes =yes #是否檢查口令文件的權限attachment # 指定認證的備份模塊名path = /www/htdocs/pub/attachment/ # 需要備份的目錄comment = BACKUP attachment # 注釋ignore errors # 忽略一些無關的IO錯誤read only = false # 設置為非只讀,即可以傳至服務器的相應目錄。list = false # 不允許列文件#exclude = test/ test.php #設置不同步的目錄或文件用空格隔開#hosts allow = 0 #允許連接服務器的主機IP地址,如果多個ip則用空格隔開

10、#hosts deny = / #禁止連接服務器的主機IP地址,也可為*,表示所有。auth users = msyn # 認證的用戶名,如果沒有這行,則表明是匿名secrets file = /etc/rsyncd.scrt # 認證文件名,用來存放密碼98htdocsuid = nobodygid = nobodypath = /www/htdocs/#ignore errorsread only = truelist = true#hosts allow = 8#hosts deny = 8#hosts deny = /auth users = msyn,myname2secrets f

11、ile = /etc/rsyncd.scrt=這里分別定義了attachment、98htdocs,分別對應于二個需要備份的目樹。二個模塊授權的備份用戶分別為msyn,msyn,98syn,用戶信息保存在文件/etc/rsyncd.scrt,其內容如下:rootwww /etc# cat /etc/rsyncd.scrt www:xxxxxxxxx注意:該文件只能是root用戶可讀寫的,注意,出于安全目的,這個文件的屬性必需是只有屬主可讀,否則rsync將拒絕運行。我們可以設置它的屬性為600:rootwww /etc# chmod 600 /etc/rsyncd.scrt 這些文件配置完畢以

12、后,就需要在主服務器上啟動rsyncd服務:rootwww /etc# /usr/local/bin/rsync -daemon執行完畢上面的命令后,rsync即可啟動。rsync默認服務端口為873,服務器在該端口接收客戶的匿名或者認證方式的備份請求。四、配置客戶端1、配置密碼文件 (注:為了安全,設定密碼檔案的屬性為:600。rsync.scrt的密碼一定要和Rsync Server密碼設定案里的密碼一樣)rootaj1 home# vi /etc/rsync.scrt123456rootaj1 home# chown root.root /etc/rsync.scrt # 注意必須給權限

13、rootaj1 home# chmod 600 /etc/rsync.scrt # 必須修改權限2. linux下執行rsync客戶端命令下一步就要運行rsync客戶端的啟動命令了:backupbackup /#/usr/bin/rsync -vzrltogp -progress -delete userx.x.x.168:attachment /usr/local/apache/htdocs/pub/html/ -password-file=/etc/rsync.scrt上面這個命令行中-vzrtopg代表的意思是:-v表示verbose(詳細)-z表示zip(壓縮)-r表示recursiv

14、e(遞歸目錄)-topg是保持文件原有屬性如o=owner(屬主)、t=times(時間)、p=perms(權限)、g=group(組)的參數-H表示保持硬連接-l:保留軟鏈結-u:表示只更新源文件比目標時間新的文件-progress是指顯示出詳細的進度情況-delete是指如果服務器端刪除了這一文件,那么客戶端也相應把文件刪除,保持真正的一致。userx.x.x.168:attachment 是表示對服務器x.x.x.168中的attachment模塊進行備份,登錄帳號是user-password-file = /etc/rsync.scrt來指定密碼文件,這里需要注意的是這份密碼文件權限屬

15、性要設得只有屬主可讀(權限為600),屬主為正在運行此命令的用戶。-a:(-a, -archive equivalent to -rlptgoD)以archive模式操作,復制目錄、符號連接在這里面=另外,可以創建一個腳本運行這個命令,并記錄日志# cat /usr/local/bin/rsync.sh#!/bin/bashDATE=date +%wrsync -avzH -progress -delete inburst2:inburst /home/quack/backup/$DATE -password-file=/etc/rsync.pass /var/log/rsync.$DATE修

16、改/etc/crontab做好定時更新(配置文件 /etc/crontab)rootaj1 home# crontab -e15 4 * * 6 root rsync.shrootaj1 home# crontab -l /查看所有自定義任務rootaj1 home# /etc/init.d/crond restart /重啟動任務計劃 crontabCrontab文件的格式:第1列分鐘159第2列小時123(0表示子夜)第3列日131第4列月112第5列星期06(0表示星期天)=rsync for windows同步設置方法配置環境,windows server 2003_32位系統一、wi

17、ndows與windows同步1.準備兩臺機器:server-01client-02-2.下載windows版的rsync工具cwRsync_2.0.10_Installer.zipcwRsync_Server_2.0.10_Installer.zip-3.安裝與配置SERVER:(1)安裝cwRsync_Server_2.0.10_Installer.zip在開始程序中打開“start a unix bash shell”程序:進入一個類似cmd的終端,輸入如下命令:/bin/activate-user.sh輸入l輸入administrator后面全按回來結束-(2)啟動opensshd打開

18、“控制面板”“管理工具”“服務”:找到一個opensshd的服務,啟動它-(3)配置rsyncd.conf配置文件編輯C:Program FilescwRsyncServerrsyncd.conf,內容如下:use chroot = falsestrict modes = falsehosts allow = *log file = rsyncd.logpid file = rsyncd.pid# Module definitions# Remember cygwin naming conventions : c:work becomes /cygwin/c/workmonth201001pa

19、th = /cygdrive/E/lpxx/2010/1read only = falsetransfer logging = yes-(4)啟動rsync服務打開“控制面板”“管理工具”“服務”:找到一個RsyncServer的服務,啟動它到此server端配置結束,接下來配置client端。CLIENT:(1)安裝client端軟件包:cwRsync_2.0.10_Installer.zip(2)打開cmd,執行如下操作,測試服務端是否正常啟動服務了:cd C:Program FilescwRsyncbintelnet 01 22telnet 01 873若上述測試成功,此時可執行同步計劃

20、:(5)客戶端配置文件目錄 C:Program FilescwRsync2handdb-bak.bakECHO OFFSETLOCALSET CWRSYNCHOME=C:PROGRAM FILESCWRSYNCPDF created with pdfFactory Pro trial version SET CYGWIN=nontsecSET HOME=%HOMEDRIVE%HOMEPATH%SET CWOLDPATH=%PATH%SET PATH=%CWRSYNCHOME%BIN;%PATH%rsync 試用參數:-h , -help 顯示rsync求助資訊-version 顯示rsync版

21、本-v , -verbose 復雜的輸出信息-q , -quiet 安靜模式,幾乎沒有訊息產生, 常用在以cron執行rsync-I, -ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣,同樣存取時間點的檔案可以通過此參數開關此快速檢查.-size-only rsync 只檢查檔案大小是否改變,不管時間存取點是否改變通常用在mirror, 且對方時間不太正確時-c, -checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案(會托滿速度);-a, -archive archive mode 權限保存模式,相當于 -rlptgoD 參數.很快速

22、的保存幾乎所有的權限設定,除了硬式連接(透過-H設定).-r, -recursive 復制所有下面的資料(透過)-R, -relative 使用相對路徑如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案-R, -relative 不使用相對路徑-b, -backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份-backup-dir=DIR 設定備份的資料夾-suffix=SUFFIX 指定備份的檔案名稱字尾形式

23、(預設為)-K, -keep-dirlinks 接收方將連接到資料夾的檔案視為資料夾處理-l, -links 復制所有的連接-H, -hard-links 保留硬式連結-p, -perms 保留檔案權限 # 小p-o, -owner 保留檔案所有者(root only)-g, -group 保留檔案群組-D, -devices 保留device資訊(root only)-t, -times 保留時間點-n, -dry-run 不實際執行傳送_, 只顯示將會有的傳輸動作-S, -sparse 嘗試去處理稀疏的檔案, 讓這些檔案在目的端占去較少的磁碟空間-W, -whole-file 復制所有的檔

24、案, 不額外作檢查-no-whole-file 關閉 -whole-file 參數-x, -one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)-B, -block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce-e -rsh=COMMAND 定義所試用的remote shell-rsync-path=PATH 定義rsync在遠端機器存放資料的路徑-existing 只對比更新目的端已經存在的檔案-ignore-existing 忽略目的斷已經存在的檔案(也就是不更新)-delete 刪除傳送斷已經不存在,而目的端存在的檔案-del

25、ete-excluded 除了把傳送端已經不存在, 而目的端存在的檔案刪除之外, 也刪除 -exclude 參數所包含的檔案-delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,單可以透過 -delete-after 讓刪除動作在檔案傳送后在進行刪除-ignore-errors 忽略任何錯誤即使是I/O error 也進行 -delete 刪除動作-max-delete=NUM 定義rsync不要刪除超過NUM個檔案-partial rsync若遇到傳輸過程中斷時, 會把那些已經傳輸的檔案刪除.在某種狀況下保留那些部分傳送的檔案是令人高興的;你可以

26、透過 -partial 參數達到這個目的.-partial-dir=DIR 在 -partial 參數啟動時, 你還是可以定義rsync把那些部分傳送的檔案寫入定義的資料夾, 而非直接寫入目的端,需要注意的是,此資料夾不應該被其他試用者可以寫入.(如:/tmp)-force 當目的端資料夾被傳送端非資料夾名稱覆蓋時, 強制rsync刪除資料夾, 即使該資料夾不是空的.-numeric-ids 不將傳送端檔案的uid及gid值, 與目的端的使用者/群組進行配對,若傳送端并沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),或目的端沒有相對應的帳號/群組, 保留數字型式的uid/gid

27、-timeout=TIMEOUT 設定I/O 超時的時間(秒). 超過這個秒數而沒有資料傳送, rsync將會結束. 預設為0,也就是沒有定義超時時間-T, -temp-dir=DIR 定義rsync在接收端產生暫時性的復制檔案時使用資料夾暫存, 預設時直接在接收端資料夾直接產生暫存檔案-compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.-link-dest=DIR 與 -compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.PDF created with pdfFactory Pro trial version -z, -compre

28、ss 壓縮模式, 當資料在傳送到目的端進行檔案壓縮.-P -P參數和 -partial -progress 相同.只是為了把參數簡單化.-C, -cvs-exclude 排除那些通常不希望傳送的檔案, 定義的方式與CVS傳送相同:RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state.nse_depinfo * #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/符合

29、以上條件的都會被忽略不傳送.-exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不僅行傳送-exclude-from=FILE 和 -exclude 參數相同, 不過是把不進行傳送的檔案事先寫入某一檔案.執行時, 透過此參數讓rsync讀取.(; #開頭的行列或者空白會被rsync忽略)-include=PATTERN 定義rsync不要排除符合pattern樣式的檔案-include-from=FILE 和-include參數相同,只不過把要包含的檔案寫到某一檔案.-files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案, 讓rsync讀取.如: rsy

30、nc -a -files-from=/tmp/foo /usr remote:/backup-0 -from0 定義檔案所要讀取的檔案時null字元結尾.-version 現四版本信息.-daemon 定義rsync以daemon型態執行-no-detach 當以daemon形態執行時,不要進行分裂且變成背景程序.-address=ADDRESS 定義所要連接(bind)的ip位置或者是host名稱(daemon限定)-config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)預設值為 /usr/local/etc/rsyncd.conf-port=PORT 定

31、義rsyncd(daemon)要旨行的port(預設為tcp 873)-blocking-io 使用blocking I/O連結遠端的shell, 如rsh, remsh-no-blocking-io 使用non-blocking連結遠端的shell, 如ssh(預設值)-stats 顯示檔案傳送時的資訊狀態-progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的.)-log-format=FORMAT 定義log的格式(在rsyncd.conf設定)-password-file=FILE 從檔案讀取與遠端rsync伺服務連結的密碼-bwlimit=KBPS 定義傳輸頻寬的大小(KB

32、ytes/秒)-write-batch=FILE 把記錄資料寫入一個檔案(給其他相同環境且相同需求的機器試用)-read-batch=FILE 透過讀取記錄檔案來進行傳輸.(檔案由 -write-batch 參數產生)-checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)-4 -ipv4 使用IPv4協定-6 -ipv6 使用IPv6協定附錄資料:不需要的可以自行刪除 libxml2應用實例Libxml2 是一個xml的c語言版的解析器,本來是為Gnome項目開發的工具,是一個基于MIT License的免費開源軟件。它除了支持c語言版以外,還支持c+、

33、PHP、Pascal、Ruby、Tcl等語言的綁定,能在Windows、Linux、Solaris、MacOsX等平臺上運行。功能還是相當強大的,相信滿足一般用戶需求沒有任何問題。二、 Libxml2安裝:一般如果在安裝系統的時候選中了所有開發庫和開發工具的話(Fedora Core系列下),應該不用安裝,下面介紹一下手動安裝: 1) 從xmlsoft站點或ftp()站點下載libxml壓縮包(libxml2-xxxx.tar.gz)2) 對壓縮包進行解壓縮 tar xvzf libxml2-xxxx.tar.gz3) 進入解壓縮后的文件夾中運行 ./configure -prefix /ho

34、me/user/myxml/xmlinst(此處為待安裝的路徑)或者直接使用 ./configure make make install 4) 添加路徑 export PATH=/home/user/myxml/xmlinst/bin:$PATH 說明:為了結構清晰,最好將libxml2不安裝在解壓目錄中。安裝完成后就可以使用簡單的代碼解析XML文件,包括本地和遠程的文件,但是在編碼上有一些問題。Libxml默認只支持UTF8的編碼,無論輸入輸出都是UTF-8,所以如果你解析完一個XML得到的結果都是UTF8的,如果需要輸出GB2312或者其它編碼,需要ICONV來做轉碼(生成UTF8編碼的文

35、件也可以用它做),如果系統中沒有安裝iconv的話,需要安裝libiconv。 1) 下載libiconv壓縮包(例如libiconv-1.11.tar.gz) 2) 對壓縮包進行解壓縮tar xvzf libiconv-1.11.tar.gz 3) 進入解壓縮后的文件夾中運行 ./configure make make install三、關于XML:在開始研究 Libxml2 庫之前,先了解一下XML的相關基礎。XML 是一種基于文本的格式,它可用來創建能夠通過各種語言和平臺訪問的結構化數據。它包括一系列類似 HTML 的標記,并以樹型結構來對這些標記進行排列。例如,可參見清單 1 中介紹的

36、簡單文檔。為了更清楚地顯示 XML 的一般概念,下面是一個簡化的XML文件。清單 1. 一個簡單的 XML 文件 root delete 10清單 1 中的第一行是 XML 聲明,它告訴負責處理 XML 的應用程序,即解析器,將要處理的 XML 的版本。大部分的文件使用版本 1.0 編寫,但也有少量的版本 1.1 的文件。它還定義了所使用的編碼。大部分文件使用 UTF-8,但是,XML 設計用來集成各種語言中的數據,包括那些不使用英語字母的語言。接下來出現的是元素。一個元素以開始標記 開始(如 ),并以結束標記 結束(如 ),其中使用斜線 (/) 來區別于開始標記。元素是 Node 的一種類型

37、。XML 文檔對象模型 (DOM) 定義了幾種不同的 Nodes 類型,包括:Elements(如 files 或者 age)Attributes(如 units)Text(如 root 或者 10)元素可以具有子節點。例如,age 元素有一個子元素,即文本節點 10。XML 解析器可以利用這種父子結構來遍歷文檔,甚至修改文檔的結構或內容。LibXML2 是這樣的解析器中的其中一種,并且文中的示例應用程序正是使用這種結構來實現該目的。對于各種不同的環境,有許多不同的解析器和庫。LibXML2 是用于 UNIX 環境的解析器和庫中最好的一種,并且經過擴展,它提供了對幾種腳本語言的支持,如 Per

38、l 和 Python。四、Libxml2中的數據類型和函數一個函數庫中可能有幾百種數據類型以及幾千個函數,但是記住大師的話,90%的功能都是由30%的內容提供的。對于libxml2,我認為搞懂以下的數據類型和函數就足夠了。1)內部字符類型xmlCharxmlChar是Libxml2中的字符類型,庫中所有字符、字符串都是基于這個數據類型。事實上它的定義是:xmlstring.htypedef unsigned char xmlChar;使用unsigned char作為內部字符格式是考慮到它能很好適應UTF-8編碼,而UTF-8編碼正是libxml2的內部編碼,其它格式的編碼要轉換為這個編碼才能

39、在libxml2中使用。還經常可以看到使用xmlChar*作為字符串類型,很多函數會返回一個動態分配內存的xmlChar*變量,使用這樣的函數時記得要手動刪除內存。2) xmlChar相關函數如同標準c中的char類型一樣,xmlChar也有動態內存分配、字符串操作等相關函數。例如xmlMalloc是動態分配內存的函數;xmlFree是配套的釋放內存函數;xmlStrcmp是字符串比較函數等等。基本上xmlChar字符串相關函數都在xmlstring.h中定義;而動態內存分配函數在xmlmemory.h中定義。3)xmlChar*與其它類型之間的轉換另外要注意,因為總是要在xmlChar*和c

40、har*之間進行類型轉換,所以定義了一個宏BAD_CAST,其定義如下:xmlstring.h#define BAD_CAST (xmlChar *)原則上來說,unsigned char和char之間進行強制類型轉換是沒有問題的。4)文檔類型xmlDoc、指針xmlDocPtrxmlDoc是一個struct,保存了一個xml的相關信息,例如文件名、文檔類型、子節點等等;xmlDocPtr等于xmlDoc*,它搞成這個樣子總讓人以為是智能指針,其實不是,要手動刪除的。xmlNewDoc函數創建一個新的文檔指針。xmlParseFile函數以默認方式讀入一個UTF-8格式的文檔,并返回文檔指針。

41、xmlReadFile函數讀入一個帶有某種編碼的xml文檔,并返回文檔指針;細節見libxml2參考手冊。xmlFreeDoc釋放文檔指針。特別注意,當你調用xmlFreeDoc時,該文檔所有包含的節點內存都被釋放,所以一般來說不需要手動調用xmlFreeNode或者xmlFreeNodeList來釋放動態分配的節點內存,除非你把該節點從文檔中移除了。一般來說,一個文檔中所有節點都應該動態分配,然后加入文檔,最后調用xmlFreeDoc一次釋放所有節點申請的動態內存,這也是為什么我們很少看見xmlNodeFree的原因。xmlSaveFile將文檔以默認方式存入一個文件。xmlSaveForm

42、atFileEnc可將文檔以某種編碼/格式存入一個文件中。5)節點類型xmlNode、指針xmlNodePtr節點應該是xml中最重要的元素了,xmlNode代表了xml文檔中的一個節點,實現為一個struct,內容很豐富:tree.htypedef struct _xmlNode xmlNode;typedef xmlNode *xmlNodePtr;struct _xmlNode void *_private;/* application data */ xmlElementType type; /* type number, must be second ! */ const xmlCh

43、ar *name; /* the name of the node, or the entity */ struct _xmlNode *children;/* parent-childs link */ struct _xmlNode *last; /* last child link */ struct _xmlNode *parent;/* child-parent link */ struct _xmlNode *next; /* next sibling link*/ struct _xmlNode *prev; /* previous sibling link*/ struct _

44、xmlDoc*doc;/* the containing document */ /* End of common part */ xmlNs *ns; /* pointer to the associated namespace */ xmlChar *content; /* the content */ struct _xmlAttr *properties;/* properties list */ xmlNs *nsDef; /* namespace definitions on this node */ void *psvi;/* for type/PSVI informations

45、 */ unsigned short line; /* line number */ unsigned short extra;/* extra data for XPath/XSLT */;可以看到,節點之間是以鏈表和樹兩種方式同時組織起來的,next和prev指針可以組成鏈表,而parent和children可以組織為樹。同時還有以下重要元素:節點中的文字內容:content;節點所屬文檔:doc;節點名字:name;節點的namespace:ns;節點屬性列表:properties;Xml文檔的操作其根本原理就是在節點之間移動、查詢節點的各項信息,并進行增加、刪除、修改的操作。xmlDo

46、cSetRootElement函數可以將一個節點設置為某個文檔的根節點,這是將文檔與節點連接起來的重要手段,當有了根結點以后,所有子節點就可以依次連接上根節點,從而組織成為一個xml樹。6)節點集合類型xmlNodeSet、指針xmlNodeSetPtr節點集合代表一個由節點組成的變量,節點集合只作為Xpath的查詢結果而出現(XPATH的介紹見后面),因此被定義在xpath.h中,其定義如下:/* A node-set (an unordered collection of nodes without duplicates).*/typedef struct _xmlNodeSet xmlN

47、odeSet;typedef xmlNodeSet *xmlNodeSetPtr;struct _xmlNodeSet int nodeNr; /* number of nodes in the set */ int nodeMax; /* size of the array as allocated */ xmlNodePtr *nodeTab;/* array of nodes in no particular order */ /* with_ns to check wether namespace nodes should be looked at */;可以看出,節點集合有三個成員,

48、分別是節點集合的節點數、最大可容納的節點數,以及節點數組頭指針。對節點集合中各個節點的訪問方式很簡單,如下:xmlNodeSetPtr nodeset = XPATH查詢結果;for (int i = 0; i nodeNr; i+)nodeset-nodeTabi;注意,libxml2是一個c函數庫,因此其函數和數據類型都使用c語言的方式來處理。如果是c+,我想我寧愿用STL中的vector來表示一個節點集合更好,而且沒有內存泄漏或者溢出的擔憂。五、使用Libxml2項目中要實現一個管理XML文件的后臺程序,需要對XML文件進行創建,解析,修改,查找等操作,下面介紹如何利用libxml2提供

49、的庫來實現上述功能。1、創建XML文檔:我們使用xmlNewDoc()來創建XML文檔,然后使用xmlNewNode(),xmlNewChild(),xmlNewProp(),xmlNewText()等函數向XML文件中添加節點及子節點,設置元素和屬性,創建完畢后用xmlSaveFormatFileEnc()來保存XML文件到磁盤(該函數可以設置保存XML文件時的編碼格式)。示例1: #include #include #include int main(int argc, char *argv) xmlDocPtr doc = NULL; /* document pointer */ xml

50、NodePtr root_node = NULL, node = NULL, node1 = NULL;/* node pointers */ / Creates a new document, a node and set it as a root node doc = xmlNewDoc(BAD_CAST 1.0); root_node = xmlNewNode(NULL, BAD_CAST root); xmlDocSetRootElement(doc, root_node); /creates a new node, which is attached as child node of

51、 root_node node. xmlNewChild(root_node, NULL, BAD_CAST node1,BAD_CAST content of node1); / xmlNewProp() creates attributes, which is attached to an node. node=xmlNewChild(root_node, NULL, BAD_CAST node3, BAD_CASTnode has attributes); xmlNewProp(node, BAD_CAST attribute, BAD_CAST yes); /Here goes ano

52、ther way to create nodes. node = xmlNewNode(NULL, BAD_CAST node4); node1 = xmlNewText(BAD_CASTother way to create content); xmlAddChild(node, node1); xmlAddChild(root_node, node); /Dumping document to stdio or file xmlSaveFormatFileEnc(argc 1 ? argv1 : -, doc, UTF-8, 1); /*free the document */ xmlFr

53、eeDoc(doc); xmlCleanupParser(); xmlMemoryDump();/debug memory for regression tests return(0); 編譯:gcc -o xmlCreator xmlCreator.cpp-I/home/usr/libxml2/xmlinst/include/libxml2/ -L /home/usr/libxml2/xmlinst/lib/ -lxml2 (綠色文字為libxml2安裝路徑) -I后接頭文件目錄 -L后接lib庫目錄2、解析XML文檔 解析文檔時僅僅需要文件名并只調用一個函數,并有錯誤檢查,常用的相關函數有

54、xmlParseFile(),xmlParseDoc(),獲取文檔指針后,就可以使用xmlDocGetRootElement()來獲取根元素節點指針,利用該指針就可以在DOM樹里漫游了,結束后要調用xmlFreeDoc()釋放。示例2: xmlDocPtr doc; /定義解析文檔指針 xmlNodePtr cur; /定義結點指針(你需要它為了在各個結點間移動) xmlChar *key; doc = xmlReadFile(url, MY_ENCODING, 256); /解析文件 /*檢查解析文檔是否成功,如果不成功,libxml將指一個注冊的錯誤并停止。一個常見錯誤是不適當的編碼。XM

55、L標準文檔除了用UTF-8或UTF-16外還可用其它編碼保存。如果文檔是這樣,libxml將自動地為你轉換到UTF-8。更多關于XML編碼信息包含在XML標準中。*/ if (doc = NULL ) fprintf(stderr,Document not parsed successfully. n); return; cur = xmlDocGetRootElement(doc); /確定文檔根元素 /*檢查確認當前文檔中包含內容*/ if (cur = NULL) fprintf(stderr,empty documentn); xmlFreeDoc(doc); return; /*在這

56、個例子中,我們需要確認文檔是正確的類型。“root”是在這個示例中使用文檔的根類型。*/ if (xmlStrcmp(cur-name, (const xmlChar *) root) fprintf(stderr,document of the wrong type, root node != root); xmlFreeDoc(doc); return; cur = cur-xmlChildrenNode; while(cur!=NULL) if (!xmlStrcmp(cur-name, (const xmlChar *)keyword) key = xmlNodeListGetStri

57、ng(doc, cur-xmlChildrenNode, 1); printf(keyword: %sn, key); xmlFree(key); cur = cur-next; xmlFreeDoc(doc); 3、修改XML元素及屬性等信息要修改XML文檔里的元素及屬性等信息,先需要解析XML文檔,獲得一個節點指針(xmlNodePtr node),利用該節點指針漫游DOM樹,就可以在XML文檔中獲取,修改,添加相關信息。示例3: 得到一個節點的內容: xmlChar *value = xmlNodeGetContent(node); 返回值value應該使用xmlFree(value)釋

58、放內存得到一個節點的某屬性值: xmlChar *value = xmlGetProp(node, (const xmlChar *)prop1); 返回值需要xmlFree(value)釋放內存 設置一個節點的內容: xmlNodeSetContent(node, (const xmlChar *)test);設置一個節點的某屬性值: xmlSetProp(node, (const xmlChar *)prop1, (const xmlChar *)v1); 添加一個節點元素: xmlNewTextChild(node, NULL, (const xmlChar *)keyword, (co

59、nst xmlChar *)test Element); 添加一個節點屬性: xmlNewProp(node, (const xmlChar *)prop1, (const xmlChar *)test Prop);4、查找XML節點有時候對一個XML文檔我們可能只關心其中某一個或某幾個特定的Element的值或其屬性,如果漫游DOM樹將是很痛苦也很無聊的事,利用XPath可以非常方便地得到你想的Element。下面是一個自定義函數:示例4: xmlXPathObjectPtr get_nodeset(xmlDocPtr doc, const xmlChar *xpath) xmlXPathC

60、ontextPtr context; xmlXPathObjectPtr result; context = xmlXPathNewContext(doc); if (context = NULL) printf(context is NULLn); return NULL; result = xmlXPathEvalExpression(xpath, context); xmlXPathFreeContext(context); if (result = NULL) printf(xmlXPathEvalExpression return NULLn); return NULL; if (x

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論