如何在Bash指令碼中解析XML檔案?
XML代表可擴充套件標記語言 (Extensible Markup Language)。它是一種廣泛使用的格式,用於在系統之間交換資料。許多應用程式都使用XML作為其配置檔案。甚至眾所周知的文件應用程式Office也基於XML。
- XML之所以如此受歡迎,是因為它使用純文字編寫,易於使用且獨立於平臺。它可以在任何程式語言中使用。
- 與HTML和其他標記語言不同,XML沒有預定義的標籤需要記住和使用。使用XML,您可以根據需要選擇標籤來表示您正在處理的內容,並透過樹狀結構進行組織。
在Linux中,有很多工具和程式允許我們解析和讀取XML檔案的內容。在本文中,我們將看到一些處理XML檔案的示例。
為什麼解析XML檔案?
解析或讀取XML檔案有助於我們瞭解其內容和結構。此操作透過兩種方式幫助我們:首先,透過搜尋特定元素;其次,透過提取資訊。
使用XMLStarlet解析XML檔案
為了讀取/解析XML檔案,我們需要一個專門的工具。在Linux中,有很多工具可以完成這項工作。其中之一是XMLStarlet。它是一個命令列實用程式,可以幫助讀取XML檔案,並具有選擇、驗證和編輯XML檔案等多種功能。
在Linux中安裝XMLStarlet
XMLStarlet並非Linux自帶。您需要先安裝它。由於它在Ubuntu、Fedora和Arch的軟體倉庫中可用,因此您只需使用包管理器即可輕鬆安裝。
對於Debian / Ubuntu / Mint:
sudo apt install xmlstarlet
對於RedHat / Fedora:
sudo dnf check-update
要檢查安裝是否成功,請使用選項--version列印工具的當前版本:
xmlstarlet -v
這應該會輸出系統中安裝的版本:
1.6.1
XMLStarlet的基本用法
如前所述,XMLStarlet是一個功能強大的工具,在處理XML格式文件時,我們可以使用它的許多功能。
例如,假設我們有一個名為example.xml的XML檔案需要解析。
選擇特定元素
我們建立的示例檔案用於演示XMLStarlet的用法如下:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="fiction">
<title lang="en">Learn BashScript</title>
<author>TutorialsPoint</author>
<year>1925</year>
<price>10.99</price>
</book>
<book category="non-fiction">
<title lang="en">Learn Docker</title>
<author>TutorialsPoint</author>
<year>2011</year>
<price>14.99</price>
</book>
<book category="children">
<title lang="en">Guide to Linux</title>
<author>TutorialsPoint</author>
<year>2023</year>
<price>7.99</price>
</book>
</bookstore>
在這個例子中,XML檔案格式很好。如果您有一個格式不正確的檔案,可以使用該工具的`fo`選項以美觀的方式列印文件:
xmlstarlet fo example.xml

使用該工具,我們可以獲取特定元素,例如:
xmlstarlet sel -t -v "//author" example.xml
讓我們瞭解一下我們在這裡使用的選項:
- sel代表“select”(選擇),允許我們從檔案中選擇一個元素。
- -t代表“template”(模板),它告訴工具我們需要如何輸出元素。
- -v告訴工具我們需要元素的值。在這個例子中,元素是author。
- //表示我們需要檔案中所有這樣的元素。
- author是我們正在搜尋的元素的名稱。
選項example.xml是我們需要解析的XML檔案的名稱。
因為在我們的示例中,author元素重複了三次,所以輸出應該是:
TutorialsPoint TutorialsPoint TutorialsPoint
編輯XML檔案
使用該工具還可以幫助我們將元素新增到現有的XML檔案中,例如:
xmlstarlet ed -L -s "//bookstore" -t elem -n "course" -v "" \ -s "//course[last()]" -t elem -n "title" -v "Operating Systems" \ example.xml
讓我們解釋一下我們在這裡使用的選項:
- ed - 告訴XMLStarlet我們需要編輯一個檔案。
- -L - 這意味著我們需要修改並儲存檔案。
- //bookstore - 選擇我們要新增子元素的元素(我們需要在bookstore元素下)。
- -t elem - 這意味著我們要建立一個元素。
- -v - 設定值。
- -s "//course[last()]" - 這將選擇我們剛剛新增的最後一個“course”元素。
- -n "title" - 在我們剛剛建立的“course”元素下新增一個新的元素。
- -v "Operating Systems" - 設定title元素的值。
如果我們執行此命令,它應該新增一個名為course的新元素,其中包含一個名為title的子元素,其值為“Operating Systems”。
現在,如果您再次開啟該檔案,您將看到我們新增到檔案中的新的course元素:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="fiction">
<title lang="en">Learn BashScript</title>
<author>TutorialsPoint</author>
<year>1925</year>
<price>10.99</price>
</book>
<book category="non-fiction">
<title lang="en">Learn Docker</title>
<author>TutorialsPoint</author>
<year>2011</year>
<price>14.99</price>
</book>
<book category="children">
<title lang="en">Guide to Linux</title>
<author>TutorialsPoint</author>
<year>2023</year>
<price>7.99</price>
</book>
<course>
<title>Operating Systems</title>
</course>
</bookstore>
您應該注意,我們在bookstore元素下有一個名為course的新元素。XML是樹狀的,因此course是bookstore元素的子元素,title是course元素的子元素。
模式驗證
使用XMLStarlet,我們可以使用以下命令來驗證針對DTD或模式的XML檔案(example.xml):
xmlstarlet val -d schema.dtd example.xml
DTD(文件型別定義)定義了XML檔案的結構和規則。此驗證檢查檔案是否遵循DTD中定義的指定規則或結構。
在這個例子中,我們將模式設定為schema.dtd,我們想檢查文件example.xml是否符合它。
結論
在本教程中,我們演示瞭如何使用XMLStarlet工具在bash指令碼中解析XML檔案,如果我們需要解析和編輯XML檔案,這將對我們有所幫助。在本文中,我們舉例說明了如何選擇元素和編輯以向檔案中新增新欄位。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP