Bat... Knoteninhalt einer XML Datei laden?
Hallo,
das hier ist ein echt tolles Forum und besonders der Batch Bereich hat mir öfters weitergeholfen, jetzt brauche ich aber glaube ich aktive Hilfe :D
Es geht um folgendes:
ich habe eine XML Datei (data.xml), in der mehrere Knotenpunkte definiert sind. In der 8. Zeile ist der für mich wichtige Knoten <id>01</id> (immer eine zwei/dreistellige Zahl). Der Knotenpunkt ist normalerweise auch mit ein paar Lehrzeichen eingerückt, aber das könnte ich im Notfall entfernen, ansonsten muss der Aufbau der xml Datei so bleiben.
Jetzt würde ich mit der bat gerne diese eine Zahl (in dem Fall "01") einlesen und als Variable abspeichern. Weil ich hab eine weitere ausführliche bat Datei, die im Kopf eine oder mehrere id Werte hat (wie diese angegeben sind ist egal), und sollte dieser Wert da vorhanden sein, passt sie und muss ausgeführt werden, ansonsten eben nicht.
Was ich bisher habe:
Hiermit kann ich die komplette 8. Zeile auslesen:
... und hiermit könnte ich so eine Zeile (wird hier direkt als var angegeben) zurechtschneiden - zumindest irgendwie ...
Das Problem ist aber, das 1. keine Leerzeichen vor dem <id> akzeptiert werden und zweites leider keine Zahl unter 6 Stellen möglich ist, denn dann bekomm ich leider kein Ergebnis - nur dumm das ich es für eine 2-3 stellige Zahl brauche
Wenn dann die 2-3 stellige id Zahl als Variable vorhanden ist müsste ich sie mit der ersten Zeile einer ausführen.bat Detei vergleichen. Diese könnte so aussehen: 01,02,05,120,23
Sollte einer dieser Zahlen gleich meiner Variablen sein, so soll die ausführen.bat ausgeführt werden. In Actionscript würde ich das mit var.indexof(zeile1) lösen, geht das in einer Batch ähnlich?
Ich hoffe Ihr könnt mir da etwas auf die Sprünge helfen, etwas batch versteh ich ja noch, aber das geht leider weit über meinen Horizont
Gruß, maccoX
das hier ist ein echt tolles Forum und besonders der Batch Bereich hat mir öfters weitergeholfen, jetzt brauche ich aber glaube ich aktive Hilfe :D
Es geht um folgendes:
ich habe eine XML Datei (data.xml), in der mehrere Knotenpunkte definiert sind. In der 8. Zeile ist der für mich wichtige Knoten <id>01</id> (immer eine zwei/dreistellige Zahl). Der Knotenpunkt ist normalerweise auch mit ein paar Lehrzeichen eingerückt, aber das könnte ich im Notfall entfernen, ansonsten muss der Aufbau der xml Datei so bleiben.
Jetzt würde ich mit der bat gerne diese eine Zahl (in dem Fall "01") einlesen und als Variable abspeichern. Weil ich hab eine weitere ausführliche bat Datei, die im Kopf eine oder mehrere id Werte hat (wie diese angegeben sind ist egal), und sollte dieser Wert da vorhanden sein, passt sie und muss ausgeführt werden, ansonsten eben nicht.
Was ich bisher habe:
Hiermit kann ich die komplette 8. Zeile auslesen:
@echo off
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ data.xml') do @(
for /L %%a in (8,8,8) do @if %%i==%%a @echo %%j
)
pause
... und hiermit könnte ich so eine Zeile (wird hier direkt als var angegeben) zurechtschneiden - zumindest irgendwie ...
@echo off & setlocal
set "Von=<id>"
set "Bis=</id>"
set G=%temp%\GetPart.vbs
>%G% echo Set a=WScript.Arguments:T=a(0):Von=a(1):L=Len(Von):Bis=a(2):Start=InStr(T,Von):If Start^>0 Then Start=Start+L:Ende=InStr(Start,T,Bis)-Start:If Ende^>Start Then WScript.Echo Trim(Mid(T,Start,Ende))
set "var=<id>010101</id>"
set varNeu=
for /f "delims=" %%i in ('cscript //nologo %G% "%var%" "%Von%" "%Bis%"') do set "varNeu=%%i"
if defined varNeu (echo %varNeu%) else (echo Teistring konnte nicht gebildet werden!)
pause
Das Problem ist aber, das 1. keine Leerzeichen vor dem <id> akzeptiert werden und zweites leider keine Zahl unter 6 Stellen möglich ist, denn dann bekomm ich leider kein Ergebnis - nur dumm das ich es für eine 2-3 stellige Zahl brauche
Wenn dann die 2-3 stellige id Zahl als Variable vorhanden ist müsste ich sie mit der ersten Zeile einer ausführen.bat Detei vergleichen. Diese könnte so aussehen: 01,02,05,120,23
Sollte einer dieser Zahlen gleich meiner Variablen sein, so soll die ausführen.bat ausgeführt werden. In Actionscript würde ich das mit var.indexof(zeile1) lösen, geht das in einer Batch ähnlich?
Ich hoffe Ihr könnt mir da etwas auf die Sprünge helfen, etwas batch versteh ich ja noch, aber das geht leider weit über meinen Horizont
Gruß, maccoX
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 159979
Url: https://administrator.de/forum/bat-knoteninhalt-einer-xml-datei-laden-159979.html
Ausgedruckt am: 02.08.2025 um 08:08 Uhr
15 Kommentare
Neuester Kommentar

Moin,
vorab - merci für die Codeblöcke und den rest.
Dann eine Demo an der Dosbox im Ordner c:\script\xml
- von 8 in 8er Schritten bis 8 hochzählen? - wozu dies?)
Oder laufe ich grad über den falschen Abzweig nach Rom?
Gruß
vorab - merci für die Codeblöcke und den rest.
Dann eine Demo an der Dosbox im Ordner c:\script\xml
for /l %a in (1,1,12) do echo ^<id^>0%a^</id^>>>C:\script\xml\123.xml
- Damit habe ich eine xml Datei zum spielen.
for /f "tokens=2 delims=<>" %a in ('more +7 C:\script\xml\123.xml') do if not defined tempo set tempo=%a
- Damit hole ich mir aus der erzeugten Datei die Zeile 8 und werte alles zwischen >< aus.
- mit
set %tempo%
- erhalte ich (wie gewünscht) den Inhalt
08
Oder laufe ich grad über den falschen Abzweig nach Rom?
Gruß

Salü,
auch ein blindes Korn opfert sich mal einem Huhn - oder so ähnlich
naja -wenn mein Dampfer auf dem richtigen Fluss in die gewünschte Richtung rudert....
Gruß
auch ein blindes Korn opfert sich mal einem Huhn - oder so ähnlich
- grübel...
Wenn dann die 2-3 stellige id Zahl als Variable vorhanden ist müsste ich sie mit der ersten Zeile einer ausführen.bat Detei vergleichen. Diese könnte so aussehen: 01,02,05,120,23
naja -wenn mein Dampfer auf dem richtigen Fluss in die gewünschte Richtung rudert....
- %tempo% wäre immer noch die Variable
- und der übersichthalber nehmen wir den gleichen Weg - wie oben
for /f %b in ('findstr "." C:\script\xml\123.ini') do if not defined tempi set tempi=%b
- damit hast du den kompletten Inhalt von der ersten Zeile
echo %tempi% ^|findstr /c:"%tempo%" && echo gefunden ||echo nicht gefunden
/edit- Damit "wird zuerst die erste zeile geechot und dann mittels find überprüft, ob das zutrifft "&&" oder nicht "||"
Gruß

Zitat von @maccoX:
Hallo nochmal ;)
Also ich glaub ich hab irgend etwas falsch gemacht, das ganze sieht jetzt so aus:
Hallo nochmal ;)
Also ich glaub ich hab irgend etwas falsch gemacht, das ganze sieht jetzt so aus:
Ich vermute ...der falschmacher sitzt nicht vor deiner Tastatur, das war schon meine
- Nimm bitte bis zur ZetaPhase das @echo off raus.
- neue Zeile 7: echo %tempi% (just as a gimmick)
- geänderte Zeile 08:
echo %tempi% ^|findstr /c: "%tempo%" && echo gefunden ||echo nicht gefunden
Zur Erklärung:
- wenn 08 gesucht wird und von 01,02 usw "0" gesendet wird - findet "find" zwar nicht 08, aber die "0".
- findstr /c: dagegen sucht gezielt nach "08" und gibt sich weder mit 0 noch 8 oder 80 zufrieden.
Denkfehler meinerseits.(Lag wohl daran, das ich gegrübelt habe warum in einer bat in der ersten Zeile Ziffern stehen könnten)
Gruß
edit
@ Bastla:
jau - das ^ ist zwar zuviel, aber ich habe heute ein paar Tüten Buchstabensuppe bekommen - und wußte nicht wohin mit den abgebrochenen "M"- oder waren das "W"? und da dachte ich - komm schadet nicht, fällt keinem auf
Und für das "set /p tempi=<" ich wollte es aus so aussehen lassen, als ob es aus einem Guß wäre - schöner ist (wie so oft) dein Weg
/edit
Hallo maccoX und willkommen im Forum, hallo T-Mo!
Da hat sich ein unnötiges "^" eingeschlichen - besser so:
Außerdem wäre zu berücksichtigen, dass ev auch Teile einer Zahl gefunden werden - daher würde ich dafür sorgen, dass vor und nach jeder Zahl ein Komma steht - zusammen mit einer Alternative zum Einlesen der ersten Zeile etwa:
Noch als Nachtrag zu:
Grüße
bastla
[Edit] Was bin ich heute wieder flott ...
[/Edit]
[Edit2] @t-mo

[/Edit2]
Da hat sich ein unnötiges "^" eingeschlichen - besser so:
echo %tempi% |find "%tempo%" && echo gefunden ||echo nicht gefunden
set /p tempi=<doit.bat
echo ,%tempi%,|findstr ",%tempo%,">nul && echo gefunden ||echo nicht gefunden
... keine Leerzeichen vor dem <id> akzeptiert ...
Wenn auch das Leerzeichen als Delimiter verwendet wird, sollte doch auch diese Kuh vom Eis sein (innerhalb der gesuchten Zahl wird's ja wohl kein störendes Leerzeichen geben) ...Grüße
bastla
[Edit] Was bin ich heute wieder flott ...
[Edit2] @t-mo
schöner ist (wie so oft) dein Weg 
Ist doch sowieso (wie auch in diesem Fall) zumeist nur "nachempfundener" Biber ... [/Edit2]
Hallo maccoX!
Weshalb muss es denn die erste Zeile sein? Wenn Du zB eine Zeile
irgendwo in der Batchdatei unterbringst, kann mit
ja gezielt danach gesucht und der relevante Teil ausgelesen werden ...
Grüße
bastla
Weshalb muss es denn die erste Zeile sein? Wenn Du zB eine Zeile
::DATA 01,02,05,120,23
for /f "tokens=2" %%i in ('findstr /b "::DATA" doit.bat') do set "tempi=%%i"
Grüße
bastla
Hallo maccoX!
- und eigentlich sollte eine Zeile
nur mit dem zusätzlichen Leerzeichen als "delimiter" richtig zerlegt werden - ohne sollte nicht "12", sondern "id" in der Variablen %tempo% landen (und tut's bei meinen Tests auch), da die führenden Leerzeichen so "token" Nummer 1 ergeben ...
Grüße
bastla
Das hier hab ich zwar nicht ganz verstanden wie ich so mein "<id>01</id>" in der xml per Leerzeichen einrücken kann ohne das es das Einlesen stört
Gemeint war:for /f "tokens=2 delims=<> " %%a in ('more +7 data.xml') do if not defined tempo set tempo=%%a
<id>12</id>
Grüße
bastla
Hallo maccoX!

Die Lösung ist aber ziemlich einfach: Damit die Variable wieder verwendbar wird, muss sie vorweg gelöscht werden - also:
Grüße
bastla
Dachte auch es liegt am " if not defined varx"
Tut es auch - es wird nur ein Wert in die Variable geschrieben, wenn sie noch keinen hat (= eigentlich noch gar nicht vorhanden ist) - damit wird verhindert, dass der Wert durch die nachfolgend eingelesenen Zeilen (die "for /f
"-Schleife geht immer die gesamte Datei durch) überschrieben wird.aber wenn ich das rausnehme geht gar nichts mehr
Grund: Siehe gleich oberhalb ... Die Lösung ist aber ziemlich einfach: Damit die Variable wieder verwendbar wird, muss sie vorweg gelöscht werden - also:
set "var1="
bastla

Salü,
Danke für das Danke und das zweitschönste, das direkt hinter einem Danke steht ist - wenn wir das kurz und knackig Wie kann ich einen Beitrag als gelöst markieren? haben und du was dazu gelernt hast
.
retour
Danke für das Danke und das zweitschönste, das direkt hinter einem Danke steht ist - wenn wir das kurz und knackig Wie kann ich einen Beitrag als gelöst markieren? haben und du was dazu gelernt hast
Gruß maccoX
retour