我怎样才能使用xmllint和XPath属性值?(How can I get the value f

2019-06-26 11:35发布

我想名字的值,并使用XMLLint把它放在一个变量

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

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

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

所以我想赋值“ABC”到变量$测试

Answer 1:

您需要使用FN:字符串() ,这将返回它的参数作为值xs:string 。 如果它的参数是一个属性,它会返回,因此该属性的值xs:string

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


Answer 2:

试试这个,这不是漂亮,但它的工作原理:)

我只是擦除包含线>从标准输出,绳剪断拿到之后的第二部分= ,并删除“

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


Answer 3:

我最近不得不用口来--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中配置的位)的所有引用的值。



Answer 4:

助手的方法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


文章来源: How can I get the value from an attribute using xmllint and XPath?
标签: xml shell xpath