Powershell: Spielen mit XML und XPATH

Mit Powershell kann man relativ einfach mit XML Dokumenten arbeiten:

In meinen Beispiel verwende ich hier folgende XML Datei:

<?xml version='1.0' encoding='UTF-8'?>  
<Dokument>  
<Autor>Christian Mueller</Autor>  
<Beispiele>  
    <Beispiel ID='1'>
        <Thema>Wie geht Powershell?</Thema>
        <Inhalt>Etwas text zu Powershell</Inhalt>
    </Beispiel>
    <Beispiel ID='2'>
        <Thema>Wie geht C</Thema>
        <Inhalt>Etwas text zu Powershell</Inhalt>
    </Beispiel>
    <Beispiel ID='3'>
        <Thema>Wie geht XPATH</Thema>
        <Inhalt>Etwas text zu XPATH</Inhalt>
    </Beispiel>
    <Beispiel ID='4'>
        <Thema>Was gibt es sonst noch</Thema>
        <Inhalt>Etwas text zu anderen Themen</Inhalt>
    </Beispiel>
    <Beispiel ID='5'>
        <Thema>Dies ist ohne Inhalt</Thema>
    </Beispiel>
</Beispiele>  
</Dokument>  

Zunächst muss man das XML Dokument öffnen, am einfachsten geht dies mit Get-Content. Es ist aber auch möglich "cat" zu nehmen, wenn man UNIX/Linux nahe steht.

$xml = [xml] (Get-Content C:\temp\beispiel.xml)

oder

$xml = [xml] (cat C:\temp\beispiel.xml)

Durch das [XML] wird der Inhalt automatisch in ein XmlDocument umgewandet:

Nun hat man die Möglichkeit mittels XPATH auf verschiedene Werte relativ einfach zuzugreifen. Es ist hier ohne Compilerlauf oder Deployment möglich diese zu testen und gleich gegen ein Dokument auszuprobieren.

Beispielsweise kann ich mir das Autorelement holen. Einer Variable zuordnen und den Inhalt auslesen:

Ist man noch nicht so bewandert mit XPATH begriffen, dann hilft die W3School hier weiter: http://www.w3schools.com/xsl/xpath_intro.asp

Ich zeige noch die üblichsten Problemstellungen auf.

Zugriff auf den Wert eines Elements:

Mit den zwei Slashes '//' kann man alle Ergebnisse unterhalb von Elementen suchen. Bisher habe ich den Autor mit "//Autor" gesucht. Es ist aber auch möglich, diesen direkt mit "Dokument/Autor" zu adressieren. Genauso kann man alle "Beispiel" Elemente auf einmal abgreifen, wenn man nach ("//Beispiel") sucht oder wenn diese sich nur unter dem Element "Dokument" befinden sollen, dann geht das mit "Dokument//Beispiel":

Mit dem "@" Zeichen kann man zusätzlich auch nach einen Attribut suchen:

Das schöne an Powershell ist, dass es sehr viel selbst konvertiert. Es ist also ganz einfach möglich sich die Werte in einen String Array zu holen.

Es ist auch möglich mittels [] die Position, die man haben möchte anzugeben. Mit "@" kann man sich auch den Attribute Wert holen, den man haben möchte. In diesem Beispiel die "ID":

Die alternative zu SelectNodes stellt das PowerShell Kommando Select-XML dar. Hiermit kann man beispielsweise auch in einen Einzeiler die Informationenn aus einem XML Dokument ziehen. Allerdings muss man aus dem Ergebnis die Node holen:

Natürlich lässt sich hier auch die schöne Pipeline Funktion von Powershell benutzen, um eine Eingabe an das Select-XML zu übergeben:

Ich hoffe diese Beispiele haben ein wenig inspiriert, wie man doch relativ einfach mit XML Dokumenten arbeiten kann. Insbesondere XPATH macht das Auswerten von Dokumenten relativ intuitiv und der Source-Code bleibt dann auch einigermaßen verständlich.

Weitereführende Themen zu XPATH findet man unter:
http://www.a-coding-project.de/ratgeber/xpath
http://www.xml.com/pub/a/2002/08/14/xpath_tips.html