XML Bearbeiten/batch/powershell/editor?
Hallo und Guten Tag,
Ich versuche eine txt/Xml(steht xml hinten dran, speichert sich aber als txt) Datei mithilfe einer Batch Datei (weil mir nur der TextEditor zu Verfügung steht) Automatisch zu bearbeiten.
dazu muss ich die Zeile <FVALUE> finden. Darin steht z.B:
<FVALUE>Comfort;K10</FVALUE>
diese Zeile kommt häufiger vor, Inhalt ist unterschiedlich, menge an Semikolons auch.
Problem ist Sie muss ab einem Semikolon in eine neue Zeilen aufgeteilt werden.
<FVALUE>Comfort</FVALUE>
<FVALUE>K10</FVALUE>
Das Semikolon soll ganz verschwinden.
Ich bin Code Anfänger und hab meine Ansätze übern Haufen geworfen, weil mir in anderen Foren gesagt wurde das ich aufm Holzweg bin.
Ich hoffe mir kann jemand einen Ansatz, ne Fertig Lösung oder so geben.
Liebe Grüße
2 Antworten
Demo.cmd
@echo off
chcp 65001 >nul
set "XMLFile=Dateiname.xml"
set "outFile=new.%XMLFile%"
ren leere Ausgabedatei.
(call ) >"%outFile%"
rem XMLdatei einlesen wie sie ist (inklusive evtl. Leerzeilen)
for "tokens=1* delims=]" %%a in ('type "%XMLFile%"^|find /v /n ""') do (
rem wenn Suchterm in Zeile
echo %%b|find /i "Comfort;" && (
rem trenne an Semikolon..
for /f "tokens=1* delims=;" %%f in ("%%b") do (
rem gib 1.Teil und komplettiere...
>>"%outFile%" echo %%f^</FVALUE^>
rem dito 2.Teil...
>>"%outFile%" echo ^<FVALUE^>%%g
)
) || (
rem wenn kein Suchterm, Zeile wie sie war schreiben.
>>"%outFile%" echo:%%b
)
)
echo Wenn es geklappt hat, sollte die überarbeitete Datei angezeigt werden:
type "%outFile%"
pause
Eigentlich bin ich schon auf dem Weg in den Urlaub und sollte das nicht tun... (aber auf dem Beifahrersitz ist es langweilig 😴🤤)
Ich übernehme keine Gewähr, da ich das Ding auf dem Handy im GF-Editor geschrieben habe und nicht testen konnte.
Auch jemand wie ich kann mal einen Lapsus haben, deshalb gebe ich sonst nie ungetestete Sachen raus.
Wenn ich keinen Fehler gemacht habe sollte die Batch genau das tun, was Du in deiner Frage beschrieben hast.
Wenn nicht, wirst Du Dich bis 30. September gedulden müssen.
Da ich die genaue Struktur der XML-Datei nicht kenne, weiß ich nicht wie weit ich den 2.Teil (neue Zeile) einrücken müsste und eine Automatische Erkennung würde meine Möglichkeiten auf dem Handy sprengen. Programmieren auf dem Handy ist keine Wonne und schon diese Paar Zeilen sehen beim Schreiben recht chaotisch aus, weil der Editor automatisch umbricht und die Übersichtlichkeit stört.
...weil mir in anderen Foren gesagt wurde das ich aufm Holzweg bin.
🤣Pappnasen...
...geht nicht gibt's nicht. (Bestenfalls ist es nicht einfach)
Ich versuche das ganze mittlerweile mit PowerShell, aber irgendwie ist das auch nicht so das Wahre. Falls du noch Lust hast, kannst du mir gerne sagen, was du brauchst um das richtig anzupassen:))))
Hi, es tut nicht so ganz, aber habe zumindest bisschen mehr über Batch Code gelernt :D
Da ich nicht die genauen Hierarchien in Deiner XML-Datei kenne, wäre es mühsam mich mit XPath durch ein XML-Objekt zu hangeln. Noch unhandlicher wäre das Ganze in purem Powershell, da mir die Struktur nicht bekannt ist.
Ich belasse es einstweilen einfach bei fieser kleiner Stringakrobatik und baue einfach die gesuchten Zeilen um. (mit dem Kopf durch die Wand). Ich brauche mir auf diese Weise keine Gedanken machen, wie Tief "FVALUE" verschachtelt ist...
demo.xml
$XMLFile='file.xml' #hier Dein Dateiname
$outFile='new.'+$XMLFile
$XMLText=gc $XMLFile #Datei ganz normal als Text einlesen
#ganz primitive Stringakrobatik
$NewRawXML=$XMLText|%{
if ($_ -match '\<\/*FVALUE\>' -and $_ -match ';') { #wenn die Zeile den String "<FVALUE>" bzw. "</FVALUE>" enthält und mindestens ein Semikolon...
$toSplit=$_ -replace '\<\/*FVALUE\>','' #entferne erstmal <FVALUE>" und "</FVALUE>" (stört beim Teilen)
$toSplit=$toSplit.trimstart() #führende Tabs oder Leerzeichen können wir auch nicht gebrauchen, weg damit.
$NewLines=$toSplit -split ';'|%{ #am Semikolon teilen ...
'<FVALUE>{0}</FVALUE>' -f $_ #...und alle Stücke mit neuen tags <FVALUE> und </FVALUE> versehen
}
$NewLines #die Neuen Zeilen über die Pipe an $NewRawXML ausgeben
#die folgenden 3 Zeilen zeigen lediglich was passiert (bei Fund) kann weg
write-host -fo yellow $_ #gefundene Zeile
write-host -fo red $toSplit #der zu teilende String
$NewLines|%{write-host -fo blue $_} #die Neuen Zeilen
}
else {
$_ #die Neuen Zeilen über die Pipe an $NewRawXML ausgeben
#die folgende Zeile zeigt wieder was passiert (ohne Fund) kann weg
write-host -fo green $_
}
}
#erst hier machen wir aus dem Text ein XMLObject
$NewXMLObject=[XML]$NewRawXML
#mal anzeigen
write-host -fo Magenta $NewXMLObject.OuterXML
#speichern, dabei werden auch gleich die passenden Einrückungen erzeugt
$NewXMLObject.save($outFile)
#nochmal die neue Datei anzeigen
'neue Datei:'
gc $outFile|%{
if ($_ -match '\<FVALUE\>') {
write-host -fo blue $_ #gefundene Zeile
}
else {
write-host -fo green $_
}
}
pause
lasse ich allen erklärenden Schnickschnak weg, bleiben 6 funktionale Zeilen:
$XMLFile='file.xml'
$outFile='new.'+$XMLFile
[XML]$NewXMLObject=gc $XMLFile|%{
if ($_ -match '\<\/*FVALUE\>' -and $_ -match ';') {
$_.replace('\<\/*FVALUE\>','').trimstart().split(';')|%{'<FVALUE>{0}</FVALUE>' -f $_}
}
else {$_}
}
$NewXMLObject.save($outFile)
Hier noch der Testfile, mit welchem ich probiert habe:
file.xml
<ROOT>
<PARENT>
<PARENT2>
<FVALUE>AAA</FVALUE>
</PARENT2>
<PARENT3>
<FVALUE>BB B;CCC;D DD</FVALUE>
</PARENT3>
<PARENT4>
<FVALUE>EEE</FVALUE>
</PARENT4>
<PARENT5>
<FVALUE>FFF</FVALUE>
</PARENT5>
</PARENT>
<PARENT21>
<PARENT211>
<FVALUE>GGG</FVALUE>
</PARENT211>
<PARENT311>
<FVALUE>HHH;III</FVALUE>
</PARENT311>
<PARENT411>
<FVALUE>JJJ;KKK</FVALUE>
</PARENT411>
<PARENT511>
<FVALUE>LLL</FVALUE>
</PARENT511>
</PARENT21>
</ROOT>
Schlimmer kann Deine Datei kaum sein. Ich habe schon einige Fieslichkeiten eingebaut.