XML::PYX

(Auszug aus "Perl & XML" von Erik T. Ray & Jason McIntosh)

Im Universum von Perl hat es einige Zeit gedauert, bis sich standardisierte APIs etablieren konnten. Dafür gibt es mehrere Gründe. CPAN, ein regelrechter Kaufhauswühltisch voller frei kopierbarer Module, wächst organisch. Es gibt keine zentrale Instanz, die neue Software bestätigen würde. Mit XML als einem relativen Newcomer der Datenformatszene hat sich die Perl-Gemeinde zwar früh beschäftigt, aber Standardlösungen waren erst spät gefragt.

Man kann diese erste Ära der Perl-XML-Hacker als das Zeitalter der individuellen Parser bezeichnen. Die Dokumentation war spärlich, die Module experimentell und Gegenstand laufender Änderungen. Es gab viel Kreativität und Innovation, aber genausoviel Eigensinn. Überraschenderweise waren gerade einige dieser älteren Werkzeuge ausgesprochen nützlich; eigentlich ein interessantes Thema für Historiker und Entwickler gleichermaßen.

XML::PYX ist einer dieser frühen Parser. Ströme führen auf natürliche Weise zum Konzept der Pipeline. Die Ausgabe eines kleinen, einfachen Programms wird zur Eingabe eines anderen, ebenso kleinen Programms. Das große, komplexe Programm entsteht durch Kombination mehrerer kleinerer Prozessoren. Es gibt keinen Grund, dieses Prinzip nicht auch auf XML anzuwenden. Aus diesem Konzept heraus hat sich dementsprechend auch ein innovativer und eleganter Stil zur Implementierung von Prozessoren entwickelt. Im wesentlichen wird XML in einen Strom einfach zu erkennender und wandelbarer Symbole umgewandelt, was sich sogar als Kommandozeilenanwendung schön darstellen läßt.

PYX ist ein Beispiel für dieses Konzept. Der XML-Markup wird in ein Format umgewandelt, das sich sowohl für eine textorientierte Sprache wie Perl als auch für Unix-Programme im Stil von awk und grep eignet. Diese Programme arbeiten zeilenorientiert, aus diesem Grund verpackt PYX jedes Event in einer eigenen Zeile.

Die folgende Tabelle enthält einen Überblick über die Syntax von PYX.

Tabelle: PYX-Notation

Symbol Bedeutung
( Start-Tag eines Elements
) End-Tag eines Elements
- Zeichendaten
A Ein Attribut
? Eine PI

Für jedes aus dem Strom kommende Event beginnt PYX eine neue Zeile, die mit einem der fünf Symbole aus dieser Tabelle beginnt. Abhängig vom Eventtyp, folgen weitere Daten, zum Beispiel der Elementname. Sonderzeichen werden mit einem Backslash geschützt, wie man das von Perl gewohnt ist.

Schauen wir uns an, was herauskommt, wenn man die Ausgabe eines XML-Parsers in PYX-Notation konvertiert. Nehmen wir dazu als Beispiel das folgende XML-Dokument:

<einkaufsliste>
   <!-- Marken sind uns egal -->
   <artikel>Zahnpasta</artikel>
   <artikel>Kabrio</artikel>
   <artikel optional="yes">Kaviar</artikel>
</einkaufsliste>

In PYX würde es folgendermaßen aussehen:

(einkaufsliste
-\n
(artikel
-Zahnpasta
)artikel
-\n
(artikel
-Kabrio
)artikel
-\n
(artikel
Aoptional yes
-Kaviar
)artikel
-\n
)einkaufsliste

Beachten Sie, daß der Kommentar in der PYX-Übersetzung nicht mehr auftaucht. PYX ist in verschiedener Hinsicht minimalistisch. Unter anderem werden einige Aspekte des Markup unterschlagen. So wird man zum Beispiel nicht über CDATA-Abschnitte informiert, man bekommt lediglich deren Inhalte zu sehen. Der folgenreichste Verlust sind aber eventuelle Entityreferenzen, die aus dem Strom entfernt werden. Bevor Sie PYX in Erwägung ziehen, sollten Sie daher klären, ob Sie diese Dinge wirklich nicht brauchen.

Von Matt Sergeant stammt ein Modul namens XML::PYX. Dieses Modul liest ein XML-Dokument und wandelt es in PYX um. Das Programm im folgenden Beispiel verwendet dieses Modul, um alle Element-Tags zu entfernen und nur die Textdaten übrigzulassen.

Beispiel: PYX-Parser

use XML::PYX;

# Initialisierung des Parsers und Ausgabe von PYX
my $parser = XML::PYX::Parser->new;
my $pyx;
if (defined ( $ARGV[0] )) {
   $pyx = $parser->parsefile( $ARGV[0] );
}

# Entfernung der Tags
foreach( split( / /, $pyx )) {
   print $' if( /^-/ );
}

PYX ist eine interessante Alternative zu SAX und DOM, wenn man einfach auf die Schnelle ein kleineres Problem lösen muß. Aufgaben wie das Zählen von Elementen, die Trennung von Textdaten und Markup und die Erkennung einfacher Events lassen sich damit wunderbar lösen, besonders wenn man mit den eingangs erwähnten Unix-Tools wie wc, grep oder awk gut umgehen kann. Andererseits sind die Möglichkeiten der PYX-Notation doch recht eingeschränkt, was sich auf Dauer bemerkbar macht. Das Modul wird dadurch ungeeignet für komplexere Aufgaben.

  

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Perl & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Perl & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de