真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么使用Shell解析處理XML-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)怎么使用Shell解析處理XML的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),寧陵網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:寧陵等地區(qū)。寧陵做網(wǎng)站價(jià)格咨詢:18982081108

前言

前幾天在干活的時(shí)候遇到一個(gè)需要解析處理xml文件的一個(gè)需求,當(dāng)時(shí)考慮到邏輯比較復(fù)雜,因此用java慢慢搞了搞。不過這個(gè)需求經(jīng)常會(huì)變,每次變化之后都要重新找到j(luò)ar包的代碼,改了之后還要替換原來的jar包,一來不方便修改,二來不方便統(tǒng)一保存代碼,三來也不方便查看jar包的功能。


其實(shí)對(duì)于這種比較靈活的功能,最方便高效的做法是采用一些腳本語言,比如python,ruby等等,開發(fā)效率高,而且也能處理一些復(fù)雜邏輯。但是由于種種原因,工作中有的機(jī)器沒有安裝這些語言的解釋器。因此不得已,研究了一波用shell腳本解析xml的方法。


說到底,shell還是不太適合處理復(fù)雜的邏輯,但是對(duì)于一些簡單的查找替換等需求,用shell來搞還是挺方便的。


我這里主要采用了下面三個(gè)工具:

  • xmllint

  • xpath

  • xml2

下面就分別總結(jié)下這三個(gè)工具的用法,方便以后查閱。

xmllint

簡述

xmllint其實(shí)是由一個(gè)叫l(wèi)ibxml2的c語言庫函數(shù)實(shí)現(xiàn)的一個(gè)小工具,因此效率比較高,對(duì)不同系統(tǒng)的支持度也很好,功能也比較全。他一般屬于libxml2-utils這個(gè)軟件包,因此類似與sudo apt install libxml2-utils的命令就可以安裝。

功能

xmllint至少支持下面幾個(gè)常用功能:

  • 支持xpath查詢語句

  • 支持類shell的交互式查詢

  • 支持xml格式驗(yàn)證

  • 支持dtd,xsd對(duì)xml的校驗(yàn)

  • 支持編碼轉(zhuǎn)換

  • 支持xml格式化

  • 支持去空格壓縮

  • 支持時(shí)間效率統(tǒng)計(jì)

其實(shí)我們比較常用的功能主要也就是三個(gè)–xpath查詢、去空格和格式化、校驗(yàn)。


比如當(dāng)前有sample.xml:


  
    book1
    100
  
  
    book2
    200
  
  book3300
  

執(zhí)行xpath查詢:

myths@business:~$ xmllint --xpath "http://book[@id=2]/name/text()" sample.xml
book2

去空格:

myths@business:~$ xmllint --noblanks sample.xml

book1100book2200book3300

格式化:

myths@business:~$ xmllint --format sample.xml


 
 book1
 100
 
 
 
 book2
 200
 
 
 book3
 300
 

xsd校驗(yàn):

myths@business:~$ cat sample.xsd


 
 
  
  
   
   
    
    
   
   
   
  
  
 
 

 
myths@business:~$ xmllint --noout --schema sample.xsd sample.xml
sample.xml validates

注意:校驗(yàn)結(jié)果信息是輸出到stderr中的,工具默認(rèn)會(huì)把原文件回顯到stdout里,可以加–noout參數(shù)關(guān)閉stdout回顯。

流傳遞:


xmllint默認(rèn)是傳遞文件名,如果我們希望用通過管道傳遞文件流的方式傳遞數(shù)據(jù),我們可以這樣弄:

myths@business:~$ cat sample.xml |xmllint --format -



 
 book1
 100
 
 
 
 book2
 200
 
 
 book3
 300
 

xpath

簡述

xpath工具其實(shí)是封裝了的perl腳本,本身也只有兩百來行,功能比較專一,就是提供xpath的查詢功能。他一般屬于libxml-xpath-perl這個(gè)軟件包,因此類似于sudo apt install libxml-xpath-perl的命令就可以安裝。像suse之類的系統(tǒng)還會(huì)直接自帶。

功能

不同系統(tǒng)中安裝的版本可能不同,不過基本功能是類似的:

myths@business:~$ xpath -e '//book/name/text()' sample.xml
Found 3 nodes in sample.xml:
-- NODE --
book1
-- NODE --
book2
-- NODE --
book3

默認(rèn)會(huì)將查詢呢結(jié)果輸出到stdout中,將說明信息輸出到stderr中。如果為了方便收集結(jié)果,可以將stderr重定向到/dev/null,或者加上-q參數(shù):

myths@business:~$ xpath -e '//book/name/text()' sample.xml 2>/dev/null
book1
book2
book3
myths@business:~$ xpath -q -e '//book/name/text()' sample.xml
book1
book2
book3

xpath相比xmllint的xpath功能有一點(diǎn)點(diǎn)區(qū)別很重要,如果xpath匹配了多個(gè)結(jié)果,那么xpath就會(huì)分行輸出,而xmllint則會(huì)揉到一行:

myths@business:~$ xmllint --xpath "http://book/name/text()" sample.xml
book1book2book3

xml2

簡述

xml2這個(gè)工具感覺知道的人并不多,不過其實(shí)他在某些場(chǎng)景里跟其他命令配合能起到奇效。這個(gè)工具的開發(fā)人員的博客似乎已經(jīng)掛掉了,不過目測(cè)應(yīng)該用C以及l(fā)ibxml2庫寫的一個(gè)小工具。一般是在xml2軟件包中,因此類似sudo apt install xml2的命令就可以安裝。

功能

這個(gè)工具包含六個(gè)命令:xml2,2xml,html2,2html,csv2,2csv,功能也非常unix,就是分別將xml,html,csv格式與一種他稱之為“flat format”的格式進(jìn)行轉(zhuǎn)換。舉個(gè)例子:

myths@business:~$ cat sample.xml |xml2
/books/book/@id=1
/books/book/name=book1
/books/book/price=100
/books/book
/books/book/@id=2
/books/book/name=book2
/books/book/price=200
/books/book
/books/book/@id=3
/books/book/name=book3
/books/book/price=300
myths@business:~$ cat sample.xml |xml2|2xml
book1100book2200book3300

這種自定義的格式非常簡單而巧妙,有的表示新建節(jié)點(diǎn)(/books/book),有的表示給節(jié)點(diǎn)賦值(/books/book/name=book1),有的表示給節(jié)點(diǎn)的屬性賦值(/books/book/@id=1)。寫法跟xpath很像但又不完全一樣。而且相互對(duì)應(yīng)的兩個(gè)命令放在一起能做到冪等。

那么這種轉(zhuǎn)化命令有什么用呢?其實(shí)我們經(jīng)常會(huì)遇到一些創(chuàng)建xml文件的需求,但是直接按照xml格式動(dòng)態(tài)生成就非常麻煩,這時(shí)候用flat format做個(gè)中轉(zhuǎn)就非常方便了:

#!/usr/bin/env bash
tempFile=$(mktemp tmp.XXXX)
function addBook(){
 id=$1
 name=$2
 price=$3
 echo "/books/book">>$tempFile
 echo "/books/book/@id=$id">>$tempFile
 echo "/books/book/name=$name">>$tempFile
 echo "/books/book/price=$price">>$tempFile
}
function main(){
 addBook 1 book1 100
 addBook 2 book2 200
 addBook 3 book3 300
 cat $tempFile|2xml|xmllint --format --output new_sample.xml -
 rm $tempFile
}
main "$@"

上面這段代碼就生成了與sample.xml一模一樣的new_sample.xml.

感謝各位的閱讀!關(guān)于“怎么使用Shell解析處理XML”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


本文名稱:怎么使用Shell解析處理XML-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://weahome.cn/article/jjsoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部