簡體   English   中英

如何使用 xmllint 和 XPath 從屬性中獲取值?

[英]How can I get the value from an attribute using xmllint and XPath?

我想獲取名稱的值並使用 XMLLint 將其放入變量中

<body>
<value name="abc"></value>
</body>

echo 'cat //body/value/@name' | xmllint --shell "test.xml"

/ >  -------
 name="abc"
/ > 

所以我想將值“abc”分配給變量 $test

您需要使用fn:string() ,它將返回其參數的值為xs:string 如果它的參數是一個屬性,它將返回屬性的值為xs:string

test=$(xmllint --xpath "string(//body/value/@name)" test.xml)

試試這個,它不漂亮,但它的工作:)

我只是從stdout中刪除包含>行,剪切字符串以獲取=后面的第二部分,然后刪除“

test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
echo $test

使用helper awk命令支持多個屬性 的方法自我方法的簡化版本):

echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'

awk命令:

  • 通過" chars。(- xmllint -F\\" )將xmllint的輸出行拆分為字段

    • 請注意,即使輸入具有'...'xmllint將輸出上屬性值的引用規范化為"..." ,因此它足以按"分割"
  • 僅處理偶數行( NR %2 == 0 ),從而濾除cat總是打印的分隔線。

  • print $2然后只打印第二個字段,這是每個屬性的 ,沒有封閉的"..."

假設file包含以下示例XML:

<body>
  <value name="abc"></value>
  <value name="def"></value>
</body>

以上產量:

abc
def

我最近不得不將使用--xpath的原始簡單解決方案移植到缺少此功能的平台,因此不得不采用“cat”解決方案。 這將處理在Ubuntu 12.04和Solaris 11上測試的多個匹配:

getxml() { # $1 = xml file, $2 = xpath expression
    echo "cat $2" | xmllint --shell $1 |\
    sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1/gp'
}

例如,從glassfish域配置中提取實例名稱:

$ getxml /tmp/test.xml "//server[@node-ref]/@name"
inst1
inst2

sed后處理只是抓取所有引用的值,這些值足以滿足我的需求(獲得一些glassfish配置)。

為了匹配多行並提取其同名屬性的值並建立在以前的答案的基礎上,這對我有用,而且更短,呵呵

xmllint --xpath "//*/@value" file.xml | awk -F\" '{ print $2 }'

下一個對我有用:

xmllint --xpath '//o/@loc' file.xml | sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1\n/gp'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM