![]() |
Auch die PowerShell bietet umfangreiche Möglichkeiten zur XML-Behandlung über einen speziellen Datentyp. Darüber hinaus kann dabei die große PowerShell-Stärke, der Pipeline Processor, eingesetzt werden.
Variablen, die XML-Daten enthalten sollen, müssen bei der ersten Verwendung über [XML] deklariert werden. Die Daten selbst können direkt übergeben oder aus einer Datei geladen werden. Beispiele:
[XML]$x = „<mitarbeiter><person>Mustermann</person></mitarbeiter>“
[XML]$x = get-content c:\mitarbeiter.xml
Das Speichern der XML-Daten wird über die Methode Save der XML-Klasse erledigt. Dort werden mit dem Parameter Pfad und Dateiname übergeben:
$x.Save(„c:\ausgabe.xml“)
Das Auslesen von XML-Daten in einer Variablen gestaltet sich recht einfach, indem die Bezeichner aus der Elementhierarchie genutzt werden. Anhand folgender Daten soll dies verdeutlicht werden:
<Mitarbeiter>
<Person>
<Name>Meier</Name>
<Tel>(0123)4567</Tel>
</person>
<Person>
<Name>Schuster</Name>
<Tel>(0987)6543</Tel>
</person>
</mitarbeiter>
Wird der Inhalt von $x ausgegeben, erscheint nur das Root-Element Mitarbeiter:
PS C:\> $x
Mitarbeiter
-----------
Mitarbeiter
Die tiefer liegenden Elemente können über ihre Bezeichner angesprochen werden. Diese werden mit einem Punkt vom Variablennamen getrennt.
PS C:\> $x.Mitarbeiter
Person
------
{Meier, Schuster}
Dieses Spiel lässt sich nun immer weiter fortführen:
PS C:\> $x.Mitarbeiter.Person
Name Tel
---- ---
Meier (0123)4567
Schuster (0987)6543
Werden wie im vorhergehenden Fall mehrere Elemente geliefert, kann über die Arrayindizierung direkt darauf zugegriffen werden:
PS C:\> $x.Mitarbeiter.Person[0]
Name Tel
---- ---
Meier (0123)4567
Außerdem können die Elemente auch über die PowerShell-Pipeline weiterverarbeitet werden, etwa mit dem Cmdlet where-object zur Suche nach den Daten eines bestimmten Mitarbeiters:
$x.Mitarbeiter.Person | where-object { $_.Name -eq „Meier“ }
Ein neues XML-Element wird über die Methode CreateElement der XML-Klasse angelegt. Als Parameter wird dabei der gewünschte Name des neuen Elements übergeben.
$e = $x.CreateElement(„Person“)
Soll das neue Element einen Wert erhalten, würde er mit der Methode set_InnerText angegeben. Im Beispiel wäre dies etwa bei einem Name-Element der Fall.
$e.set_InnerText(„Bauer“)
CreateElement gibt das neue Element zurück, es ist jedoch noch nicht in die vorhandene XML-Struktur eingebunden. Dies muss erst über die Methode AppendChild an der gewünschten Stelle vorgenommen werden.
$x.Mitarbeiter.AppendChild($e)
Das Entfernen vorhandener Elemente wird mit RemoveChild durchgeführt, wobei als Parameter das entsprechende XML-Element-Objekt übergeben wird.
Neben neuen XML-Elementen können auch Attribute angelegt werden. Das Vorgehen ist dabei ähnlich. Zuerst wird über CreateAttribute das neue Attribut erstellt.
$a = $x.CreateAttribute(„Ersteller“)
Als nächstes wird der gewünschte Wert über die Methode set_Value gesetzt.
$a.set_Value(„Schmidt“)
Zuletzt wird das neue Attribut mit SetAttributeNode zum zugehörigen Element hinzugefügt.
$a.Mitglieder.SetAttributeNode($a)
Auch hier gibt es mit RemoveAttribute eine Methode zum Entfernen.
Wie so oft lohnt es sich, den Aufbau der auftretenden Objekte mit Hilfe des Cmdlets get-member aufzulisten, um alle verfügbaren Eigenschaften und Methoden zu ermitteln und weitere Bearbeitungsmöglichkeiten zu entdecken.
Anhand der gezeigten Beispiele wird die Leistungsfähigkeit der PowerShell bei der XML-Daten-Bearbeitung deutlich. Entwickler, die bisher mit VBScript und den Microsoft COM-Objekten zur XML-Bearbeitung gearbeitet haben, werden dies zu schätzen wissen.
Im nächsten Teil der PowerShell-Artikelserie zeigt SearchNetworking, wie der neue Microsoft Exchange Server 2007 die PowerShell zur Konfiguration und Administration nutzt.
Microsoft Deutschland GmbH
Firmenprofil
Kontakt
posted am 01.09.2010 um 11:10 von Joachim Bernert
posted am 31.08.2010 um 11:03 von nicht registrierter User
posted am 30.08.2010 um 22:15 von nicht registrierter User
posted am 30.08.2010 um 17:01 von nicht registrierter User
posted am 26.08.2010 um 11:40 von Leserbrief SNET
(nicht registrierter User)
Kommentar abschicken