長久以來,在shell 下處理xml一直是樓主頭疼的問題,用 regex 匹配不是不可以,但對于復雜的需求就有點捉襟見肘了,例如這樣一個問題 :查找某個元素值 item 的值等于value的節(jié)點,并把這個節(jié)點的另外一個元素值 item2 的值替換為另外一個值 value2。 對于這種需求,用 regex (sed) 處理起來很是痛苦,即便你用了 sed 的 pattern space ,也是很麻煩,光日后維護都成問題了。 昨天找了一下,有幾個候選的
xmllint 太老了,而且文檔比較少,就一個 manual ,不太敢用。下面先說 xml-coreutils 這個東西 manual 和文檔倒還算齊全。是模擬 coreutils 包的思路,具體可以看這里。有 xml-ls、xml-cat 等命令,看起來還不錯,不過用起來就是另外一回事了,最大的問題就是 Xpath 的支持不到位 ,很多功能都沒有 :不支持屬性、不支持條件、不支持函數(shù),而且對于大文件貌似處理有問題,經(jīng)常報錯。所以最后放棄了,也不建議大家使用。例如下面的 xml ,xml-coreutils 不支持 “/bookstore/book@category ” 這種 Xpath,也就是無法識別出 category 這個屬性。。。 books.xml
Shell
下面正式介紹 xmlstarlet 這個東東。xmlstarlet (官方站點點這里) 跟 xml-coreutils 不同,它并不是按照 coreutils 那種風格,分成多個小工具的方式,而是一個大的程序,通過不同的子命令來實現(xiàn)不同的功能。這個還只是小區(qū)別,主要是 xmlstarlet 對 Xpath 規(guī)范的支持相當?shù)轿?至少我認為我日常需要的大部分的功能都滿足,沒有想到的也提供了),這個才是 xmlstarlet 跟 xml-coreutils 的最大區(qū)別。 XMLStarlet is a set of command line utilities (tools) which can be used to transform, query, validate, and edit XML documents and files using simple set of shell commands in similar way it is done for plain text files using UNIX grep, sed, awk, diff, patch, join, etc commands. This set of command line utilities can be used by those who deal with many XML documents on UNIX shell command prompt as well as for automated XML processing with shell scripts. The toolkit’s feature set includes options to:
XMLStarlet command line utility is written in C and uses libxml2 and libxslt from http:///. |
|
來自: 浸心閣 > 《xmlstarlet》