39

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

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

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

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

所以我想将值“abc”分配给变量 $test

4

5 回答 5

44

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

test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
于 2012-08-10T16:49:38.500 回答
8

试试这个,它不漂亮,但它有效:)

我只是>从 stdout 中删除包含的行,剪切字符串以获得第二部分=,然后删除“

test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
echo $test
于 2012-07-27T08:28:22.670 回答
5

一种带有支持多个属性的辅助awk命令的方法(自我方法的简化版本):

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

awk命令:

  • 将 的输出行按字符拆分xmllint为字段。"( -F\")

    • 请注意,xmllint将围绕属性值的引用规范化到"..."输出,即使输入有'...',所以用 分割就足够了"
  • 仅处理偶数行 ( ),从而过滤掉总是打印NR %2 == 0的分隔线。cat

  • print $2然后只打印第二个字段,这是每个属性的,没有封闭的"...".

假设以下示例 XML 在file

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

以上产量:

abc
def
于 2017-05-27T18:00:15.480 回答
4

我最近不得不将使用 --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 配置)。

于 2014-06-05T03:23:23.867 回答
0

为了匹配多行并提取其同名属性的值并基于以前的答案,这对我有用,而且更短呵呵

xmllint --xpath "//*/@value" file.xml | awk -F\" '{ print $2 }'
于 2021-11-05T01:27:37.423 回答