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

0s0u357o  于 2023-02-05  发布在  Shell
关注(0)|答案(6)|浏览(284)

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

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

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

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

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

6mzjoqzu

6mzjoqzu1#

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

test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
idfiyjo8

idfiyjo82#

试试这个,不漂亮,但很管用:)
我只是从stdout中擦除包含>的行,剪切字符串以获得=之后的第二部分,然后删除“

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

niwlg2el3#

helper awk命令支持多个属性ego's approach的简化版本):

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

awk命令:

  • "字符将xmllint的输出行分割成字段.(-F\"
  • 请注意,xmllint在输出时将属性值周围的引号规范化为"...",即使输入为'...',因此按"拆分就足够了。
  • 仅处理偶数行(NR %2 == 0),从而滤除cat总是打印的分隔线。
  • print $2然后只打印第二个字段,即每个属性的 value,不包含"..."

假设file中有以下示例XML:

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

以上得到:

abc
def
4c8rllxm

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配置)。

6xfqseft

6xfqseft5#

我的目标是匹配多行并提取它们同名属性的值,然后在previous答案的基础上进行构建,这对我很有效,而且比较短,呵呵

xmllint --xpath "//*/@value" file.xml | awk -F\" '{ print $2 }'
mgdq6dx1

mgdq6dx16#

下一个对我有效:

xmllint --xpath '//o/@loc' file.xml | sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1\n/gp'

相关问题