如何在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檔案,這將對我們有所幫助。在本文中,我們舉例說明了如何選擇元素和編輯以向檔案中新增新欄位。

更新於:2024年11月4日

61 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.