Bashを使用してXMLデータを変数に分割する

Bashを使用してXMLデータを変数に分割する

サービスからいくつかのファイルをダウンロードしようとしています。これらのファイルはXMLファイルにあります。 XMLファイルには、ダウンロードするファイルが1つ以上ある場合があります。しかし、今スクリプトに問題があります。各ファイルを個別にダウンロードできるように、XMLLINTの文字列を配列に分割する方法がわかりません。

文字列を複数の変数に分割し、各ファイルのURL文字列をダウンロードする必要があります。

ところで、201701_1ファイルは重複せず、カールを使ってダウンロードするのに問題はありません。ちなみに、Coverage.zipファイルが重複してカールで覆われています。私はします: その後、カールを使用して単一のファイルをダウンロードします。

curl -O -b cookie $URL 

現在私のスクリプトは次のとおりです。

while read edition; do   XML="<?xml version=\"1.0\"
encoding=\"UTF-8\"?> <download-area>   <files>
    <file>
      <url>https://google.com/411/201701_01_01.zip</url>
    </file>
    <file>
      <url>https://google.com/411/201701_01_02.zip</url>
    </file>   </files> </download-area>
    "
    URL=$(echo $XML | xmllint --xpath \
    "/*[name()='download-area']/*[name()='files']/*[name()='file']/*[name()='url']/text()" -)

    echo "URL:: " $URL

done < $LATEST_EDITION

LATEST_EDITION は行を含むファイルです。

私の質問は:VAR_1とVAR_2を複数のURLに分割して個別にダウンロードするにはどうすればよいですか? Coverage.zipを上書きするのを防ぐ方法は?

ベストアンサー1

xmllintXML文書から情報を抽出することは役に立ちません。xmlstarletor xml_grep(XML :: Twigからperl)またはを考慮することができますxml2

以下を使用して、xmllint一度に1つの文字列を抽出できます。

VAR1=$(printf '%s\n' "$XML" |
  xmllint --xpath '/download-area/files/file[1]/url/text()' -)
VAR2=$(printf '%s\n' "$XML" |
  xmllint --xpath '/download-area/files/file[2]/url/text()' -)

ここのように改行文字を含まない値の場合、bash's はreadarray次のように使用できます.

readarray -t var < <(
  xmlstarlet sel -t -v /download-area/files/file/url  <<< "$XML")

または

readarray -t var < <(
  xml2 <<< "$XML" | sed -n 's|^/download-area/files/file/url=||p')

または:

readarray -t var < <(
  xml_grep --text_only /download-area/files/file/url <<< "$URL")

おすすめ記事