中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Shell解析處理XML

發布時間:2021-07-01 11:39:10 來源:億速云 閱讀:1051 作者:小新 欄目:開發技術

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

前言

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

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

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

我這里主要采用了下面三個工具:

  • xmllint

  • xpath

  • xml2

下面就分別總結下這三個工具的用法,方便以后查閱。

xmllint

簡述

xmllint其實是由一個叫libxml2的c語言庫函數實現的一個小工具,因此效率比較高,對不同系統的支持度也很好,功能也比較全。他一般屬于libxml2-utils這個軟件包,因此類似與sudo apt install libxml2-utils的命令就可以安裝。

功能

xmllint至少支持下面幾個常用功能:

  • 支持xpath查詢語句

  • 支持類shell的交互式查詢

  • 支持xml格式驗證

  • 支持dtd,xsd對xml的校驗

  • 支持編碼轉換

  • 支持xml格式化

  • 支持去空格壓縮

  • 支持時間效率統計

其實我們比較常用的功能主要也就是三個–xpath查詢、去空格和格式化、校驗。

比如當前有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>

執行xpath查詢:

myths@business:~$ xmllint --xpath "//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校驗:

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

注意:校驗結果信息是輸出到stderr中的,工具默認會把原文件回顯到stdout里,可以加–noout參數關閉stdout回顯。

流傳遞:

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

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

簡述

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

功能

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

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

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

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功能有一點點區別很重要,如果xpath匹配了多個結果,那么xpath就會分行輸出,而xmllint則會揉到一行:

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

xml2

簡述

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

功能

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

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>

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

那么這種轉化命令有什么用呢?其實我們經常會遇到一些創建xml文件的需求,但是直接按照xml格式動態生成就非常麻煩,這時候用flat format做個中轉就非常方便了:

#!/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.

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵武市| 游戏| 吉首市| 轮台县| 仁怀市| 山丹县| 迭部县| 涪陵区| 讷河市| 汕尾市| 九江县| 郴州市| 历史| 南木林县| 巧家县| 响水县| 昌都县| 黄山市| 开封县| 合水县| 吉安市| 钟祥市| 石狮市| 五华县| 茶陵县| 太和县| 阳谷县| 额尔古纳市| 衡阳县| 沭阳县| 嘉义市| 肥西县| 黄平县| 鲁山县| 九龙城区| 黑水县| 菏泽市| 新营市| 漳浦县| 工布江达县| 修武县|