2012-12-21 64 views
1

我有以下xml。我想循環遍歷每個節點,並將<url>解析XML並將數據放入bash數組中

值插入到bash數組中,如果<extern> == 1.任何想法我應該如何處理這個問題?

<GraphXML> 
     <graph isDirected="true"> 
     <node name="0"> 
      <label>font</label> 
      <url>http://fonts.googleapis.com/css?</url> 
      <data> 
      <checktime>0.262211</checktime> 
      <extern>1</extern> 
      </data> 
     </node> 
     <node name="1"> 
      <label>logo</label> 
      <url>http://example.com/example.png</url> 
      <data> 
      <dlsize>7545</dlsize> 
      <checktime>0.280600</checktime> 
      <extern>0</extern> 
      </data> 
     </node> 
    </graph> 
    </GraphXML> 

回答

2

使用xmllint:

out=$(echo "cat /GraphXML/graph/node/url|/GraphXML/graph/node/data/extern" | \ 
     xmllint --shell input | sed 's/<[^>]*>//g;s/[-][-]*//g;s/\/[^>]*>//') 
set $out 
i=0 
while [ $# -gt 0 ] ; do 
    url=$1 
    shift 
    extern=$1 
    shift 
    if [ $extern -eq 1 ]; then 
    array[$i]=$url 
    let i++ 
    fi 
done 

echo ${array[*]} 
1

使用bash

#!/bin/bash 
declare -a ARR 
while read -r line; do 
    if [[ "$line" =~ ^\<(url|extern)\>(.*)\</[^\>]*\>$ ]]; then 
     if [ "${BASH_REMATCH[1]}" == "extern" ]; then 
      ((${BASH_REMATCH[2]} == 0)) && unset ARR[${#ARR[@]}-1] 
     else 
      ARR+=("${BASH_REMATCH[2]}") 
     fi 
    fi 
done < <(grep -oE '<(url|extern)>.*</(url|extern)>' file.xml) 

echo "${ARR[@]}" 

說明

  • grep -oE - 使用正則表達式擴展-E要匹配urlextern和迴歸比賽-o
  • done < <( - 使用Process Substitutiongrepwhile循環。
  • while read -r line - 讀一行直到EOF然後while退出。
  • ^\<(url|extern)\>(.*)\</[^\>]*\>$ - 匹配行並保存到BASH_REMATCH數組中。
  • unset ARR[${#ARR[@]}-1] - 刪除在數組最後一個元素,如果屬性的extern值爲0
  • ARR+=(...) - 短形式到新元素添加到陣列。