サービスからいくつかのファイルをダウンロードしようとしています。これらのファイルは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
xmllint
XML文書から情報を抽出することは役に立ちません。xmlstarlet
or 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")