Strings sind auch nur XML-Objekte
Angenehmerweise lassen sich Zeichenketten ohne großen Aufwand in XML-Objekte verwandeln. Dazu genügt es, das gewünschte XML-Dokument als String zusammenzubauen und mit dem Präfix [xml] zu versehen — fertig ist das XML-Objekt.
$myXmlObject = [xml]"<wurzel/>"
Eigenschaften von XML-Objekten
Ein so (oder anders) erzeugtes XML-Objekt besitzt eine Vielzahl von Eigenschaften und Methoden. Wer sich diese nicht merken möchte, sollte sich den Befehl Get-Member notieren. Wie die Hilfeseite (help Get-Member) verrät, »ruft [Get-Member] Informationen über Objekte oder Auflistungen von Objekten ab.« Der Powershell-Einsteiger fragt sich nun vielleicht, wie Get-Member aufzurufen ist. Get-Member könnte eine Methode aller Powershell-Objekte sein – ist es aber nicht. Get-Member könnte ein Objekt als Argument übergeben bekommen – das geht zwar auch, ist aber nicht neu. Vielmehr kommt hier das Objekt-Pipelining der Powershell zum Einsatz. Das sieht so aus:
$myXmlObject | Get-Member
Hier wird das XML-Objekt durch die Pipeling an Get-Member geschickt, was alle Eigenschaften und Methoden listet. Eine ansehnliche Zahl kommt dabei heraus:
TypeName: System.Xml.XmlDocument Name MemberType ---- ---------- ToString CodeMethod add_NodeChanged Method add_NodeChanging Method add_NodeInserted Method add_NodeInserting Method add_NodeRemoved Method add_NodeRemoving Method AppendChild Method Clone Method CloneNode Method CreateAttribute Method CreateCDataSection Method CreateComment Method CreateDocumentFragment Method CreateDocumentType Method CreateElement Method CreateEntityReference Method CreateNavigator Method CreateNode Method CreateProcessingInstruction Method CreateSignificantWhitespace Method CreateTextNode Method CreateWhitespace Method CreateXmlDeclaration Method Equals Method GetElementById Method GetElementsByTagName Method GetEnumerator Method GetHashCode Method GetNamespaceOfPrefix Method GetPrefixOfNamespace Method GetType Method get_Attributes Method get_BaseURI Method get_ChildNodes Method get_DocumentElement Method get_DocumentType Method get_FirstChild Method get_HasChildNodes Method get_Implementation Method get_InnerText Method get_InnerXml Method get_IsReadOnly Method get_Item Method get_LastChild Method get_LocalName Method get_Name Method get_NamespaceURI Method get_NameTable Method get_NextSibling Method get_NodeType Method get_OuterXml Method get_OwnerDocument Method get_ParentNode Method get_Prefix Method get_PreserveWhitespace Method get_PreviousSibling Method get_SchemaInfo Method get_Schemas Method get_Value Method ImportNode Method InsertAfter Method InsertBefore Method Load Method LoadXml Method Normalize Method PrependChild Method ReadNode Method RemoveAll Method RemoveChild Method remove_NodeChanged Method remove_NodeChanging Method remove_NodeInserted Method remove_NodeInserting Method remove_NodeRemoved Method remove_NodeRemoving Method ReplaceChild Method Save Method SelectNodes Method SelectSingleNode Method set_InnerText Method set_InnerXml Method set_Prefix Method set_PreserveWhitespace Method set_Schemas Method set_Value Method set_XmlResolver Method Supports Method Validate Method WriteContentTo Method WriteTo Method Item ParameterizedProperty wurzel Property
XML-Objekte manipulieren
Die Manipulation von XML-Objekten ist ziemlich einfach. Wer das bereits in .Net gemacht hat (oder DOM-Programmierung kennt) muss nicht umdenken. Als Beispiel hänge ich im folgenden ein neues Kindelement an $myXmlObject. Das Kindelement konstruiere ich aus einem String:
$myChild = [xml]"<kindelement>Hallo Welt!</kindelement>"
Um $myChild (das ist ein Objekt vom Typ System.Xml.XmlDocument) in $myXmlObject einhängen zu können, muss ich es erst in einen Knoten verwandeln. Dazu wähle ich das Wurzelelement aus (Document Element):
$myChildNode = $myXmlObject.ImportNode($myChild.get_DocumentElement(), $true)
Nun folgt das Einhängen mittels AppendChild() und zur Kontrolle die Serialisierung in eine Zeichenkette:
$myXmlObject.get_DocumentElement().AppendChild($myChildNode) $myXmlObject.get_OuterXml()
Der letzte Methodenaufruf liefert die folgende Ausgabe:
<wurzel><kindelement>Hallo Welt!</kindelement></wurzel>
Fazit
Die Programmierung in der Powershell vereint für den XML-Programmierer einige sehr spannende Features. Einerseits ist die Programmierung wirklich »scripty« (Dank an Brendan Eich für diese Vokabel), das gilt vor allem für die einfache Wandlung von Zeichenketten in XML-Objekte. Die Programmierung geht einfach von der Hand ohne lange Einarbeitung (wenngleich derzeit die Dokumentation wirklich dürftig ist). Andererseits ist der Umgang mit XML-Objekten sehr mächtig, was natürlich am zugrundeliegenden .Net-Framework liegt. Wie sich damit auch XSLT-Transformationen auf den XML-Objekten ausführen lassen, zeige ich in einem zukünftigen Blog-Artikel.
