如何使用xmllint和XPath从属性中获取值?

Tra*_*ang 31 xml shell xpath

我想获取name的值并使用XMLLint将其放入变量中

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

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

/ >  -------
 name="abc"
/ > 
Run Code Online (Sandbox Code Playgroud)

所以我想将值"abc"赋给变量$ test

小智 30

您需要使用fn:string(),它将返回其参数的值xs:string.如果它的参数是一个属性,它将返回属性的值为xs:string.

test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
Run Code Online (Sandbox Code Playgroud)

  • 这只显示单个元素的值,是否可以获得多个匹配? (11认同)
  • 遗憾的是 - 很多安装都不支持--xpath (9认同)

小智 8

试试这个,它不漂亮,但它的工作:)

我只是删除包含>stdout的行,剪切字符串以获取第二部分之后=,并删除"

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

  • 使用xmllint,因此您不必使用RE来解析XML.意识到你必须使用RE来解析xmllint的输出. (2认同)

mkl*_*nt0 5

具有支持多个属性的helper awk命令的方法(ego方法的简化版本):

echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'
Run Code Online (Sandbox Code Playgroud)

该awk命令:

  • xmllint通过"char 将的输出行拆分为字段。(-F\")

    • 请注意,即使输入具有xmllint属性"...",也可以将属性值周围的引号归一化到输出上'...',因此只要除以即可"。
  • 仅处理偶数行(NR %2 == 0),从而滤除cat始终打印的分隔线。

  • print $2然后仅输出第二个字段,即每个属性的值,不带"..."。

假定以下示例XML file:

<body>
  <value name="abc"></value>
  <value name="def"></value>
</body>
Run Code Online (Sandbox Code Playgroud)

以上收益:

abc
def
Run Code Online (Sandbox Code Playgroud)