Federleicht

Es muss nicht immer Perl sein. Für die Verarbeitung von XML-Daten oder Dokumenten stellen auch andere Skriptsprachen Werkzeuge zur Verfügung - beispielsweise Tcl.

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen
Lesezeit: 10 Min.
Von
  • Carsten Zerbst
Inhaltsverzeichnis

Geht es um die Bearbeitung von XML-Texten oder -Daten, bietet sich neben anderen Tcl als Sprache an. Verschiedene Erweiterungen übernehmen Standardaufgaben wie das Analysieren des Dokuments oder die Bearbeitung entsprechend dem Document Object Model (DOM) des W3C. Neben der Dokumentbearbeitung existiert mit der Unterstützung von XML-RPC (Remote Procedure Calls) die Möglichkeit, eine plattformübergreifende Lösung für verteiltes Rechnen zu nutzen.

XML als Sprache zur Erstellung von strukturierten Dokumenten erfreut sich nach wie vor wachsender Popularität. Neben der Dokumentverwaltung wird es zunehmend als Format zum Datentransport verwendet. Die Bearbeitung von XML unterstützt die Scriptsprache durch eine Reihe von Funktionen.

Mehr Infos

Schon zu SGML-Zeiten war mit den Kopenhagener Software Tools (später COST) ein Paket zur Bearbeitung von strukturierten Dokumenten verfügbar. Inzwischen gilt dies für verschiedene Aspekte der XML-Bearbeitung. Zwar bietet Tcl von Haus aus einen mächtigen Satz von regulären Ausdrücken für die generelle Verarbeitung von Texten, bei XML-Dokumenten kommen jedoch zwei Arbeiten besonders häufig vor: das Analysieren existierender Dokumente und das Erzeugen oder Bearbeiten von Dokumenten nach dem DOM des W3C.

Gegenüber anderen Dokumentenformaten hat XML den Vorteil, dass ansonsten speziell zu erstellende Grundbausteine wie Parser generisch für alle XML-Dokumente verwendet werden können. Für Tcl existieren zwei solche Parser zum strukturierten Einlesen, die reine Skriptlösung TclXML sowie eine Erweiterung auf der Basis von James Clarks expat. Beide Lösungen wurden von Steve Ball geschrieben, von TclExpat gibt es im tDOM-Paket eine wesentlich schnellere Version. TclXML und TclExpat haben bis auf wenige Ausnahmen identische Schnittstellen, sodass sie problemlos gegeneinander ausgetauscht werden können (auch der Perl-Parser basiert auf Clarks Werkzeug, siehe [#lit1 [1]]). Die Parser rufen beim Einlesen des Dokuments an vorher vereinbarten Stellen (Start-Tag, End-Tag, Kommentare et cetera) Tcl-Prozeduren auf, denen die entsprechenden Dokumentteile übergeben werden. Dies ergibt eine stimmige Integration in die Event-basierte Sprache Tcl. Die jeweils aufgerufenen Prozeduren übernehmen die eigentliche Bearbeitung des Dokuments.

Obwohl die reine Tcl-Lösung TclXML in der Geschwindigkeit weit hinter TclExpat abfällt, bietet sie jetzt schon volle Unicode-Unterstützung und enthält einen undokumentierte DTD-Parser, mit dem sich neben dem Inhalt auch die Typ-Definition eines Dokuments (DTD) einlesen lässt. Allerdings handelt es sich weder bei expat noch bei TclXML um validierende Parser: Das Dokument muss zum erfolgreichen Einlesen nur wohlgeformt sein (siehe den Kasten ‘Gültigkeit’). Beim Erstellen von XML-Werkzeugen nehmen einem die Parser einen großen Teil der Arbeit ab, es verbleibt die Programmierung der aufgerufenen Prozeduren.

Mehr Infos

Gültigkeit

In XML unterscheidet man zwischen zwei Arten von Dokumenten oder Fragmenten: wohlgeformt (well-formed) und gültig (valid).

Wohlgeformt: ein XML-Dokument ist in sich schlüssig, das heißt, alle Elemente sind korrekt geschachtelt und in XML-Syntax vorhanden.

Gültig: zusätzlich zum Wohlgeformten gilt hier, dass das XML-Dokument der Struktur einer DTD entspricht.

Mehr Infos

Was es gibt ...

Für XML gibt es in Tcl

  • Parser für unterschiedliche Ansprüche,
  • einfaches Anzeigen von formatiertem Text,
  • eine Implementierung des DOM, XPath und XPointer,
  • eine Implementierung von XML-RPC,
  • keine validierenden Parser,
  • keine Unterstützung von Stylesheets.

In diesen können Entwickler die ganze Mächtigkeit von Tcl ausnutzen; sei es die Umwandlung mit Hilfe von regulären Ausdrücken oder das Einfügen in eine Datenbank. Neben der reinen Bearbeitung von Dokumenten eignet sich Tcl auch zu ihrer Darstellung: wegen des mächtigen Text-Widgets aus Tk. Darin lassen sich Texte mit verschiedenen Auszeichnungen auf Basis von Tags versehen, was sich für die Darstellung von XML geradezu anbietet. Ein Beispiel zur Anzeige von Texten mit einer HTML-ähnlichen DTD findet sich in Listing 1.

Mehr Infos

Listing 1: Anzeigen von Text

#!/bin/sh
# \
exec wish8.1 "$0" $@

lappend auto_path /usr/local/lib/tdom0.4

# In diesem Verzeichnis muessen
# tdom0.4.so, tdom.tcl und das pkgindex.tcl stehen
package require tdom

set fd [open zulisting1.xml]
set xml [read $fd]
close $fd

package require Tk

set tags {}

proc start {tag attlist} {
variable tags
set tags [linsert $tags 0 $tag]
switch $tag {
h1 { .text insert end \n}
default {}
}
}
proc end {tag} {
variable tags
set tags [lrange $tags 1 end]
switch $tag {
h1 { .text insert end \n}
default {}
}
}
proc cdata {text} {
variable tags
.text insert end "$text" $tags
}

text .text -font {Times 10 normal} -bg white
pack .text
.text tag configure h1 -font {Helvetica 18 bold} -foreground red
.text tag configure i -font {Times 10 italic}
.text tag configure b -font {Times 10 bold}

set parser [expat test]
$parser configure -elementstartcommand start -elementendcommand end \
-characterdatacommand cdata
$parser parse $xml

Während die Parser in erster Linie zur Bearbeitung schon existierender Dokumente dienen sollten, ist das W3C-DOM sowohl zum Erstellen wie Bearbeiten verwendbar. In der DOM-Spezifikation sind eine ganze Reihe von Methoden spezifiziert, mit denen sich eine Baumstruktur des Dokuments auslesen und verändern lässt, wobei Token die einzelnen Knotenpunkte referenzieren. Auf diese Token können Programmierer die entsprechenden Methoden anwenden, zum Beispiel Attribute lesen oder setzen, Kind-Elemente abfragen und erzeugen. Dies ergibt auch den großen Einsatzbereich von DOM, der weit über die Dokumentenverarbeitung hinaus geht. Mit Hilfe dieses Modells lassen sich beliebig komplizierte Baumstrukturen erstellen und zur Speicherung oder Übermittlung serialisieren. Auf der Empfangsseite können Entwickler schnell wieder die Baumstruktur erstellen. Für das DOM existieren zwei unterschiedliche Implementierungen für Tcl: Steve Balls TclDOM und Jochen Löwers tDOM.

Das TclDOM-Paket ist eine reine Skriptlösung, wobei die ganze Datenhaltung der Baumstruktur auf der Tcl-Seite durchgeführt wird. In dem Paket sind die in der Spezifikation enthaltenen prozeduralen Methoden ausgeführt. Ein kleines Beispiel für die Verwendung befindet sich in Listing 2, das ein kleines Dokument erstellt und ausgibt. Neben den vom W3C spezifizierten bietet TclDOM weitere Methoden, beispielsweise um Dokumente zu lesen und zu schreiben oder zum Entfernen leerer Knoten. Da es in Tcl implementiert ist, kann es jetzt schon mit Unicode umgehen, allerdings nur, wenn man beim Einlesen TclXML als Parser verwendet. Zu dem DOM-Paket existieren weitere Hilfen. Steve Ball stellt ein generisches Widget zur Verfügung, das das DOM-Modell darstellt. Es ist Grundlage seines XML-Editors swish (siehe Abbildung), der mit Hilfe einer Plugin-Architektur erweiterbar ist. Auf der Homepage des Autors befinden sich außerdem die DOMutils. Sie stellen eine Reihe von zusätzlichen Kommandos zum Finden spezieller Knoten oder für Operationen wie Cut, Copy und Paste zur Verfügung.

Mehr Infos

Listing 2: TclDOM und tDOM

[TclXML]

set rootN [dom::DOMImplementation create]
set topN [dom::document createElement $rootN test]

set secN [dom::document createElement $topN section]
dom::element setAttribute $secN a 1

dom::document createTextNode $secN "Ein kleiner Text"

puts [dom::DOMImplementation serialize $rootN]

[tDOM]

dom createDocument test docN
$docN documentElement rootN

$docN createElement section secN
$secN setAttribute a 1
$rootN appendChild $secN

$docN createTextNode "Ein kleiner Text" textN
$secN appendChild $textN

puts "<?xml version='1.0'?>"
puts "<!DOCTYPE test>"
puts [$rootN asXML]

[XML]

<?xml version='1.0'?>
<!DOCTYPE test>
<test>
<section a="1">
Ein kleiner Text
</section>
</test>

Steve Balls erweiterbarer XML-Editor swish ist für Windows, Linux (Red Hat) und den Mac kostenlos erhältlich.

Brandneu ist tDOM. Es beinhaltet neben einem fast kompletten DOM eine schnellere Implementierung von TclExpat und erste Ansätze von XPath- und XPointer-Unterstützung. Das Paket ist in C geschrieben, was Geschwindigkeit und Größe gegenüber TclDOM verbessert. Beim Ein- und Auslesen ist es circa zehnmal schneller und benötigt nur ein Drittel des Speichers. Während TclDOM jedoch eine komplette DOM-Implementierung bietet, wurde tDOM in Hinblick auf schnelles Einlesen und Ausgeben entworfen, eine Unicode-Unterstützung fehlt. Das Paket stellt neben Methoden für XPath und XPointer im Wesentlichen dieselben Methoden zur Verfügung wie TclDOM, allerdings in einer objektorientierten Syntax.

Weil die beiden DOM-Implementierungen anders als die Parser nicht gegeneinander ausgetauscht werden können, muss man sich von vornherein für eine der beiden entscheiden. Geht es um Textverarbeitung unter Verwendung von Verarbeitungshinweisen, Kommentaren und Unicode, wird man sich für TclDOM entscheiden. Kann man darauf verzichten, ist tDOM wegen seiner Geschwindigkeit und der organischen Syntax der Methoden die bessere Wahl. Da die Implementierung der fehlenden Objekte bei tDOM nicht schwierig ist, wird dies wohl bald die beste Wahl für das DOM unter Tcl werden.

Neben der Verarbeitung von Dokumenten dient XML inzwischen auch zur Kommunikation zwischen Prozessen als Remote-Procedure-Call-Methode. Hierbei handelt es sich nicht um die klassischen RPCs, die ursprünglich von Sun entwickelt wurden, sondern um eine Art Nachbildung dieser netzweiten Verarbeitung. Die Entwicklung von XML-RPC hat Frontier für ihre Web-Management-Lösung begonnen, neben Zope und PHP unterstützen es inzwischen alle wichtigen Skriptsprachen. XML-RPC basiert selbst auf Standardkomponenten, die Kommunikation erledigt das HTTP-Protokoll, die Nutzdaten zum Aufruf von Prozeduren, Rückgaben und Fehlermeldungen sind in XML ausgedrückt. Diese Daten werden als HTTP-Post-Anfrage verschickt, die Antwort oder gegebenenfalls die Fehlermeldung erfolgt als Nachricht vom Typ 200 OK.

Die XML-Anfrage enthält den Namen der gewünschten Methode sowie eventuelle Übergabeparameter. Einen Beispielaufruf und eine passende Antwort zeigt Listing 3. Neben den Datentypen integer, boolean, string und double werden ein Typ für datum sowie binäre Daten in Base64-Encoding unterstützt. Diese können jeweils einzeln, aber auch in Strukturen und Arrays verwendet werden. Die Antwort erfolgt ebenfalls im XML-Format (mit Unterstützung spezieller Fehlermeldungen). Anders als bei RPC oder CORBA (Common Object Request Broker Architecture) werden die Aufrufe nicht aus einer Datei mit Schnittstellenbeschreibung generiert, dies geschieht zur Zeit per Hand.

Mehr Infos

Listing 3: XML-RPC

[Prozeduraufruf]

<?xml version="1.0" ?>
<methodCall>
<methodName>dieFrage</methodName>
<params>
<value><int>42</int></value>
</params>
</methodCall>

[Prozedurantwort]

<?xml version="1.0" ?>
<methodResponse>
<params>
<param><string>We appologize for all the ...
</string></value></param>
</params>
</methodResponse>

Gegenüber herkömmlichen RPC-Aufrufen hat XML-RPC mehrere Vorteile. Die Adressierung der Prozedur erfolgt über einen lesbaren Namen, anstatt über eine Programmnummer, Implementierungen existieren wegen ihrer Basis auf HTTP in vielen Sprachen und auf mehreren Plattformen, und es werden sprechende Fehlermeldungen unterstützt. XML-RPC ist eine interessante Alternative zu CORBA, wenngleich es längst nicht an dessen Leistungsfähigkeit herankommt. CORBA bietet neben anderen Vorteilen ein statusbehaftetes Protokoll, eine wesentlich größere Anzahl an Datentypen und die Services. Kann man auf diese Vorteile verzichten, ist das wesentlich kleinere XML-RPC eine brauchbare Lösung.

Da Tcl von Haus aus eine HTTP-Bibliothek mit sich bringt, liegt analog dazu eine für XML-RPC auf Basis von TclDOM auf der Hand. In nur 500 Zeilen hat Steve Ball dies mit Tcl-RPC.tcl geschafft. Damit lässt sich das XML für den Aufruf erstellen und verschicken, die Ergebnisse empfangen und auswerten. Neben der Erstellung von Clients unterstützt Tcl-RPC.tcl die Serverseite. Dabei löst der in Tcl geschriebenen tclhttpd die URI auf und ruft die Prozeduren auf. Alternativ kann man natürlich ein CGI-Script in Tcl verwenden.

Zwei Bereiche der XML-Bearbeitung unterstützt Tcl derzeit nicht: die Formatierung mit Stylesheets und validierendes Parsing. Bei Steve Ball gibt es einen Wrapper um James Clarks jade für die Steuerung von Tcl aus. Formatieren auf Basis eines Parsers mit selbst geschriebenen Skripts ist zwar problemlos möglich, allerdings nicht so flexibel wie das Arbeiten mit Stylesheets.

Carsten Zerbst
ist wissenschaftlicher Mitarbeiter der TU Hamburg-Harburg und beschäftigt sich mit CORBA.

[1] Christian Kirsch; Perl-Know-how; Elemente mit System; XML-Parser für Perl-Scripts

Mehr Infos

iX-TRACT

  • Entwicklern, die nicht mit Perl, sondern mit Tcl arbeiten, stehen ebenfalls Werkzeuge für die Verarbeitung von XML-Dokumenten und Daten zu Verfügung.
  • Parser und andere Tcl-Tools erlauben nicht nur das Analysieren, sondern auch die Modifikation von XML-Dokumenten.
  • Mit XML-RPC existiert die Möglichkeit, ähnlich den klassischen RPCs über HTTP mit XML als ‘Sprache’ netzweit zu kommunizieren.

(hb)