Mit Windows Script xml laden und parsen?

lano

Aktives Mitglied
Moin.
Ich würde gern mit Windows eine xml Datei von einer URL laden und diese dann parsen.

In Bash mach ich das mittels wget und awk....
echo "`wget -qO- http://fritz.box/juis_boxinfo.xml | awk -F'[<>]' '/Provider/ {print $3}'`"

Mein Windows gibt mir da allerdings Das in "" wieder aus, was in gewisser weise ja logisch aber nicht gewünscht ist.
Jemand ne Idee? sollte möglichst nen oneliner sein... *duck*
 
In welcher Shell bist du unter Windows denn unterwegs? CMD dürfte die Befehle wget und awk nicht kennen. PowerShell könnte Aliase für die beiden Befehle haben, bei den Flags bin ich mir aber nicht sicher. Von Bash unter Windows (z. B. Git Bash) würde ich fast erwarten, dass das 1:1 so funktioniert.
 
Ansonsten kann Powershell auch XML lesen.

PS: Theoretisch ist fast alles ein oneliner :D

Edit:
Ich hab mir grad so eine boxinfo.xml angeschaut, hat ja nur 2 Ebenen
XML:
<e:BoxInfo xmlns:e="http://juis.avm.de/updateinfo"
    xmlns:q="http://juis.avm.de/request">
    <q:Name>FRITZ!Box 90000</q:Name>
    <q:HW>123</q:HW>
    <q:Major>456</q:Major>
    <q:Minor>789</q:Minor>
    <q:Patch>012</q:Patch>
    <q:Buildnumber>3456789</q:Buildnumber>
    <q:Buildtype>01</q:Buildtype>
    <q:Serial>FFFFFFFFFFFF</q:Serial>
    <q:OEM>avm</q:OEM>
    <q:Lang>de</q:Lang>
    <q:Country>049</q:Country>
    <q:Annex>X</q:Annex>
    <q:Flag>flag_1</q:Flag>
    <q:Flag>flag_2</q:Flag>
    <q:Flag>flag_3</q:Flag>
    <q:UpdateConfig>01</q:UpdateConfig>
    <q:Provider>1&amp;1</q:Provider>
    <q:ProviderName>Marcel Davis</q:ProviderName>
</e:BoxInfo>

Also so als Beispiel bei PowerShell:
([xml](Get-Content .\juis_boxinfo.xml)).DocumentElement

Output:
Code:
e            : http://juis.avm.de/updateinfo
q            : http://juis.avm.de/request
Name         : FRITZ!Box 90000
HW           : 123
Major        : 456
Minor        : 789
Patch        : 012
Buildnumber  : 3456789
Buildtype    : 01
Serial       : FFFFFFFFFFFF
OEM          : avm
Lang         : de
Country      : 049
Annex        : X
Flag         : {flag_1, flag_2, flag_3}
UpdateConfig : 01
Provider     : 1&1
ProviderName : Marcel Davis

Zusammen wäre das irgendwie sowas:
([xml]((wget -UseBasicParsing http://fritz.box/juis_boxinfo.xml).Content)).DocumentElement

Ich hab noch nicht geschaut, wie der Output bei deinem awk-script aussieht.. aber da stecken schon mal alle Infos im Output, die man braucht.

Edit2:
Ok, du willst wohl nur den Providernamen.. dann ist XML-Parsen bisschen unnötig. Es hätte sogar einfaches Regex-Matching für <q:Provider>(.+)</q:Provider>gereicht. Aber zu spät.. ich habe diesen Weg beschritten und gehe ihn jetzt auch zu Ende!!!

Weil da Namespaces in der XML fehlen, muss man umständlich filtern:
([xml]((wget -UseBasicParsing http://fritz.box/juis_boxinfo.xml).Content)).SelectSingleNode("//*[name()='q:Provider']").InnerText
 
Zuletzt bearbeitet:
Gebe @Mat Recht. Der sinnvollste Weg ist die PowerShell. Wenn es denn Windows Batch sein soll, dann geht das out of the box nur unter Windows 10, da dort curl in die Tools aufgenommen wurde. Auf älteren Versionen ist das nur mit Drittanbietertools möglich.
Ungetestet:
for /f "tokens=3 delims=<>" %%p in ('^>nul chcp 65001^&curl -s "http://fritz.box/juis_boxinfo.xml"^|find /i "<q:Provider>"') do echo %%p
So sollte das in einem Batch Script laufen. Als Kommandozeile in einer CMD Shell haben die FOR Variablen nur ein Prozentzeichen. (Also die beiden %%p zu %p ändern.)
Ach und HTML Entities wie &amp; werden leider nicht aufgelöst.
 
Bei mir kommt auch nicht das erwartete bei raus.
:ROFLMAO: OK, das ist nur fair. Wenn ich nicht teste, musst du mir auch nicht sagen was statt dessen bei dir raus kommt.
*.bat
Code:
@echo off &setlocal
for /f "tokens=2 delims=<>" %%p in ('^>nul chcp 65001^&curl -s "http://fritz.box/juis_boxinfo.xml"^|find /i "<q:Provider>"') do echo %%p
pause
Ausgabe:
1und1
Drücken Sie eine beliebige Taste . . .
Korrektur: tokens=2
 
:ROFLMAO: OK, das ist nur fair. Wenn ich nicht teste, musst du mir auch nicht sagen was statt dessen bei dir raus kommt.

:D Nein so war das nicht gemeint. Das war mehr son Hmm.. Moment. Weil ich das auch nicht Nachvollziehen kann was denn da schief gelaufen sein könnte. Wofür ist chcp 65001 ?
 
for /f - Schleifentyp der Streams zeilenweise verarbeitet.
"tokens=2 delims=<>" - die Zeile wird an den Delimitern (Trennzeichen)< und > in Tokens (Teile) zerlegt. Das 2. Token wird der Schleifenvariable zugewiesen. Hier war mein Fehler. Ausgehend vom XML das @Mat gepostet hat, bin ich davon ausgegangen dass die Zeilen eingerückt sind. In diesem Fall wären die Leerzeichen der Einrückung ein zusätzliches Token gewesen. Scheint aber in der Realität nicht der Fall zu sein.
%%p in ('...') do - Schleifenvariable und Syntax um das StdOut der Kommandozeile zwischen den beiden einfachen Anführungszeichen zu verarbeiten
echo %%p - Ausgabe des Wertes der Schleifenvariablen

^>nul chcp 65001^&curl -s "http://fritz.box/juis_boxinfo.xml"^|find /i "<q:Provider>"
Kommandozeile, die ausgeführt wird. Hier müssen einige Zeichen durch ein ^ escaped werden, da die Zeile doppelt geparst wird. Einmal im Scriptmodus für die gesamte Schleife und einmal im Kommandozeilenmodus für die Ausführung der Kommandozeile zwischen den einfachen Anführungszeichen. Ohne diese Carets sieht das so aus:
>nul chcp 65001&curl -s "http://fritz.box/juis_boxinfo.xml"|find /i "<q:Provider>"

>nul chcp 65001 - Änderung der Zeichencodierung von StdIn und StdOut, die Erfolgsmeldung wird per >nul ins Nirvana geschickt. Die ID 65001 ist für UTF-8, weil XML per Default UTF-8 codiert ist, wenn nicht anders angegeben. Falls du nur ASCII in deinem gesuchten Wert erwartest, kannst du das auch rauswerfen.
& - Verkettung von Kommandos
curl -s "http://fritz.box/juis_boxinfo.xml" - Gibt den Quelltext des URL Ziels zum StdOut aus. Das -s unterdrückt in diesem Fall die Fortschrittsmeldung.
| - Weiterleitung des StdOut an das StdIn des nächsten Kommandos.
find /i "<q:Provider>" - Filtere die Zeile aus, die den String <q:Provider> enthält.
 
Zurück
Oben Unten