Command-Line

xmllint 在單次執行中顯示超過 1 個屬性的值

  • November 29, 2012

我正在使用 xmllint 解析具有多個標籤的 xml 文件,每個標籤都有多個屬性。範例結構如下圖:

<root>
  <child attr1="abc" attr2="def" attr3="ghi" />
  ...
  ...
</root>

我需要從屬性中獲取值attr1attr2並且attr3

到目前為止,我已經嘗試了以下方法,它完美地給出了一個屬性的數據

echo 'cat //root/child/@attr1' | xmllint --shell data.xml 

這個輸出

attr1="abc"

所以,我的問題是,我們如何在字元串中指定多個屬性來獲得所需的輸出為

attr1="abc"
attr2="def"
attr3="ghi"

我為此嘗試了以下方法,但沒有好的結果:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --shell data.xml 

上面的輸出是回顯語句再次被重新回顯,這意味著 xmllint 不接受它作為輸入。

關於如何解決這個問題的任何想法?

據我所知,|分隔符只能用於整個路徑:

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --shell data.xml

//在任何深度上,“//root”都意味著解析器需要做一些毫無意義的額外工作。假設您的範例 XML 看起來與真實的結構相似(因此 root 確實是 XML 的根節點),最好使用“/root/child ”。)

或者,您可以使用帶有 XPath 函式的表達式:

echo 'cat /root/child/@*[name()="attr1" or name()="attr2" or name()="attr3"]' | xmllint --shell data.xml

如果您需要所有帶有“attr*”名稱的屬性,您可以使用通用表達式:

echo 'cat /root/child/@*[starts-with(name(),"attr")]' | xmllint --shell data.xml

引用自:https://unix.stackexchange.com/questions/52711