2 Zeilen einer mit Operator beginnenden XML-Datei auslesen und überschreiben
Hallo allerseits,
die Threads hier im Forum haben meine dürftigen Stapelverabeitungskenntnisse bereits ein ums andere Mal ausgezeichnet kompensiert. An dieser Stelle ein Dankschön an bastla, biber und miniversum. Allerdings stoße ich trotz einiger ähnlicher Problemstellungen in andernen Forenbeiträgen mit dem folgenden Problem nun wirklich an meine Grenzen.
Vorab die Info, dass es sich bei meinem Problem nur um einen Auszug meiner batch-Datei handelt. Ich möchte das folgende Teil-Problem unbedingt auch in der Batch lösen und extern allenfalls mithilfe von "call" ein vbs-script aufrufen müssen.
Der Prozess den ich Automatisieren will, nutzt eine XML-Datei als Input-file (d.h. 1 Prozessschritt = Programmaufruf + Prozessierung einer Datei mit bestimmten I/O-Parametern) In der XML-Datei sind in den Zeilen 8 und 9 die Input- und Output-pfade für je 1 Prozessschritt verankert. Um mehrere Datein nacheinander zu prozessieren müsste die XML-Datein in einer Schleife editiert werden. Dabei sollen in jedem Schleifendurchlauf die I/O-Parameter (aus einem anderen Teil der batch) übergeben und in die entsprechenden Zeilen geschrieben werden. Diese beiden Zeilen sehen folgendermaßen aus:
Ein großes Problem stellt für mich der Umgang mit den "<,>"-Operatoren am Zeilenanfang und -ende dar.
Da ich mich mit XMLs in keinster Weise auskenne, gehe ich davon aus, dass die Einrückweite am Zeilenanfang syntaktisch wichtig ist und die Leerzeichen beim überschreiben erhalten bleiben müssen.
Schon mal im Voraus vielen Dank für's Kopfzerbrechen.
Beste Grüße,
Dertii
die Threads hier im Forum haben meine dürftigen Stapelverabeitungskenntnisse bereits ein ums andere Mal ausgezeichnet kompensiert. An dieser Stelle ein Dankschön an bastla, biber und miniversum. Allerdings stoße ich trotz einiger ähnlicher Problemstellungen in andernen Forenbeiträgen mit dem folgenden Problem nun wirklich an meine Grenzen.
Vorab die Info, dass es sich bei meinem Problem nur um einen Auszug meiner batch-Datei handelt. Ich möchte das folgende Teil-Problem unbedingt auch in der Batch lösen und extern allenfalls mithilfe von "call" ein vbs-script aufrufen müssen.
Der Prozess den ich Automatisieren will, nutzt eine XML-Datei als Input-file (d.h. 1 Prozessschritt = Programmaufruf + Prozessierung einer Datei mit bestimmten I/O-Parametern) In der XML-Datei sind in den Zeilen 8 und 9 die Input- und Output-pfade für je 1 Prozessschritt verankert. Um mehrere Datein nacheinander zu prozessieren müsste die XML-Datein in einer Schleife editiert werden. Dabei sollen in jedem Schleifendurchlauf die I/O-Parameter (aus einem anderen Teil der batch) übergeben und in die entsprechenden Zeilen geschrieben werden. Diese beiden Zeilen sehen folgendermaßen aus:
<InputProduct file="Das_ist_die_input_file.N1" />
<OutputProduct file="Das_ist_die_output_file.dim" format="BEAM-DIMAP" />
Ein großes Problem stellt für mich der Umgang mit den "<,>"-Operatoren am Zeilenanfang und -ende dar.
Da ich mich mit XMLs in keinster Weise auskenne, gehe ich davon aus, dass die Einrückweite am Zeilenanfang syntaktisch wichtig ist und die Leerzeichen beim überschreiben erhalten bleiben müssen.
Schon mal im Voraus vielen Dank für's Kopfzerbrechen.
Beste Grüße,
Dertii
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115761
Url: https://administrator.de/forum/2-zeilen-einer-mit-operator-beginnenden-xml-datei-auslesen-und-ueberschreiben-115761.html
Ausgedruckt am: 21.04.2025 um 14:04 Uhr
20 Kommentare
Neuester Kommentar
Hallo
Da es sich ja immer um die gleiche XML Datei handelt und du auch die Zeilen genau kennst und es auch immer die Zeilen 8 und 9 sind die du editieren willst könntest du das Problem auch anders lösen. Statt diese beiden Zeilen zu editieren könntest du sie, in eine temponäte Datei, neu schreiben und die restlichen Zeilen aus der Orginaldatei dazupacken. Später kannst du die temponäre Datei dann wieder löschen. Vielleicht wäre das ja eine alternative für dich.
Das ganze würde dan so aussehen:
Da es sich ja immer um die gleiche XML Datei handelt und du auch die Zeilen genau kennst und es auch immer die Zeilen 8 und 9 sind die du editieren willst könntest du das Problem auch anders lösen. Statt diese beiden Zeilen zu editieren könntest du sie, in eine temponäte Datei, neu schreiben und die restlichen Zeilen aus der Orginaldatei dazupacken. Später kannst du die temponäre Datei dann wieder löschen. Vielleicht wäre das ja eine alternative für dich.
Das ganze würde dan so aussehen:
set "XMLfile=org.xml"
set "tempXMLFile=temp_%XMLfile%"
set "space= "
set "infile=Das_ist_die_input_file.N1"
set "outfile=Das_ist_die_output_file.dim"
echo XML Zeile1>"%tempXMLFile%"
echo XML Zeile2>>"%tempXMLFile%"
echo XML Zeile3>>"%tempXMLFile%"
echo XML Zeile4>>"%tempXMLFile%"
echo XML Zeile5>>"%tempXMLFile%"
echo XML Zeile6>>"%tempXMLFile%"
echo XML Zeile7>>"%tempXMLFile%"
echo %space%^<InputProduct file="%infile%" /^>>>"%tempXMLFile%"
echo %space%^<OutputProduct file="%outfile%" format="BEAM-DIMAP" /^>>>"%tempXMLFile%"
more +9 "%XMLfile%">>"%tempXMLFile%"
...
tu was mit der temponären xml Datei
...
del "%tempXMLFile%"
Hallo Dertii und willkommen als Mitglied!
Da ich mich irgendwie angesprochen fühle
(und Du VBS explizit nicht ausgeschlossen hast), ein Ansatz mit einem (vom Batch erzeugtem) VB-Script:
Auch dieser Ansatz geht davon aus, dass die hinsichtlich des Aufbaues bekannten Zeilen 8 und 9 einfach neu geschrieben werden können.
Zum Script: Nach dem Einlesen stehen die einzelnen Zeilen im (nullbasierten - daher wird Zeile 8 mit Index 7 angesprochen) Array "T". Darin werden die beiden relevanten Zeilen durch aus den konstanten Teilen und den als Parametern übergebenen "In"- und "Out"-Files kombinierte neue Zeilen ersetzt. Danach überschreibt das Script die gesamte XML-Datei mit den neuen (bzw großteils alten) Zeilen. Anzumerken wäre noch, dass Anführungszeichen, welche als solche (und nicht als Textbegrenzung) verwendet werden sollen, in VBS verdoppelt werden müssen.
Grüße
bastla
Da ich mich irgendwie angesprochen fühle
@echo off & setlocal
set "XMLFile=D:\Datei.xml"
set M=%temp%\ModifyPath.vbs
>%M% echo Set fso=CreateObject("Scripting.FileSystemObject"):T=Split(fso.OpenTextFile("%XMLFile%").ReadAll,vbCrLF)
>>%M% echo T(7)=" <InputProduct file=""" ^& WScript.Arguments(0) ^& """ />"
>>%M% echo T(8)=" <OutputProduct file=""" ^& WScript.Arguments(1) ^& """ format=""BEAM-DIMAP"" />"
>>%M% echo fso.CreateTextFile("%XMLFile%",True).Write Join(T,vbCrLF)
::Demo mehrfacher Aufruf
cscript //nologo %M% "Das_ist_die_input_file.N1" "Das_ist_die_output_file.dim"
type "%XMLFile%"
echo\
cscript //nologo %M% "ein_anderes_rein.N1" "und_wieder_raus.dim"
type "%XMLFile%"
Zum Script: Nach dem Einlesen stehen die einzelnen Zeilen im (nullbasierten - daher wird Zeile 8 mit Index 7 angesprochen) Array "T". Darin werden die beiden relevanten Zeilen durch aus den konstanten Teilen und den als Parametern übergebenen "In"- und "Out"-Files kombinierte neue Zeilen ersetzt. Danach überschreibt das Script die gesamte XML-Datei mit den neuen (bzw großteils alten) Zeilen. Anzumerken wäre noch, dass Anführungszeichen, welche als solche (und nicht als Textbegrenzung) verwendet werden sollen, in VBS verdoppelt werden müssen.
Grüße
bastla
Hallo Sebastian!
Da es bei Deiner Zusatzbastelei (anscheinend) um eine Pfadzerlegung geht, solltest Du Dir einmal die Hilfe zu "for" (und dort - gegen Ende - den Teil bezüglich der "Ersetzung von Verweisen") ansehen - vielleicht reduziert sich das Problem dann auf etwas in der Art:
Grüße
bastla
... ob ich Auszüge deiner Erklärungen in die Doku übernehmen dürfte? Hab nämlich keine Ahnung wie es sich bei solchen Sachverhalten mit Plagiaten verhält.
Die Plagiatsfrage musst Du natürlich selbst (mit Deinem Professor) abklären - was mich anlangt, kannst Du das bisschen Code und die (eigentlich ohnehin nicht vorhandene) Doku gerne für was auch immer verwenden ...Da es bei Deiner Zusatzbastelei (anscheinend) um eine Pfadzerlegung geht, solltest Du Dir einmal die Hilfe zu "for" (und dort - gegen Ende - den Teil bezüglich der "Ersetzung von Verweisen") ansehen - vielleicht reduziert sich das Problem dann auf etwas in der Art:
for %%i in ("%SOURCE_C2R%\*.N1") do set "dimPfad=%TAR_PATH%\%%~ni.dim"
bastla
Hallo Sebastian!
Um an die aktuellen Werte innerhalb der Schleife zu kommen, kannst Du entweder "delayedExpansion" oder ein Unterprogramm verwenden:
Unterprogrammvariante (verhält sich wie ein neuer Batch, daher auch %1 für den Übergabeparameter) :
Grüße
bastla
[Edit] Meine Antwort bezieht sich auf eine vorher etwas anders formulierte Fragestellung [/Edit]
Deshalb gehe ich davon aus, dass die Variablen keinen Wert zugewiesen bekommen. Stimmt das?
Die Variablen erhalten zwar einen Wert (kannst Du erkennen, wenn Du die Ausgabe der Variableninhalte nach dem Schleifenende versuchst), aber der Interpreter liest den Wert nur einmalig zu Beginn der Schleife - da hatten sie wirklich (noch) keinen Inhalt ...Um an die aktuellen Werte innerhalb der Schleife zu kommen, kannst Du entweder "delayedExpansion" oder ein Unterprogramm verwenden:
@echo off & setlocal enabledelayedexpansion
for %%a in ("%SOURCE_C2R%\*.N1") do (
set "File=%%~na"
set "Extension=%%~xa"
set "FileExt=%%~nxa"
echo !File!!Extension! oder auch !FileExt!
)
@echo off & setlocal
for %%a in ("%SOURCE_C2R%\*.N1") do call :ProcessFile "%%a"
goto :eof
:ProcessFile
set "File=%~n1"
set "Extension=%~x1"
set "FileExt=%~nx1"
echo %File%%Extension% oder auch %FileExt%
goto :eof
bastla
[Edit] Meine Antwort bezieht sich auf eine vorher etwas anders formulierte Fragestellung [/Edit]
Hallo Sebastian!
Ohne der Variablen %REQUEST_XML% einen Wert zugewiesen zu haben, wird's mit dem Script etwas schwierig
...
Die Fehlermeldung bezieht sich allerdings auf die fehlenden Anführungszeichen um "property file" herum - diese müssen wiederum verdoppelt werden.
"delayedexpansion" kannst Du Dir übrigens sparen - wenn Du %DIM_PATH% nicht noch für andere Zwecke benötigen solltest, dann genügt eine Schleife der Art
Andrenfalls müsste in Zeile 20 die Schreibweise für "%DIM_PATH%" allerdings "!DIM_PATH!" lauten.
Grüße
bastla
Ohne der Variablen %REQUEST_XML% einen Wert zugewiesen zu haben, wird's mit dem Script etwas schwierig
Die Fehlermeldung bezieht sich allerdings auf die fehlenden Anführungszeichen um "property file" herum - diese müssen wiederum verdoppelt werden.
"delayedexpansion" kannst Du Dir übrigens sparen - wenn Du %DIM_PATH% nicht noch für andere Zwecke benötigen solltest, dann genügt eine Schleife der Art
for %%a in ("%SOURCE_C2R%\*.N1") do cscript //nologo %M% %PARAMS_TXT% %%a "%TAR_PATH%\%%~n1.dim"
Grüße
bastla
Hallo Sebastian!
Da Du %%a als Schleifenvariable verwendest, sollte es auch heißen:
Grüße
bastla
P.S.: Nochmals die Frage, ob Du die Variable %DIM_PATH% später nochmals verwendest - wenn nicht, spare die Variable (und "delayedExpansion") ein und rufe in Zeile 26 das Script mit
auf ...
Da Du %%a als Schleifenvariable verwendest, sollte es auch heißen:
set "DIM_PATH=%TAR_PATH%\%%~na.dim"
bastla
P.S.: Nochmals die Frage, ob Du die Variable %DIM_PATH% später nochmals verwendest - wenn nicht, spare die Variable (und "delayedExpansion") ein und rufe in Zeile 26 das Script mit
cscript //nologo %M% "%PARAMS_TXT%" "%%a" "%TAR_PATH%\%%~na.dim"
Dan amchs doch so (ist sowieso, gerade bei längeren Geschichten übersichtlicher):
for %%a in ("%SOURCE_C2R%\*.N1") do goto:C2R_LOOP "%%a"
goto:eof
:C2R_LOOP
:: Aufruf des vbs-Skrips
cscript //nologo %M% "%PARAMS_TXT%" "%1" "%TAR_PATH%\%~n1.dim"
echo. Processing %1 ...
echo C2R Processing finished.
goto:eof