Ich möchte Flussabflussdateien (.xml) von einem ChartServer online herunterladen und durch Ausführen eines .sh-Skripts eine .txt-Datei mit den Informationen erstellen. Ich habe jedoch Schwierigkeiten, die Daten im richtigen Format abzurufen.
Ich habe einen Teil meines Skripts hinzugefügt, in der Hoffnung, dass mir jemand zeigen kann, wie ich das zum Laufen bekomme.
url="http://h-web01.nve.no/ChartServer/ShowData.aspx?req=getchart&ver=1.0&time=-10;0&vfmt=xml&chd=ds=htsr,rt=1,da=18,id=700.2.2.1001.0"
xmllint --xpath '//SeriesData/Serie/Point/Value' ${url} | tr '</Value>' '\n' | grep -v '^$' > value_2.2.txt
xmllint --xpath '//SeriesData/Serie/Point/DateTime' ${url} | tr '</DateTime>' '\n' | grep -v '^$' > datetime.txt
if [ -s datetime.txt ]; then
while true; do
read month || break
read day || break
read year || break
read hour || break
echo ${year} ${month} ${day} >> date_2.2.txt
done < datetime.txt
# Put the date and runoff file together
while read Q <&3 && read y m d <&4; do
echo ${y} ${m} ${d} ${Q} >> runoff_2.2.txt
done 3<value_${fra}.${til}.txt 4<date_2.2.txt
Ich möchte, dass die TXT-Datei Folgendes enthält:
yyyy month day value
Mein Code gibt jedoch nur value
für jedes andere „DateTime“ Folgendes aus:
yyyy hh:mm:ss month day value
yyyy hh:mm:ss month day
yyyy hh:mm:ss month day value
...
Quelldaten
<?xml version="1.0" encoding="utf-8"?>
<SeriesData>
<Serie>
<Legend>Glomma med kystområder (700.2.2), Vannføring (m³/s)</Legend>
<Point>
<DateTime>03/07/2020 12:00:00</DateTime>
<Value>673.2365</Value>
</Point>
<Point>
<DateTime>03/08/2020 12:00:00</DateTime>
<Value>695.2465</Value>
</Point>
<Point>
<DateTime>03/09/2020 12:00:00</DateTime>
<Value>786.8168</Value>
</Point>
<Point>
<DateTime>03/10/2020 12:00:00</DateTime>
<Value>766.8459</Value>
</Point>
<Point>
<DateTime>03/11/2020 12:00:00</DateTime>
<Value>758.2921</Value>
</Point>
<!-- ...more data... -->
<Point>
<DateTime>03/16/2020 12:00:00</DateTime>
<Value>702.8088</Value>
</Point>
<Statistics/>
</Serie>
</SeriesData>
Antwort1
Wenn es Ihnen nichts ausmacht, können Sie xmlstarlet
stattdessen Folgendes verwenden:xmllint
url="http://h-web01.nve.no/ChartServer/ShowData.aspx?req=getchart&ver=1.0&time=-10;0&vfmt=xml&chd=ds=htsr,rt=1,da=18,id=700.2.2.1001.0"
curl --silent "$url" |
xmlstarlet sel -t -m '//SeriesData/Serie/Point' -v 'concat(substring(DateTime,7,4)," ",substring(DateTime,1,2)," ",substring(DateTime,4,2)," ",Value)' -n
Leider ist das <DateTime/>
Element kein richtiges XML-Datum, daher müssen wir es manuell aufteilen, anstatt XPath-Datumsverarbeitungsfunktionen zu verwenden.
Ausgabe
2020 03 07 673.2365
2020 03 08 695.2465
2020 03 09 786.8168
2020 03 10 766.8459
2020 03 11 758.2921
...
2020 03 16 702.8088