我想名字的值,并使用XMLLint把它放在一个变量
<body>
<value name="abc"></value>
</body>
echo 'cat //body/value/@name' | xmllint --shell "test.xml"
/ > -------
name="abc"
/ >
所以我想赋值“ABC”到变量$测试
我想名字的值,并使用XMLLint把它放在一个变量
<body>
<value name="abc"></value>
</body>
echo 'cat //body/value/@name' | xmllint --shell "test.xml"
/ > -------
name="abc"
/ >
所以我想赋值“ABC”到变量$测试
您需要使用FN:字符串() ,这将返回它的参数作为值xs:string
。 如果它的参数是一个属性,它会返回,因此该属性的值xs:string
。
test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
试试这个,这不是漂亮,但它的工作原理:)
我只是擦除包含线>
从标准输出,绳剪断拿到之后的第二部分=
,并删除“
test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \");
echo $test
我最近不得不用口来--xpath缺乏此功能的平台,我原来的简单的解决方案,所以不得不采用“猫”的解决方案了。 这将处理多个匹配,在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
战略经济对话后处理只是抓住这已经足够满足我的需求(获得GlassFish中配置的位)的所有引用的值。
与助手的方法awk
支持多种属性 (精简版命令 自我的做法 ):
echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'
在awk
命令:
分割xmllint
通过的输出线为字段"
字符。( -F\"
)
xmllint
进行归各地的属性值引用到"..."
的输出,即使输入了'...'
,所以这是足以分裂"
。 不仅处理偶数行( NR %2 == 0
),从而过滤掉隔板线cat
总是打印。
print $2
,然后打印仅第2场,这是不封闭的每个属性的值 "..."
。
假设在下面的示例XML file
:
<body>
<value name="abc"></value>
<value name="def"></value>
</body>
上述产率:
abc
def