XML Bearbeiten/batch/powershell/editor?

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)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
SolutionSearch 
Fragesteller
 27.09.2021, 15:00

Hi, es tut nicht so ganz, aber habe zumindest bisschen mehr über Batch Code gelernt :D

0
SolutionSearch 
Fragesteller
 01.10.2021, 12:00

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:))))

0

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren