bash使用xmllint提取xml属性值

时间:2017-05-09 13:03:29

标签: xml bash shell awk xmllint

我从xml文件中提取属性值,但是我收到错误。 我想在 firstpart 元素中提取key="qua"的值。这是我的脚本,但在下面你会发现错误:

#!/bin/bash

myfile=$1

myvar=$(echo 'cat //firstpart/step/category/id/info[@key="qua"]/@value' | xmllint --xpath "$myfile" | awk -F'[="]' '!/>/{print $(NF-1)}')

echo "$myvar"

我的xml文件的样子:

<?xml version='1.0' encoding='UTF-8'?>
<firstpart>
    <step name="Home">    
        <category name="one">
            <id name="tools">
                <info key="qua" value="1"/>        
            </id>
        </category>
    </step>
    <step name="Contact">    
        <category name="two">
            <id name="tools">
                <info key="qua" value="2"/>        
            </id>
        </category>
    </step>
    ...
</firstpart>
<secondpart>
    <step name="office">    
        <category name="one">
            <id name="tools">
                <info key="qua" value="100"/>        
            </id>
        </category>
    </step>
    <step name="Contact">    
        <category name="two">
            <id name="tools">
                <info key="qua" value="200"/>        
            </id>
        </category>
    </step>
    ...
</secondpart>

我得到的错误:

awk: run time error: negative field index $-1
    FILENAME="-" FNR=71 NR=71

./mybash.sh: line 3: $: command not found
./mybash.sh: line 4: $: command not found

2 个答案:

答案 0 :(得分:2)

您似乎以错误的方式致电xmllint

xmllint --xpath '//firstpart/step/category/id/info[@key="qua"]/@value' FILE.xml

结果:

value="1" value="2"

完整的脚本:

#!/bin/bash

str=$(xmllint --xpath '//firstpart/step/category/id/info[@key="qua"]/@value' $1)

entries=($(echo ${str}))
for entry in "${entries[@]}"; do
    result=$(echo $entry | awk -F'[="]' '!/>/{print $(NF-1)}')
    echo "result: $result"
done

可能是,它不是更好的解决方案,但至少它有效:)

答案 1 :(得分:2)

使用xmllint获取属性值:

xmllint --xpath 'string(//firstpart/step[1]/category/id/info/@value)' file.xml

输出:

1