Code-Bestandteile aus XML generieren
In vielen Umgebungen werden XML-Dokumente genutzt, um Datenstrukturen oder
ähnliches zu definieren. SharePoint nutzt beispielsweise XML-Dateien zur
Definition von Spalten und Inhaltstypen. Will man die Datenstrukturen aus dem
Code nutzen, verwendet man Ids, die in den XML-Dateien definiert sind. Um diese
nicht als Strings über den Quelltext zu verteilen, bietet es sich an, Konstanten
dafür zu definieren.
Bei einer kleinen Anzahl an Spalten ist die Erstellung des Codes für die Konstanten natürlich per
Hand möglich; handelt es sich jedoch um viele Spalten, bietet es sich an, dies
per Code-Generierung zu automatisieren. So ist man auch für weitere Spalten in
der Zukunft gut gerüstet.
Einen sehr einfachen Weg bietet die PowerShell, den wir im Folgenden beschreiben:
Beispieldaten
Das folgende Beispiel zeigt die wesentlichen Bestandteile einer XML-Datei, in der einige SharePoint Site Columns definiert werden:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Field
ID="{A15B67C3-70B3-4061-B116-CEDB43E99223}"
Name="LastName">
</Field>
<Field
ID="{1FE04065-69B2-408E-9CB8-4A45DDA27C81}"
Name="FirstName">
</Field>
<Field
ID="{69367257-E933-419F-9199-B3C1A7B52A25}"
Name="EmailAddress">
</Field>
<Field
ID="{62A73020-9EBA-4271-BBD0-BA9568AE0A7F}"
Name="Company">
</Field>
<!-- ... -->
</Elements>
PowerShell-Skript
[Xml]$doc = Get-Content A:\Elements.xml
$doc.Elements.Field |
ForEach-Object { 'public static readonly Guid {0} = new Guid("{1}");' -f $_.Name, $_.Id } |
Clip
Das kurze Skript liest die XML-Datei aus und erstellt danach den Code, der Konstanten für die Ids definiert.
PowerShell kann von Haus aus gut mit XML-Daten umgehen. Durch die sogenannte
Dot-Notation bietet PowerShell einen einfachen Zugriff auf die Inhalte. Hierbei
kann auf die einzelnen Elemente wie auf Properties zugegriffen werden; in unserem Beispiel listet
$doc.Elements.Field
alle Field-Elemente unterhalb von Elements auf.
Über die Pipeline werden die Field-Elemente an Foreach-Object
weitergereicht. Dieses generiert für jedes Element eine Textzeile, die die Deklaration der Konstante enthält.
Besonders nützlich ist das Weitergeben der Textzeilen am Ende an Clip
.
Dadurch werden diese in die Zwischenablage kopiert und können so direkt im
Visual Studio eingefügt werden.
Das Ergebnis
public static readonly Guid LastName = new Guid("{A15B67C3-70B3-4061-B116-CEDB43E99223}");
public static readonly Guid FirstName = new Guid("{1FE04065-69B2-408E-9CB8-4A45DDA27C81}");
public static readonly Guid EmailAddress = new Guid("{69367257-E933-419F-9199-B3C1A7B52A25}");
public static readonly Guid Company = new Guid("{62A73020-9EBA-4271-BBD0-BA9568AE0A7F}");
Dieses Beispiel zeigt, wie Code-Bestandteile mit einfachen Mitteln generiert werden können. Besonders beeindruckend ist die Kürze des Skripts. Dies macht deutlich, dass es für Entwickler durchaus lohnend ist, den ein oder anderen PowerShell-Trick im Ärmel zu haben.