Erzeugen von XML Dateien
Anhand einer Städteliste im XML Format möchte ich die Erzeugung einer XML Datei mit PowerShell Mitteln darstellen. So soll die Datei am Ende aussehen:
Am einfachsten erzeugen Sie XML Dateien mit der New-Object Funktion. Hierbei können Sie direkt das XML Format an den Konstruktor übergeben und so eine Datei erzeugen lassen. Das XmlTextWriter Objekt muss wissen, wie der Name der Datei ist. Über $Null erstellen Sie die Datei ohne Inhalt.
Um das XML Format leichter lesen zu können, sind einige Formatierungen erforderlich. Der Kosmetik halber rücke ich gerne mit Tabulatoren ein 🙂
Jetzt füllen wir das XML entsprechend mit Inhalt. Zuerst wird das XML mit WriteStartDocument erstellt. Als nächstes folgt das neue Element mit WriteStartElement. Im ersten Fall die gesamte Liste. Danach wieder mit WriteStartElement das erste Element für „Frankfurt“. Jetzt werden die jeweiligen Element Daten mit WriteElementString gesetzt und das Element nach Abschluss wieder mit WritEndElement geschlossen. Wenn alle Städte eingegeben wurden, muss auch die Liste wieder mit WriteEndElement geschlossen werden. Und natürlich die Datei nicht vergessen und mit WriteEndDocument schliessen.
Zum Abschluß noch der Ordnung halber den Buffer löschen und den Stream schliessen.
Hier alles in einem Script:
Export-CliXml
Die Powershell bietet auch die Möglichkeit, Abfragen so ziemlich jeglicher Art in einem XML abzulegen, um sie dort weiter zu verarbeiten. Beispiel ist eine Abfrage, um DCs einer Domäne zu erhalten und diese zur Weiterverarbeitung in einem XML zu speichern. Sie erreichen dies mit dem CmdLet Export-Clixml. Mit Select-Object können Sie schon beim Export auswählen, welche Properties nachher im XML zu finden sind.
Damit erhalten sie ein XML mit den Daten Name, Domäne und IP Adresse aller DCs einer Domäne:
Lesen von XML Dateien
XML Dateien bieten den Vorteil, dass die Powershell den Inhalt gleich als Objekt weiter verarbeiten kann und die Sprache XML versteht.
Am einfachsten erkennen Sie dies, wenn sie den Inhalt einer XML in eine Variable einlesen. Wenn Sie diese Variable nachher ausgeben, sehen Sie, dass der Inhalt einfach Zeile für Zeile gelesen wurde und so die eigentliche XML Funktionalität verloren ging
Wenn Sie beim Einlesen allerdings schon das Format mit angeben, kann die Powershell die Datei und damit deren Inhalt als XML Objekt verarbeiten. Sie erreichen dies, wenn sie der Variablen das Format XML mitgeben. Typecasting heißt hier das Zauberwort 🙂
Sie können in den Daten auch suchen. Das XML Format bietet eine Fülle von Methoden zur Weiterverarbeitung. Über get-member können Sie sich die entsprechenden Methoden anschauen
Hier ein Beispiel für die Verwendung der Methode SelectNodes
Damit haben sie alle Möglichkeiten der Weiterverarbeitung, die ein Objekt mit sich bringt. Hier noch ein paar Beispiele
- … liefert alle Städte, die größer als 520.000 Einwohner sind.
- … liefert alle Städte, die in einem Bundesland beginnend mit Hess liegen.
- … liefert die Gesamtanzahl der Städte mir der Summe aller Einwohner.
Für die über Export-Clixml erstellte Datei gelten natürlich die gleichen Voraussetzungen
- … liefert alle Maschinen mit dem Namen “Server…”.
- … liefert alle Maschinen, die eine 12 in ihrer IP Adresse haben.
XML Bearbeiten
Natürlich können Sie eine solche XML auch weiter bearbeiten und Objekte z.B. hinzufügen. Nehmen wir weiter das Städtebeispiel und fügen noch eine Stadt hinzu. Nehmen wir Augsburg noch dazu.
Dazu lesen wir die Datei zuerst wieder in eine Variable im XML Format ein:
Dann müssen die neuen Elemente erstellt …
…und natürlich auch mit Leben gefüllt werden.
Im nächsten Schritt werden die einzelnen Objekte den übergeordneten über AppendChild angehängt.
Dazu wird die Variable $new deklariert und mit Leben gefüllt. (@Mirco: Danke für den Hinweis)
Das eigentliche neue Objekt muss nun noch in die Liste hinzugefügt werden.
Und abspeichern müssen Sie das alles natürlich auch noch
Und schon ist die Liste erweitert
Hallo Marco,
Das war´s! Vielen Dank für die Ergänzung. Ehrlich gesagt, eine logische Sache, warum bin ich nicht selbst darauf gekommen? 🙂
Übrigens: Ich habe wirkliche keine andere Seite gefunden, die das Thema so gut und verständlich wie hier behandelt hat. Ich musste zwar alles abtippen, um nachvollziehen zu können, aber das übt 😉
Liebe Grüße!
Hallo Mirco,
Da ist mir bei der Erstellung wohl eine Zeile abhanden gekommen 😉
Schau noch mal rein, ob Du jetzt damit klar kommst.
Danke für den Tipp.
VG
Marco
Hallo Marco,
vielen Dank erstmal für die sehr gute und verständliche Anleitung. Allerdings habe ich beim Bearbeiten von XML-Dateien ein Verständnisproblem. Du schriebst:
“Im nächsten Schritt werden die einzelnen Objekte den übergeordneten über AppendChild angehängt:” Dann arbeitest du mit einer nicht vorher definierten Variablen “$new”. Ich babe versucht, mit
$new = $xml.DocumentElement
leider führt das beim vorletzten Schritt:
$xml.list.AppendChild($new)
zu einer Fehlermeldung:
“Ausnahme beim Aufrufen von “AppendChild” mit 1 Argument(en): “Kann keinen Knoten oder frühere Version des Knotens als sich selbst untergeordneter
Knoten einfügen….”
Könntest du mir bitte weiterhelfen?
Wie wäre es damit?
$element = $xml.List.town | ? name -like “*Frank*”
$element.RemoveAll()
Die Funktion RemoveElement() gibt es nicht.
Können Sie das entfernen von XML-Einträgen näher definieren?