XML-Bearbeitung mit Powershell

Kürzlich habe ich eine Lösung gebraucht, die den Inhalt einer XML-Datei anpasst. Dabei geht es sich um Export-Daten einer Schnittstelle, die nun doch etwas abgeändert im Ziel-Programm ankommen müssen. Diese können aber im Quellprogramm nicht geändert werden und jede Anpassung im Zielprogramm wäre kostspielig. Deshalb habe ich mir einfach ein Powershell-Skript dafür geschrieben.

 

Die erste Möglichkeit ist recht simpel. Einfach „Search & Replace“ mit  Hilfe des Replace-Befehls über den gesamten Inhalt der Datei:

So würde die Testdatei ohne Beachtung der XML-Struktur eingelesen werden, jedes Vorkommnis von „bla“ in ein „blabla“ abgeändert und wieder in dieselbe Datei zurückgeschrieben werden.

 

Allerdings ist dies problematisch, wenn der zu ändernde Wert recht häufig in der Datei vorkommt und nur in bestimmten Fällen abgeändert werden soll. In diesem Fall muss man die XML-Datei auch als solche behandeln und die Daten entsprechend der Struktur einlesen:

Hierbei muss man unter Umständen auf das Encoding der Datei achten. Danach kann man jeden einzelnen Wert in der XML-Struktur „ansprechen“ und auch abändern. Als Beispiel-XML habe ich einfach das Beispiel von w3schools mit Büchern verwendet und beziehe mich darauf.

Man kann nun mit Hilfe der Funktion „Select Nodes“ unterhalb des Roots „bookstore“ den oder die Einträge auswählen, bei denen im Child ein bestimmter Wert für den Subchild „title“ angegeben ist. In diesem Beispiel „Harry Potter“:

In diesem Beispiel würde bei allen gefundenen Children der Wert des Subchilds „price“ mit Hilfe von ForEach-Object in „39.99“ verändert, obwohl dieser mehrfach in der XML-Datei vorkommen könnte, was beim Preis ja nicht ungewöhnlich wäre. So könnte man z. B. auch mit if-Abfragen arbeiten und Werte z. B. nur in bestimmten Fällen abändern oder sogar den Wert auslesen und prozentual anpassen oder dergleichen.

Wenn man die Daten verändert hat, muss man diese noch abspeichern. Entweder in einer neuen Datei oder einfach wieder in die zuvor eingelesene, wenn diese in der Ursprungsform nicht mehr benötigt wird:

 

Je nachdem welche Powershell-Version verwendet gibt es einige unschöne Probleme mit dem Encoding der Datei. Die wenigsten Problem hat man wohl unter Windows 10 bzw. mit der aktuellsten Powershell-Version. Hier funktionierte das ganze reibungslos. Was man beachten sollte und wie man die Probleme mit einem Trick umgehen kann, zeige ich in einem anderen Artikel.

 

Schreibe einen Kommentar