在linux終端或者secureCRT ssh上去,或者是shell腳本可以直接調用xmlstarlet命令操作,解析xml很方便,由於是工作上用到的東東,查了相關的資料,也遇到過一些問題,所以在解決後記錄備忘,這裏只列出一些常用的命令和一些文檔裏沒有提到的命令,如需文檔,請參考:http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html
例子的測試xml文件都以test.xml爲準:
test.xml文件內容如下:
<root>
<aaa>he peng</aaa>
<bbb>zhang ling
</bbb>
<aaa>multiple</aaa>
</root>
1.下載
下載地址:http://xmlstar.sourceforge.net/
隨便下載一個版本,這個xmlstarlet是用c語言實現的,需要依賴libxml庫,所以,如果你的libxml版本太低了,那就下載一個版本低的xmlstar先練練手吧
2.安裝
解壓後
sudo ./configure
sudo ./make
sudo ./make install
3.操作方法之轉換結點
example 1:(注:有些系統安裝好xmlstarlet命令後使用的命令名可能叫xmlstarlet,而不是例子中的xml命令)
xml el test.xml
輸出:
root
root/aaa
root/bbb
root/aaa
(注:xml命令只是把處理結果輸出到控制檯,並不直接改變原來文件的任何地方)
example2:唯一結點(unique)
xml el -u test.xml
輸出:
root
root/aaa
root/bbb
4.操作方法之查詢結點值
語法:xml sel <global-options> {<template>} [ <xml-file> ... ]
example1:
xml sel -t -v /root/bbb test.xml #-t表示使用模板,-v就是模板參數,表示取路徑的值即value of
輸出:
zhang ling
(注:zhang ling後有一個空行,可見該語句是把<bbb>和</bbb>之間的值完整的輸出,-v指定的結點路徑一定要以"/"開頭,不要然不同的機器可能執行不成功,之後的結點路徑都是這樣)
example2:(輸出第二個aaa的值)
xml set -t -v /root/aaa[2] test.xml
輸出:
multiple
(注:如果有重複的相同結點,如果有屬性可以區分,可以指定屬性,如:/root/aaa[@name],表示/root/aaa結點,屬性爲name,當然例子沒有屬性,所以我們使用數字,使用數字的方法是同事無意中試出來的哦!文檔我找了很久都沒找到,這也因爲這個問題出現在工作中,所以研究了一陣)
5.操作方法之更新結點值
語法:xml ed <global-options> {<action>} [ <xml-file-or-uri> ... ]
example1:(更改指定結點的值)
xml ed -u /root/bbb -v 123 test.xml #-u 是update -v 是value
輸出:
<?xml version="1.0"?>
<root>
<aaa>he peng</aaa>
<bbb>123</bbb>
<aaa>multiple</aaa>
</root>
(注:不但更新了值,還格式化了輸出,還加了xml頭)
example2:(更新多結點的值)
xml ed -u /root/aaa -v 123 test.xml
輸出:
<?xml version="1.0"?>
<root>
<aaa>123</aaa>
<bbb>zhang ling
</bbb>
<aaa>123</aaa>
</root>
這樣就把所有的/root/aaa改了
example3:(更新多結點的某一個的值)
xml ed -u /root/aaa[2] -v 123 test.xml
輸出:
<?xml version="1.0"?>
<root>
<aaa>he peng</aaa>
<bbb>zhang ling
</bbb>
<aaa>123</aaa>
</root>
example4:(刪除多結點的某一個)
xml ed -d /root/aaa[2] test.xml # -d 是delete
輸出:
<?xml version="1.0"?>
<root>
<aaa>he peng</aaa>
<bbb>zhang ling
</bbb>
</root>
6.操作方法驗證有效性
xml val test.xml
輸出:
test.xml - valid
表明有效,是符合語法的xml形式