2017-05-09 223 views
0

我從xml文件中提取屬性值,但出現錯誤。 我想提取key="qua"第一部分元素的值。這裏是我的腳本,但是下面你可以發現錯誤:bash提取使用xmllint xml屬性值

#!/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 
+0

您是否嘗試過的xmllint輸出保存到一個文件,並在該運行AWK?我假設沒有,因爲如果你這樣做,你的問題會非常明顯。 –

+0

@EdMorton我該怎麼做?你能提供一個答案嗎? – passion

+0

而不是管道到awk,重定向到一個文件。然後在該文件上運行awk並得到相同的錯誤。然後檢查文件以查看問題。 – choroba

回答

1

它看起來像你打電話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 

可能,這不是更好的解決方案,但至少它的工作原理:)屬性與

+0

我怎樣才能得到值而不是'value =「1」'?在號碼 – passion

+1

@激情,看到更新的答案 –

1

獲得價值xmllint:

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

輸出:

 
1 
+0

我喜歡這個解決方案,但自從波爾拉澤首先回答,所以我接受那個作爲問題的答案。 – passion