XML-Prozessor
# XML-Prozessor

Ein XML-Prozessor ist eine Software zum Einlesen und Verarbeiten von XML-Dokumenten. Häufig wird auch der Begriff XML-Parser synonym verwendet, obwohl dieser eher ein Modul im Software-Baustein „XML-Prozessor“ ist, welches das Einlesen durchführt.

## Allgemeines

Ein XML-Prozessor besitzt im Wesentlichen drei Komponenten:
* den Parser – er bildet das Frontend zu den zu verarbeitenden Dokumenten
* die Verarbeitungskomponente – sie implementiert die eigentliche Geschäftslogik im Sinne einer Modelltransformation
* den Ausgabeprozessor – er sorgt für die Persistierung der Zieldokumente im geeigneten Format
Dabei ist eigentlich nur Parser und Ausgabeprozessor XML-spezifisch. Die Verarbeitungskomponente kann eigentlich beliebige Modelle verarbeiten, weist aber durchaus auch XML-spezifische Merkmale auf, zum Beispiel
* indem sie den Zugriff auf das sogenannte Post Schema Validation Info Set PSVI erlaubt
* indem XML-Konstrukte in der Verarbeitungssprache konzeptualisiert sind (node, element, entity …)

## XML-Parser

XML-Parser in den Prozessoren können anhand zweier Kriterien unterschieden werden:
* validierend oder nichtvalidierend
* Art der Schnittstelle für den Zugriff auf das Dokument (als Baum ähnlich wie DOM oder sequentiell, zum Beispiel SAX)
Im Grunde können auch Parser eingesetzt werden, die andere Formate einlesen oder gar Datenbanken abfragen. Das ist hilfreich für Migrationen von Altdaten nach XML.
Nichtvalidierende Parser kontrollieren lediglich, ob das Dokument wohlgeformt ist, sprich, ob es den Spezifikationen des W3C entspricht. Validierende Prozessoren hingegen prüfen zusätzlich die Konformität gegenüber einer DTD oder einer Schemasprache, wie zum Beispiel XML Schema oder RELAX NG.

## Verarbeitungskomponente

Die Verarbeitungskomponente implementiert in der Regel eine eigene, auf das Verarbeitungsparadigma optimierte Programmiersprache (zum Beispiel DSSSL, XSLT). Dabei ist zu unterscheiden:
* sequentielle Verarbeitung – Man kann Regeln für das Betreten/Verlassen eines Knotens angeben. In diesen Regeln wird die spezifische Verarbeitung formuliert. Der Inhalt des Dokumentes steht nur so weit zur Verfügung, wie es bislang eingelesen beziehungsweise verarbeitet ist.
* baumorientierte Verarbeitung – Die Verarbeitungskomponente traversiert automatisch den (beziehungsweise die) Dokumentbäume und konstruiert den Baum für das Ausgabedokument. Die Traversierung kann dabei auf dem Quellbaum (zum Beispiel bei XSLT) erfolgen oder im Zielbaum (zum Beispiel bei MetaMorphosis). Man spricht daher von „sourcedriven“ beziehungsweise „targetdriven“ Prozessoren. Zielgetriebene Prozessoren sind nicht ganz so einfach zu durchdringen, bieten jedoch wesentlich mehr Flexibilität.
Besonders vorteilhaft in dem Ansatz ist es allerdings, die Verarbeitung (Transformation) weitgehend unabhängig von der konkreten Syntax des Ausgabeformates zu formulieren. Die Spezifika des gewünschten Ausgabeformates (zum Beispiel Zeilenaufteilung, Einrückungen und so weiter) können im Ausgabeprozessor behandelt werden. Damit wird es zuweilen möglich, mit einer Transformation mehrere Ausgabeformate zu bedienen.
Dem Wesen nach handelt es sich bei XML-Prozessoren also um ein ähnliches (wenn auch schon vor dem MDA-Hype definiertes) Vorgehen wie bei der MDD, bei der ebenfalls eine formal beschriebene Modelltransformation stattfindet und das Einlesen beziehungsweise Serialisieren des Modells in eigenen Prozessoren stattfindet. Daher ist durchaus eine Sprachverwandtschaft zwischen XML-Prozessoren und Modelltransformatoren zu erkennen. Die Rolle der Metamodelle wird dabei von der DTD beziehungsweise dem XML-Schema wahrgenommen. Die Modellpersistierung erfolgt in XML.

## Ausgabekomponente

Die Ausgabekomponente serialisiert den von der Verarbeitungskomponente bereitgestellten Dokumentenbaum nach XML oder in ein anderes gewünschtes Textformat (zum Beispiel TeX). XML-Spezifika wie Handhabung von Sonderzeichen, Leerzeichenbehandlung und so weiter kann der Ausgabeprozessor übernehmen. Bei leistungsfähigen XML-Prozessoren ist diese Ausgabekomponente flexibel konfigurierbar beziehungsweise programmierbar.

## Implementierungen

* XSLT
* MetaMorphosis
* JADE