我想获取name的值并使用XMLLint将其放入变量中
<body> <value name="abc"></value> </body> echo 'cat //body/value/@name' | xmllint --shell "test.xml" / > ------- name="abc" / >
所以我想给变量$test赋值“abc
6mzjoqzu1#
你需要使用fn:string(),它将返回其参数值xs:string,如果它的参数是一个属性,它将返回属性值xs:string。
xs:string
test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
idfiyjo82#
试试这个,不漂亮,但很管用:)我只是从stdout中擦除包含>的行,剪切字符串以获得=之后的第二部分,然后删除“
>
=
test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); echo $test
niwlg2el3#
helper awk命令支持多个属性(ego's approach的简化版本):
awk
echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'
awk命令:
"
xmllint
-F\"
"..."
'...'
NR %2 == 0
cat
print $2
假设file中有以下示例XML:
file
<body> <value name="abc"></value> <value name="def"></value> </body>
以上得到:
abc def
4c8rllxm4#
最近我不得不将原来使用--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配置)。
6xfqseft5#
我的目标是匹配多行并提取它们同名属性的值,然后在previous答案的基础上进行构建,这对我很有效,而且比较短,呵呵
xmllint --xpath "//*/@value" file.xml | awk -F\" '{ print $2 }'
mgdq6dx16#
下一个对我有效:
xmllint --xpath '//o/@loc' file.xml | sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1\n/gp'
6条答案
按热度按时间6mzjoqzu1#
你需要使用fn:string(),它将返回其参数值
xs:string
,如果它的参数是一个属性,它将返回属性值xs:string
。idfiyjo82#
试试这个,不漂亮,但很管用:)
我只是从stdout中擦除包含
>
的行,剪切字符串以获得=
之后的第二部分,然后删除“niwlg2el3#
helper
awk
命令支持多个属性(ego's approach的简化版本):awk
命令:"
字符将xmllint
的输出行分割成字段.(-F\"
)xmllint
在输出时将属性值周围的引号规范化为"..."
,即使输入为'...'
,因此按"
拆分就足够了。NR %2 == 0
),从而滤除cat
总是打印的分隔线。print $2
然后只打印第二个字段,即每个属性的 value,不包含"..."
。假设
file
中有以下示例XML:以上得到:
4c8rllxm4#
最近我不得不将原来使用--xpath的简单解决方案移植到一个没有这个特性的平台上,所以我也不得不采用“cat”解决方案,这将处理多个匹配,在Ubuntu 12.04和Solaris 11上测试过:
例如,从glassfish域配置中提取示例名称:
sed后处理只获取所有引用的值,这足以满足我的需要(获取一些glassfish配置)。
6xfqseft5#
我的目标是匹配多行并提取它们同名属性的值,然后在previous答案的基础上进行构建,这对我很有效,而且比较短,呵呵
mgdq6dx16#
下一个对我有效: