XML per XSLT in XML umwandeln – Änderung der Struktur

ist ja mittlerweile weit verbreitet und ist teilweise auch nicht ganz so einfach, wie es scheint. Ich will an der Stelle auch gar keine oder Grundlagen verbreiten, denn dazu gibt es bei Google genügend. Mir geht es in erster Linie um die Umwandlung von XML-Dateien. Ich möchte die Struktur ändern und nutze dafür .

Was habe ich vor? Als Ergänzung zu meinem ersten XML-Beitrag vom 15.07.2012, habe ich das Thema noch etwas erweitert. Ich möchte per PowerShell die laufenden Dienste auf dem Rechner ermitteln, davon nur Name, Anzeigename und Status ausgeben und dies als XML ordentlich strukturiert in deiner Datei speichern. Klingt wie immer einfach, aber die Struktur am Ende passte mir nicht und so musste ich sie umbauen.

Dienste per PowerShell abrufen – Beispiele zum Verständnis

Get-Service
– ruft die Dienste auf dem lokalen Rechner ab

Get-Service | Select-Object  Name, DisplayName, Status
– ruft die Dienste auf dem lokalen Rechner ab und zeigt davon nur Name, DisplayName und Status an

Get-Service | Where-Object {$_.status -eq „running“}
– ruft die Dienste auf dem lokalen Rechner ab, die den Status Running bzw. Gestartet haben

Dienste per PowerShell abrufen und als XML in einer Datei ausgeben

Vielleicht haben Sie oben die Beispiele in PowerShell mal getestet. Es hilft, die folgende Befehlszeile zu verstehen.

Die folgenden Befehle sind mit einer Pipe verknüpft. Die Ergebnisse des vor der Pipe stehenden Befehls werden also an den PowerShell-Befehl hinter der Pipe übergeben und weiterverarbeitet.

(Get-Service | Select-Object Name, DisplayName, Status | ConvertTo-Xml -NoTypeInformation).Save(„D:\Dienste.XML“)

Zuerst werden also alle Dienste abgefragt, dann wird nur Spalte, DisplayName und Status behalten und dieses Ergebnis wird wiederum in XML umgewandelt. Das Gesamtergebnis wird dann unter dem angegebenen Dateinamen gespeichert.  Sie können natürlich auch mit Parametern arbeiten. Wie immer, gibt es mehre Möglichkeiten 😉

Was wir jetzt haben, ist schon mal eine halbwegs gut strukturierte Datei. In der folgenden Abbildung (gekürzt dargestellt) möchte ich zeigen, wo ich eigentlich hin will:

Sie sehen auf der linken Seite den Inhalt der erstellten XML-Datei bzw. das Ergebnis der PowerShell-Abfrage (hier in gekürzter Form). Die Struktur mit den Elementen Objects… ist nicht so, wie wir sie vielleicht haben möchten. Ich selbst wollte an dieser Stelle lieber eine Ausgabe nach dem Schema auf der rechten Seite, damit ich diese XML-Datei leichter weiterverarbeiten kann. Aber wie komme ich zu dieser Darstellung?

Der Schlüssel ist XSLT, ein Teil von XSL. XSL an sich bedeutet Style Sheet Language und besteht aus den folgenden drei Teilen:

  • XSLT, als Sprache für die Transformation von XML
  • XPath für die Navigation in XML bzw. für die Selektion von Bereichen
  • XSL-FO für die Formatierung von XML

Bei der Transformation per XSLT, wird die XML-Datei ausgelesen und an den XSLT-Prozessor übergeben. Dieser holt sich die Anweisungen für die Transformation aus der XSLT-Datei, wandelt alles wie gewünscht um und übergibt das Ergebnis an einen Ausgabestrom. Das kann eine neue XML-Datei oder auch der Bildschirm sein. Für die geplante Umwandlung unserer XML-Datei benötigen wir also eine XSLT-Datei. Wir wird diese erstellt?

Für die Erstellung von XSLT-Dateien kann man bspw. Tools wie XML-Spy oder auch Visual Studio nutzen. Ich habe dafür Visual Studio 2010 folgendermaßen genutzt:

  1. Visual Studio öffnen!
  2. Über Datei Neu Datei erstellen wir eine neue XLST-Datei.
  3. In der neuen Datei sind bereits Vorgaben enthalten. Hier ändern wir den Code folgendermaßen ab:

    <?xml version=“1.0encoding=“UTF-8„?>
    <xsl:stylesheet version=“1.0xmlns:xsl=“http://www.w3.org/1999/XSL/Transform„>
    <xsl:output method=“xmlversion=“1.0encoding=“UTF-8indent=“yes„/>
    <xsl:template match=“/“>
    <xsl:element name=“Dienste“ >
    <xsl:apply-templates select=“/Objects/Object„/>
    </xsl:element >
    </xsl:template>
    <xsl:template match=“Object„>
    <xsl:element name=“Dienst“ >
    <xsl:element name=“Name“ >
    <xsl:value-of select=“./Property[@Name=’Name‘]“ />
    </xsl:element>
    <xsl:element name=“DisplayName“ >
    <xsl:value-of select=“./Property[@Name=’DisplayName‘]“ />
    </xsl:element>
    <xsl:element name=“Status“ >
    <xsl:value-of select=“./Property[@Name=’Status‘]“ />
    </xsl:element>
    </xsl:element>
    </xsl:template>
    </xsl:stylesheet>
  4. Jetzt legen Sie noch die Ein- und Ausgabedatei (XML) fest. Dies geht über die Eigenschaften.
  5. Speichern Sie diese Datei unter XSLT, bspw. Dienste.xslt.
  6. Führen Sie die XSLT-Datei über Visual Studio (ALT+F5) aus und Sie erhalten als Ergebnis die Datei DiensteNeu.XML in gut strukturierter Form.

Wie man eine XSL-Transformation (XSLT) per PowerShell realisiert, habe ich in einem weiteren Beitrag beschrieben. Über die PowerShell lässt sich das Ganze dann auch etwas besser automatisieren und kann bspw. auch als Task eingeplant werden. Diesen Artikel gibt es hier.

Ich habe die detaillierten Erläuterungen bewusst weggelassen, da dieser Beitrag nur eine kurze Übersicht zur XML-Umwandlung geben soll. Wer es genau wissen möchte, der findet bei Google genügend Beiträge zu diesem Themenbereich und weiß nun sicher auch eher, nach was er genau sucht 😉

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.