最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Shell解析處理XML的方法匯總

 更新時(shí)間:2017年10月16日 10:58:07   作者:Myths  
這篇文章主要給大家總結(jié)介紹了關(guān)于利用Shell解析處理XML的方法,分別介紹了關(guān)于xmlint、xpath和xml2三種工具的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

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

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

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

  • xmllint
  • xpath
  • xml2

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

xmllint

簡(jiǎn)述

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

功能

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

  • 支持xpath查詢語(yǔ)句
  • 支持類(lèi)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:

<books>
  <book id="1">
    <name>book1</name>
    <price>100</price>
  </book>
  <book id="2">
    <name>book2</name>
    <price>200</price>
  </book>
  <book id="3"><name>book3</name><price>300</price>
  </book>
</books>

執(zhí)行xpath查詢:

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

去空格:

myths@business:~$ xmllint --noblanks sample.xml
<?xml version="1.0"?>
<books><book id="1"><name>book1</name><price>100</price><license/></book><book id="2"><name>book2</name><price>200</price></book><book id="3"><name>book3</name><price>300</price></book></books>

格式化:

myths@business:~$ xmllint --format sample.xml
<?xml version="1.0"?>
<books>
 <book id="1">
 <name>book1</name>
 <price>100</price>
 <license/>
 </book>
 <book id="2">
 <name>book2</name>
 <price>200</price>
 </book>
 <book id="3">
 <name>book3</name>
 <price>300</price>
 </book>
</books>

xsd校驗(yàn):

myths@business:~$ cat sample.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="books" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
 <xs:element name="books" msdata:IsDataSet="true" msdata:Locale="en-US">
 <xs:complexType>
  <xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element name="book">
   <xs:complexType>
   <xs:sequence>
    <xs:element name="name" type="xs:string" minOccurs="0" msdata:Ordinal="0" />
    <xs:element name="price" type="xs:string" minOccurs="0" msdata:Ordinal="1" />
   </xs:sequence>
   <xs:attribute name="id" type="xs:string" />
   </xs:complexType>
  </xs:element>
  </xs:choice>
 </xs:complexType>
 </xs:element>
</xs:schema>
 
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)是傳遞文件名,如果我們希望用通過(guò)管道傳遞文件流的方式傳遞數(shù)據(jù),我們可以這樣弄:

myths@business:~$ cat sample.xml |xmllint --format -
<?xml version="1.0"?>
<?xml version="1.0"?>
<books>
 <book id="1">
 <name>book1</name>
 <price>100</price>
 <license/>
 </book>
 <book id="2">
 <name>book2</name>
 <price>200</price>
 </book>
 <book id="3">
 <name>book3</name>
 <price>300</price>
 </book>
</books>

xpath

簡(jiǎn)述

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

功能

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

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中,將說(shuō)明信息輸出到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

簡(jiǎn)述

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

功能

這個(gè)工具包含六個(gè)命令:xml2,2xml,html2,2html,csv2,2csv,功能也非常unix,就是分別將xml,html,csv格式與一種他稱(chēng)之為“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
<books><book id="1"><name>book1</name><price>100</price></book><book id="2"><name>book2</name><price>200</price></book><book id="3"><name>book3</name><price>300</price></book></books>

這種自定義的格式非常簡(jiǎn)單而巧妙,有的表示新建節(jié)點(diǎn)(/books/book),有的表示給節(jié)點(diǎn)賦值(/books/book/name=book1),有的表示給節(jié)點(diǎn)的屬性賦值(/books/book/@id=1)。寫(xiě)法跟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.

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Shell腳本實(shí)現(xiàn)FTP自動(dòng)上傳和下載文件

    Shell腳本實(shí)現(xiàn)FTP自動(dòng)上傳和下載文件

    本文主要介紹了Shell腳本實(shí)現(xiàn)FTP自動(dòng)上傳和下載文件,主要內(nèi)容包括批量下載腳本代碼、下載單個(gè)文件腳本代碼、登錄FTP實(shí)現(xiàn)上傳文件功能、上傳單個(gè)文件腳本代碼等
    2023-08-08
  • Python使用淘寶API查詢IP歸屬地功能分享

    Python使用淘寶API查詢IP歸屬地功能分享

    這篇文章主要介紹了Python使用淘寶API查詢IP歸屬地功能分享,本文可以查詢到國(guó)家、運(yùn)營(yíng)商、區(qū)域、省份、城市、縣/區(qū)等,需要的朋友可以參考下
    2014-10-10
  • Linux paste命令用法匯總

    Linux paste命令用法匯總

    paste命令是linux下的一個(gè)文件管理命令,paste命令可以把每個(gè)文件以列對(duì)列的方式,然后一列列地加以合并,也就是合并兩個(gè)文件,這篇文章主要介紹了Linux paste命令使用方法,感興趣的朋友一起看看吧
    2022-12-12
  • Linux網(wǎng)絡(luò)設(shè)置詳情

    Linux網(wǎng)絡(luò)設(shè)置詳情

    這篇文章主要介紹了Linux網(wǎng)絡(luò)設(shè)置,需要的朋友可以參考下面文章內(nèi)容
    2021-08-08
  • 使用shell腳本分析網(wǎng)站日志統(tǒng)計(jì)PV、404、500等數(shù)據(jù)

    使用shell腳本分析網(wǎng)站日志統(tǒng)計(jì)PV、404、500等數(shù)據(jù)

    這篇文章主要介紹了使用shell腳本分析網(wǎng)站日志統(tǒng)計(jì)PV(瀏覽量)、404、500等數(shù)據(jù),用一個(gè)腳本來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-05-05
  • 詳解linux less命令查看大文件

    詳解linux less命令查看大文件

    less 工具也是對(duì)文件或其它輸出進(jìn)行分頁(yè)顯示的工具,應(yīng)該說(shuō)是linux正統(tǒng)查看文件內(nèi)容的工具,功能極其強(qiáng)大。本文主要給大家介紹linux less命令查看大文件的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-10-10
  • 詳解Linux解壓縮文件

    詳解Linux解壓縮文件

    這篇文章給大家介紹了Linux解壓縮文件的命令,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • Xshell與Xftp免費(fèi)下載安裝及步驟(圖文)

    Xshell與Xftp免費(fèi)下載安裝及步驟(圖文)

    這篇文章主要介紹了Xshell與Xftp免費(fèi)下載安裝及步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • linux tar命令簡(jiǎn)介

    linux tar命令簡(jiǎn)介

    tar命令用來(lái)打包,解包和壓縮。這篇文章主要介紹了linux tar命令簡(jiǎn)介,需要的朋友可以參考下
    2017-10-10
  • Shell腳本切割tomcat的日志文件

    Shell腳本切割tomcat的日志文件

    這篇文章主要介紹了Shell腳本切割tomcat的日志文件的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11

最新評(píng)論

磴口县| 昆山市| 陈巴尔虎旗| 仁寿县| 乌拉特后旗| 柳林县| 溧水县| 河源市| 南召县| 瑞金市| 东台市| 缙云县| 龙江县| 嫩江县| 玉山县| 宁远县| 阳信县| 大连市| 时尚| 盐津县| 柳州市| 宝山区| 玛沁县| 翁源县| 德清县| 健康| 津市市| 和顺县| 宜昌市| 都安| 微山县| 华宁县| 崇明县| 益阳市| 庄浪县| 建水县| 六安市| 封丘县| 泸溪县| 渝中区| 太仓市|