Gegenüber XML verlangt SML eine Reihe abweichender syntaktischer Eigenschaften. Zunächst ist zu erwähnen, dass die Kodierung einer Datei in UTF-8 oder UTF-16, wie beispielsweise bei XML üblich, leider in vielen Sprachen nach wie vor noch zu Problemen beim Lesen der Dateien führen kann. Zu diesen Sprachen zählen zum gegenwärtigen Zeitpunkt unter anderem Perl 5 und bedauerlicherweise PHP 4. Dies ist zwar ein Versäumnis der Entwickler und keine Eigenschaft von XML als solches, dennoch stellt es einen inakzeptablen Zustand dar, wenn es darum geht eine Anwendung zu initialisieren. Daher ist es sinnvoll für die Zwecke der Initialisierung des Frameworks von der Verwendung dieser Kodierungen abzusehen. Als Zeichensatz wird ISO Latin-1 verwendet. Zeichen, welche darin nicht enthalten sind, sollten durch geeignete Entitäten kodiert werden.
Abweichend von der XML-Syntax wird für SML nicht gefordert, dass das Dokument nur einen einzigen Tags als Wurzelelement enthalten darf. Sollte ein Dokument einen Wald aus mehreren Bäumen enthalten, so werden diese implizit als Kindelemente eines anonymen, virtuellen Wurzelelements enthalten.
Als weitere syntaktische Eigenschaft fordert das SML-Format, dass alle öffnenden Tags durch einen in gleicher Weise benannten schließenden Tag geschlossen werden müssen. Bei der Benennung der Tags kommt es nicht auf die Schreibweise an. Es wird nicht zwischen Groß- und Kleinschreibung unterschieden.
Weiterhin muss per Konvention nach jedem schließenden Tag zwingend ein Zeilenumbruch erscheinen. Vor einem öffnenden Tag dürfen per Konvention lediglich Whitespace-Zeichen eingefügt werden. Ein Tag kann entweder nur Textinhalt ("CData") oder weitere Tags enthalten, aber nicht beides gleichzeitig. Falls der Tag einen CDATA-Abschnitt enthält, müssen der Starttag und der Endtag auf der gleichen Zeile sein. Falls der Tag weitere Tags enthält, muss nach dem Starttag ein Zeilenumbruch erfolgen. Zeilenumbrüche in CDATA-Abschnitten können durch die Escapesequenz "\n" ausgedrückt werden.
Alle CDATA-Abschnitte außerhalb eines Tags oder Abschnitte welche nicht der Syntax entsprechen, werden als Kommentare behandelt und bei der Verarbeitung der Datei ignoriert. Eine besondere Markierung von CDATA-Abschnitten oder Kommentaren, wie in XML üblich, entfällt.
Die Verwendung der XML-typischen Schreibweise für leere Tags, beispielsweise "<br />" ist nicht gestattet (verwenden sie "<br></br>" stattdessen).
Abschließend soll gelten, dass auf die Verwendung von Attributen verzichtet werden soll.
Der Grund für diese recht restriktive Syntax wird deutlicher bei Betrachtung eines einfachen Beispiels.
Im Folgenden sollen Beispiele beschrieben werden, welche zeigen, auf welche Weise native Datentypen in PHP-Skripten durch das SML-Format darstellbar sind.
Darstellung in PHP-Code:
<?php
$a = 1;
$b = 'string';
$c = 12.5;
$d = true;
?>
äquivalente Darstellung in SML:
<a>1</a>
<b>string</b>
<c>12.5</c>
<d>true</d>
An dieser Stelle ist es wichtig eine syntaktische Einschränkungen von PHP zu verstehen. Eine PHP-Funktion kann nur einen einzelnen Rückgabewert besitzen. (Der Fall, dass der Funktion Parameter per Referenz übergeben werden, wird hier nicht betrachtet.) Eine PHP-Funktion welche den Inhalt des SML-Dokuments auswertet und als Rückgabewert liefert, ist daher gezwungen, die Inhalte in Form eines Arrays zu repräsentieren. Die Inhalte dieses Arrays können wiederum in Variablen innerhalb des Kontext des aufrufenden Programmfragments kopiert werden, wodurch der ursprüngliche Zustand wiederhergestellt wird.
Um ein zweites Beispiel zu nennen: Dokumente in JSO-Notation unterliegen den gleichen Einschränkungen.
Darstellung in PHP-Code:
<?php
$A = array();
$A[0] = 1;
$A[1] = 'string';
$A[2] = 12.5;
$A[1000] = true;
$B = array();
$B[0] = 2;
?>
äquivalente Darstellung in SML:
<A>
<0>1</0>
<1>string</1>
<2>12.5</2>
<1000>true</1000>
</A>
<B>
<0>2</0>
</B>
Darstellung in PHP-Code:
<?php
$SCREEN = array();
$SCREEN["width"] = 1024;
$SCREEN["height"] = 768;
$SCREEN["depth"] = "32-Bit";
?>
äquivalente Darstellung in SML:
<SCREEN>
<width>1024</width>
<height>768</height>
<depth>32-Bit</depth>
</SCREEN>
Darstellung in PHP-Code:
<?php
$A = array();
$A["a"] = 1;
$A["b"] = 2;
$A[0] = "drei";
$B = array();
$B[0] = true;
$B["a"] = 1000;
$B["b"] = array();
$B["b"][0] = 1;
$B["b"][1] = 2;
$B["b"]["a"] = 3;
?>
äquivalente Darstellung in SML:
<A>
<a>1</a>
<b>2</b>
<0>drei</0>
</A>
<B>
<a>1000</a>
<b>
<0>1</0>
<1>2</1>
<a>3</a>
</b>
</B>
Wie aus den obigen Beispielen ersichtlich, eignet sich das beschriebene Format gut um skalare Variablen und Datenfelder darzustellen, welche üblicherweise als Parameter für die Initialisierung des Frameworks in Frage kommen dürften. Die Angabe eines Typs ist nicht erforderlich, weil PHP nicht streng typisiert ist. Der Typ einer Variablen ist zur Laufzeit folglich dynamisch. Die einzige notwendige Unterscheidung findet zwischen skalaren Werten und Datenfeldern statt. Diese Unterscheidung ist trivialerweise anhand der Syntax möglich.
Thomas Meyer, www.yanaframework.net