成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在命令行中使用 XMLStarlet 來解析 XML

系統 Linux
我最喜歡的 XML 實用程序之一是 XMLStarlet,這是一個用于終端的 XML 工具包,借助這個 XML 工具包,你可以驗證、解析、編輯、格式化和轉換 XML 數據。XMLStarLet 是個相對較小的命令,但瀏覽 XML 卻充滿潛力,因此本文演示了如何使用它來查詢 XML 數據。

[[414019]]

借助終端上的 XML 工具包 XMLStarlet,你就是 XML 之星。

學習解析 XML 通常被認為是一件復雜的事情,但它不一定是這樣。XML 是高度嚴格結構化的,所以也是相對來說可預測的。也有許多其他工具可以幫助你使這項工作易于管理。

我最喜歡的 XML 實用程序之一是 XMLStarlet,這是一個用于終端的 XML 工具包,借助這個 XML 工具包,你可以驗證、解析、編輯、格式化和轉換 XML 數據。XMLStarLet 是個相對較小的命令,但瀏覽 XML 卻充滿潛力,因此本文演示了如何使用它來查詢 XML 數據。

安裝

XMLStarLet 默認安裝在 CentOS、Fedora,和許多其他現代 Linux 發行版上,所以你可以打開終端,輸入 xmlstarlet 來訪問它。如果 XMLStarLet 還沒有被安裝,你的操作系統則會為你安裝它。

或者,你可以用包管理器安裝 xmlstarlet

  1. $ sudo dnf install xmlstarlet

在 macOS 上,可以使用 MacPorts 或 Homebrew。在 Windows 上,可以使用 Chocolatey

如果都失敗了,你可以從 Sourceforge 上的源代碼 手動安裝它。

用 XMLStarlet 解析 XML

有許多工具可以幫助解析和轉換 XML 數據,包括允許你 編寫自己的解析器 的軟件庫,和復雜的命令,如 fop 和 xsltproc。不過有時你不需要處理 XML 數據;你只需要一個方便的方法從 XML 數據中來提取、更新或驗證重要數據。對于隨手的 XML 交互,我使用 xmlstarlet,這是常見的處理 XML任務的一個典型的“瑞士軍刀”式應用。通過運行 --help 命令,你可以看到它提供哪些選項:

  1. $ xmlstarlet --help
  2. Usage: xmlstarlet [<options>] <command> [<cmd-options>]
  3. where <command> is one of:
  4. ed (or edit) - Edit/Update XML document(s)
  5. sel (or select) - Select data or query XML document(s) (XPATH, etc)
  6. tr (or transform) - Transform XML document(s) using XSLT
  7. val (or validate) - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG)
  8. fo (or format) - Format XML document(s)
  9. el (or elements) - Display element structure of XML document
  10. c14n (or canonic) - XML canonicalization
  11. ls (or list) - List directory as XML
  12. [...]

你可以通過在這些子命令的末尾附加 -help 來獲得進一步的幫助:

  1. $ xmlstarlet sel --help
  2. -Q or --quiet - do not write anything to standard output.
  3. -C or --comp - display generated XSLT
  4. -R or --root - print root element &lt;xsl-select&gt;
  5. -T or --text - output is text (default is XML)
  6. -I or --indent - indent output
  7. [...]

用 sel 命令選擇數據

可以使用 xmlstarlet select(簡稱 sel)命令查看 XML 格式的數據。下面是一個簡單的 XML 文檔:

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <xml>
  3. <os>
  4. <linux>
  5. <distribution>
  6. <name>Fedora</name>
  7. <release>7</release>
  8. <codename>Moonshine</codename>
  9. <spins>
  10. <name>Live</name>
  11. <name>Fedora</name>
  12. <name>Everything</name>
  13. </spins>
  14. </distribution>
  15.  
  16. <distribution>
  17. <name>Fedora Core</name>
  18. <release>6</release>
  19. <codename>Zod</codename>
  20. <spins></spins>
  21. </distribution>
  22. </linux>
  23. </os>
  24. </xml>

在 XML 文件中查找數據時,你的第一個任務是關注要探索的節點。如果知道節點的路徑,請使用 -value of 選項指定完整路徑。你越早瀏覽 文檔對象模型(DOM)樹,就可以看到更多信息:

  1. $ xmlstarlet select --template \
  2. --value-of /xml/os/linux/distribution \
  3. --nl myfile.xml
  4. Fedora
  5. 7
  6. Moonshine
  7. Live
  8. Fedora
  9. Everything
  10. Fedora Core
  11. 6
  12. Zod

--nl 代表“新的一行”,它插入大量的空白,以確保在輸入結果后,終端在新的一行顯示。我已經刪除了樣本輸出中的一些多余空間。

通過進一步深入 DOM 樹來凝聚關注點:

  1. $ xmlstarlet select --template \
  2. --value-of /xml/os/linux/distribution/name \
  3. --nl myfile.xml
  4. Fedora
  5. Fedora Core

條件選擇

用于導航和解析 XML 的最強大工具之一被稱為 XPath。它規范了 XML 搜索中使用的語法,并從 XML 庫調用函數。XMLStarlet 能夠解析 XPath 表達式,因此可以使用 XPath 函數來有條件的進行選擇。XPath 具有豐富的函數,由 W3C 提供了詳細文檔,但我覺得 Mozilla 的 XPath 文檔 更簡潔。

可以使用方括號作為測試函數,將元素的內容與某個值進行比較。下面是對 <name> 元素的值的測試,它僅返回與特定匹配相關聯的版本號。

想象一下,示例 XML 文件包含以 1 開頭的所有 Fedora 版本。要查看與舊名稱 “Fedora Core” 關聯的所有版本號(該項目從版本 7 開始刪除了名稱中的 “Core”),請執行以下操作:

  1. $ xmlstarlet sel --template \
  2. --value-of '/xml/os/linux/distribution[name = "Fedora Core"]/release' \
  3. --nl myfile.xml
  4. 6
  5. 5
  6. 4
  7. 3
  8. 2
  9. 1

通過將路徑的 --value-of 更改為 /xml/os/linux/distribution[name=“Fedora Core”]/codename,你便可以查看這些版本的所有代號。

匹配路徑和獲取目標值

將 XML 標記視為節點的一個好處是,一旦找到節點,就可以將其視為當前的數據的“目錄”。它不是一個真正的目錄,至少不是文件系統意義上的目錄,但它是一個可以查詢的數據集合。為了幫助你將目標和“里面”的數據分開,XMLStarlet 把你試圖用 --match 選項匹配的內容和用 --value-of 選項匹配的數據值進行了區分。

假設你知道 <spin> 節點包含幾個元素。這就是你的目標節點。一旦到了這里,就可以使用 --value-of 指定想要哪個元素的值。要查看所有元素,可以使用點(.)來代表當前位置:

  1. $ xmlstarlet sel --template \
  2. --match '/xml/os/linux/distribution/spin' \
  3. --value-of '.' --nl myfile.xml \
  4. Live
  5. Fedora
  6. Everything

與瀏覽 DOM 一樣,可以使用 XPath 表達式來限制返回數據的范圍。在本例中,我使用 last() 函數來檢索 spin 節點中的最后一個元素:

  1. $ xmlstarlet select --template \
  2. --match '/xml/os/linux/distribution/spin' \
  3. --value-of '*[last()]' --nl myfile.xml
  4. Everything

在本例中,我使用 position() 函數選擇 spin 節點中的特定元素:

  1. $ xmlstarlet select --template \
  2. --match '/xml/os/linux/distribution/spin' \
  3. --value-of '*[position() = 2]' --nl myfile.xml
  4. Fedora

--match 和 --value 選項可以重疊,因此如何將它們一起使用取決于你自己。對于示例 XML,這兩個表達式執行的是相同的操作:

  1. $ xmlstarlet select --template \
  2. --match '/xml/os/linux/distribution/spin' \
  3. --value-of '.' \
  4. --nl myfile.xml
  5. Live
  6. Fedora
  7. Everything
  8.  
  9. $ xmlstarlet select --template \
  10. --match '/xml/os/linux/distribution' \
  11. --value-of 'spin' \
  12. --nl myfile.xml
  13. Live
  14. Fedora
  15. Everything

熟悉 XML

XML 有時看起來過于冗長和笨拙,但為與之交互和構建的工具卻總是讓我吃驚。如果你想要好好使用 XML,那么 XMLStarlet 可能是一個很好的切入點。下次要打開 XML 文件查看其結構化數據時,請嘗試使用 XMLStarlet,看看是否可以查詢這些數據。當你對 XML 越熟悉時,它就越能作為一種健壯靈活的數據格式而為你服務。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2021-11-15 14:30:49

Pythonargparse編程語言

2020-09-11 07:50:37

nmcli命令行網絡連接

2023-03-02 19:36:34

C語言

2018-11-05 13:50:44

Linux命令tcpdump

2022-10-18 10:00:09

Linuxtcpdump命令

2018-10-22 10:00:05

Linux命令ls

2020-08-21 07:35:12

Linux命令行計算器

2010-06-01 19:24:40

SVN命令行

2010-08-20 10:05:23

用戶命令

2009-07-20 09:55:30

華為命令行解析華為認證

2010-07-15 10:47:22

Perl命令行

2023-01-12 09:30:31

Linux命令行xml

2009-07-15 17:10:26

Jython解析命令行

2019-05-21 10:38:17

Linux命令行

2021-07-29 09:07:44

React視圖庫Web 開發

2010-01-27 14:01:19

Android命令行啟

2010-07-15 11:08:23

Perl命令行

2022-02-14 08:21:48

Linux元字符

2023-03-08 15:38:56

Linux命令dict

2017-12-05 09:51:13

LinuxTranslate S命令行翻譯器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 农村黄性色生活片 | 欧美精品三区 | 99日韩| 国产一区二区精品在线 | 亚洲欧美日韩中文在线 | 91在线视频一区 | 国产亚洲成av人片在线观看桃 | 成人在线电影在线观看 | 久久久精品一区 | 国产成人网| 9久久| 中文字幕1区 | 国产一区二区精华 | 精品一区二区三区免费视频 | 国产精品99久久久久久www | 中文字幕综合 | 国产精品日本一区二区在线播放 | 久久成人午夜 | 91电影在线播放 | 国产精品久久九九 | 暖暖日本在线视频 | 天天色图| 美国黄色毛片 | 精品久久精品 | 三级黄视频在线观看 | 在线一区 | 欧美国产日韩一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 久久久123 | 老司机67194精品线观看 | 久久亚洲国产 | 精品久久九九 | 日日夜夜免费精品视频 | 天天看片天天干 | 国产成人精品网站 | 蜜桃毛片 | 久久久久无码国产精品一区 | 日日骚网| 国产精品美女久久久久aⅴ国产馆 | 久草在线在线精品观看 | 国产精品不卡视频 |