如何從 XML 檔案中提取單一屬性?

如何從 XML 檔案中提取單一屬性?

我不太熟悉正規表示式、sed 等,現在有點懶惰去弄清楚,那我該如何提取這一行:

<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

如果需要更多 xml 結構,請告訴我。

答案1

由於輸入資料(您的 XML 檔案)是結構化的,因此您最好對該結構化資料使用查詢,而不是將其視為純文字並使用正規表示式。

我們可以使用xmllint --xpathxml 輸入來計算 XPath 表達式:

$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am

- 這有點複雜,因為我們必須處理該檔案中的不同名稱空間,但仍然有效。

有關 XPath 的更多信息,規範位於http://www.w3.org/TR/xpath/

答案2

您不使用正規表示式或 sed。您使用 XML 解析器和 XML 查詢語言(XPath 或 XQuery)。恐怕細節確實取決於上下文:例如,「yweather」是名稱空間的簡稱(前綴),您需要知道它代表什麼名稱空間。

答案3

正如 Michael Kay 所說,正確的答案是使用特定於 XML 的工具。

對於快速但骯髒的解決方案,這裡有一個 sed 方法。讓我們從這個文件開始:

$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

要提取日落時間:

$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm

為了理解正規表示式,我們將其分為三個部分:

  1. .*從行首到第二部分匹配

  2. 這部分sunset="([^"]*)"匹配字符sunset=",後面跟著任意數量的字符(除了 )",最後是結束字符"。此表達式[^"]表示除 和 之外的任何字符",並且[^"]*表示任意數量的此類字符。括號捕獲sed 組 1(...)中的字符,我們稍後將其稱為。"..."\1

  3. .* 匹配日落表達式之後的所有字元。

答案4

我會給出相同的答案傑里米·科爾但給它一個xml例子。

我們有一個在out根資料夾中呼叫的xml文件config.xml,我們想要讀取標籤的屬性或屬性,讓它成為標籤widget

config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>AppName</name>
    <description>Description.</description>
    <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>

我們想要取得android-versionCode屬性值,我們在終端機中輸入:

xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml

輸出:

16

說明:我們用來/*[local-name()='widget']映射widget標籤,然後@android-versionCode讀取this的屬性。

相關內容