偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[414019]]

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

學(xué)習(xí)解析 XML 通常被認(rèn)為是一件復(fù)雜的事情,但它不一定是這樣。XML 是高度嚴(yán)格結(jié)構(gòu)化的,所以也是相對來說可預(yù)測的。也有許多其他工具可以幫助你使這項(xiàng)工作易于管理。

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

安裝

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

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

  1. $ sudo dnf install xmlstarlet

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

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

用 XMLStarlet 解析 XML

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

  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 來獲得進(jìn)一步的幫助:

  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 命令選擇數(shù)據(jù)

可以使用 xmlstarlet select(簡稱 sel)命令查看 XML 格式的數(shù)據(jù)。下面是一個(gè)簡單的 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 文件中查找數(shù)據(jù)時(shí),你的第一個(gè)任務(wù)是關(guān)注要探索的節(jié)點(diǎn)。如果知道節(jié)點(diǎn)的路徑,請使用 -value of 選項(xiàng)指定完整路徑。你越早瀏覽 文檔對象模型(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 代表“新的一行”,它插入大量的空白,以確保在輸入結(jié)果后,終端在新的一行顯示。我已經(jīng)刪除了樣本輸出中的一些多余空間。

通過進(jìn)一步深入 DOM 樹來凝聚關(guān)注點(diǎn):

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

條件選擇

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

可以使用方括號作為測試函數(shù),將元素的內(nèi)容與某個(gè)值進(jìn)行比較。下面是對 <name> 元素的值的測試,它僅返回與特定匹配相關(guān)聯(lián)的版本號。

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

  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,你便可以查看這些版本的所有代號。

匹配路徑和獲取目標(biāo)值

將 XML 標(biāo)記視為節(jié)點(diǎn)的一個(gè)好處是,一旦找到節(jié)點(diǎn),就可以將其視為當(dāng)前的數(shù)據(jù)的“目錄”。它不是一個(gè)真正的目錄,至少不是文件系統(tǒng)意義上的目錄,但它是一個(gè)可以查詢的數(shù)據(jù)集合。為了幫助你將目標(biāo)和“里面”的數(shù)據(jù)分開,XMLStarlet 把你試圖用 --match 選項(xiàng)匹配的內(nèi)容和用 --value-of 選項(xiàng)匹配的數(shù)據(jù)值進(jìn)行了區(qū)分。

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

  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 表達(dá)式來限制返回?cái)?shù)據(jù)的范圍。在本例中,我使用 last() 函數(shù)來檢索 spin 節(jié)點(diǎn)中的最后一個(gè)元素:

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

在本例中,我使用 position() 函數(shù)選擇 spin 節(jié)點(diǎn)中的特定元素:

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

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

  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 有時(shí)看起來過于冗長和笨拙,但為與之交互和構(gòu)建的工具卻總是讓我吃驚。如果你想要好好使用 XML,那么 XMLStarlet 可能是一個(gè)很好的切入點(diǎn)。下次要打開 XML 文件查看其結(jié)構(gòu)化數(shù)據(jù)時(shí),請嘗試使用 XMLStarlet,看看是否可以查詢這些數(shù)據(jù)。當(dāng)你對 XML 越熟悉時(shí),它就越能作為一種健壯靈活的數(shù)據(jù)格式而為你服務(wù)。 

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2020-09-11 07:50:37

nmcli命令行網(wǎng)絡(luò)連接

2021-11-15 14:30:49

Pythonargparse編程語言

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命令行計(jì)算器

2010-06-01 19:24:40

SVN命令行

2010-08-20 10:05:23

用戶命令

2009-07-20 09:55:30

華為命令行解析華為認(rèn)證

2010-07-15 10:47:22

Perl命令行

2023-01-12 09:30:31

Linux命令行xml

2009-07-15 17:10:26

Jython解析命令行

2021-07-29 09:07:44

React視圖庫Web 開發(fā)

2019-05-21 10:38:17

Linux命令行

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命令行翻譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號