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.