我想获取 name 的值并将其放入使用 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
一种带有支持多个属性的辅助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
我最近不得不将使用 --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 }'