Exportieren von Domino-Datenbanken in XML Mit Hilfe des seit kurzem in Version 1.0 verfügbaren Lotus XML Toolkits lassen sich nahezu alle Inhalte von Notes-Datenbanken exportieren und importieren. Neben der grundsätzlichen Funktionsweise des Toolkits beschreibt der Artikel die notwendigen Erweiterungen für den Export bestimmter Inhalte sowie deren Transformation mit XSLT. Das Lotus XML Toolkit Dem Java Entwickler standen bisher nur sehr begrenzte Möglichkeiten zur Erzeugung von XML-Daten aus Domino-Datenbanken zur Verfügung. Auch der Import von formatierten Texten im XML-Format oder das Erzeugen von Datenbanken waren über das Domino-Java-API nur sehr rudimentär möglich. Das Lotus XML Toolkit stellt eine Sammlung von C++ und Java-Klassen dar, die den Export und Import nahezu aller Datenbankinhalte ermöglichen. Da der Inhalt von RTF-Feldern (formatierte Texte) vollständig exportierbar ist, kann man diese extrahieren und in einem anderen Format aufbereiten. Denkbar wäre z. B. HTML, das die Eigenarten spezieller Browser berücksichtigt, oder WML für Mobiltelefone. Die Ausgabe des Toolkits ist eine DXL-Datei (Domino XML) bzw. ein DXL-Stream. DXL ist ein XML-Format, das von Lotus festgelegt wurde. Es ist in Form einer DTD (Document Type Definition) beschrieben und kann damit von jedem XML-kundigen Entwickler leicht verstanden werden. Da DTDs nur einen begrenzten Detaillierungsgrad zulassen, werden sie wohl bald durch sogenannte SchemaDefinitionen ersetzt. Das DXL-Schema, das zur Zeit als Vorabversion erhältlich ist, gibt folglich einen tieferen Einblick in die Struktur der DXL-Daten. Abbildung 1 – Anwendung des Lotus XML Toolkits Die DXL-Datei kann mit einem XSLT-Prozessor wie z. B. LotusXSL transformiert werden. LotusXSL ist inzwischen fester Bestandteil jeder Domino-Distribution. Der XSLT-Prozessor liest die DXL-Datei und erzeugt aus ihr eine neue XML-Datei oder eine Datei in einem anderen Format. Die dazu verwendete XSLT-Schablone beschreibt, welche XML-Daten wie umgewandelt werden. Durch die Möglichkeit, eine DXL-Datei mit verschiedenen Schablonen zu transformieren, kann man folglich eine Datenquelle für beliebige Zielformate aufbereiten. Ein Beispiel wäre die Transformation einer Notes-Hilfe-Datenbank nach HTML unter Berücksichtigung des Adressaten. Je nach Zielgruppe könnte man z. B. bestimmte Textteile filtern, verdichten oder anders darstellen. Seite 1 von 8 DXL = Domino XML DXL ist die gemeinsame Basis auf der Daten exportiert oder importiert werden können. Domino Datenbanken werden durch das XML-Toolkit nicht direkt sondern immer über diese klar definierte Schnittstelle angesprochen. Sie ist für jede Datenbank gleich, da DXL nicht die Inhalte der Datenbank, sondern die Namen der Notes-Elemente als Tags (Strukturelemente) verwendet. Die DXL-Datei besteht normalerweise aus der <database>-Struktur, die eine beliebige Anzahl von <document>-Elementen enthält. Der <document>-Tag beinhaltet die UNID (eindeutige ID) des Notes-Dokumentes als Attribut. Innerhalb jedes <document>-Elements ist eine vom Dokument in der Notes-Datenbank abhängige Folge von <item>-Tags zu finden. Jedes <item> repräsentiert ein Feld des Notes-Dokumentes. Der Name des Feldes wird als Attribut vermerkt. Die Daten des Feldes sind Teil der <item>-Struktur. Abbildung 2 – RTF-Feld als DXL-Daten In Abbildung 2 ist die DXL-Repräsentation eines RTF-Feldes zu sehen. Absätze werden als <par>-Strukturen kodiert. Diese können <run>-Elemente enthalten, über die Formatierungen wie z. B. "fett" oder die Verwendung spezieller Zeichensätze (<font>) abgebildet werden. Weitere interessante Elemente von RTF-Feldern sind <table> für Tabellen oder <doclink> für Dokumentverknüpfungen. Die Verknüpfungen werden über die Dokument-ID der referenzierten Dokumente hergestellt. Die <pardef>-Tags geben detaillierte Auskunft über die Formatierung von Absätzen. Die Daten aus den Feldern sind als Unicode (utf-8) kodiert. Alle noch nicht als DXL strukturierbaren Elemente werden als binäre Daten ausgegeben. Dazu zählen z. B. Bitmaps, Word-Dokumente oder andere angehängte Dateien. Damit ist ein verlustfreier Ex- und Import aller Daten einer Notes-Datenbank möglich. Seite 2 von 8 Gestaltungselemente in DXL Über die detaillierten Definitionsmöglichkeiten innerhalb einer DXL-Datei lassen sich auch erstmals nahezu vollständige Datenbankgestaltungen exportieren und importieren. Dabei werden Formeln und Lotus Script Code ebenso exportiert wie verwendete Bitmaps. Masken werden z. B. als <form>-Strukturen kodiert, die ein <body>-Element enthalten, das wiederum <richtext> ist. Für die Beschreibung der Darstellung einer Maske werden dieselben RTF-Tags verwendet, die auch bei der Kodierung des Inhalts eines RTF-Feldes zum Einsatz kommen. Neben Texten, die z. B. als Beschriftung eines Feldes in der Maske verwendet werden, sind in den DesignInformationen zur Maske die <field>-Elemente Teil der <richtext>-Struktur. Die RTFTags erlauben eine exakte Definition der Position der Felder. Abbildung 3 – Feld mit Formel Abbildung 3 zeigt ein berechnetes Feld aus dem persönlichen Adressbuch (names.nsf). Die Formel zum Ereignis "defaultvalue" ist als Daten eines <formula>Tags angegeben. Wie die übrigen Gestaltungselemente repräsentiert werden, kann man durch ein wenig Experimentieren mit dem XML Toolkit leicht ermitteln. Eine mögliche Anwendung des DXL-Exports von Gestaltungselementen ist beispielsweise die exakte Dokumentation einer Datenbank. Über den DXL-Import könnten von einem Programmgenerator erzeugte Datenbankgestaltungen eingelesen werden. Seite 3 von 8 Notwendige Erweiterungen Das API des Toolkits stellt leider nur sehr rudimentäre Funktionen zur Verfügung. So ist der Export lediglich für einzelne Dokumente oder die gesamte Datenbank möglich. Es wäre zwar prinzipiell möglich, das Filtern einer DXL-Datei, die eine vollständige Datenbank enthält, durch XSLT-Schablonen vorzunehmen, jedoch ist dieser Ansatz für große Datenbanken aus Performanzgründen nicht praktikabel. Mit Hilfe des Einzeldokumentexports sowie der in der Domino-DTD vorgegebenen <Database>-Struktur lässt sich eine Erweiterung des DXL-Exports programmieren. Dazu werden zunächst mit Hilfe des Standard Domino Java APIs eine Menge von Dokumenten über eine beliebige Formel definiert. Im Beispielprogramm (Listing 1 und 2) kann diese Formel in der Kommandozeile der Exportapplikation angegeben werden. Anschließend wird jedes Dokument aus der Ergebnismenge der Selektion einzeln abgearbeitet. Mit der NotesID jedes Dokumentes wird die exportDXL()Methode einer Instanz der Klasse DXLExporter aus dem XML-Toolkit aufgerufen. Diese speichert ihr Ergebnis in einem ByteArrayOutputStream. Dort befinden sich die relevanten Daten zwischen den <Document>-Tags, die in der dritten Zeile der ByteFolge beginnen. Abbildung 4 – Zusammenführen der Einzelexporte Wie in Abbildung 4 dargestellt, werden die Daten jedes einzeln exportierten Dokumentes in die Zieldatei des Exports übernommen. Am Anfang dieser Datei werden ein XML-Header sowie die Informationen über die Datenbank vermerkt, aus welcher der Export erfolgt ist. Die Datei enthält eine beliebige Menge von <document>-Datensätzen und endet mit dem </database>-EndTag. Möchte man den Code der Beispielapplikation in einer länger laufenden Anwendung wie z. B. einem Servlet einbetten, so sollte man nicht vergessen, die von der Notes Schnittstelle gebundenen Ressourcen mit der recycle()-Methode der verwendeten Java-Instanzen freizugeben. Seite 4 von 8 Aufbereitung der XML-Daten Aus einer Datenbank exportierte DXL-Daten enthalten keine Formatierungsinformationen. Betrachtet man sie im Internet-Explorer, sieht man daher nur die Standarddarstellung für XML-Strukturen. Um sie formatiert darstellen zu können, müssen sie in ein Format mit Darstellungsinformationen wie z. B. HTML transformiert werden. Die in Abbildung 5 dargestellte Beispielschablone extrahiert den Inhalt der LastName-Felder aus einer DXL-Datei mit Personen-Dokumenten aus dem persönlichen Adressbuch. Die einzelnen Namen werden jeweils in einer eigenen Zeile ausgegeben. Zu beachten sind die türkis dargestellten Textabschnitte. Die DXL-Tags aus der Quelldatei, auf welche die Schablone angewendet werden soll, befinden sich im Namespace DXL. Dieser muss im <xsl:stylesheet>-Tag definiert werden. Außerdem funktioniert der Zugriff auf ein Tag aus der DXL-Datei nur mit dem dxl:-Präfix. Eine hervorragende Einführung und Vertiefung der umfangreichen XSLT-Möglichkeiten und Befehle ist Micheal Kays "XSLT Programmer's Reference", das bei Wrox Press erschienen ist. Abbildung 5 – XSLT-Schablone für das persönliche Adressbuch Die XSLT-Schablone wird mit Hilfe eines XSLT-Prozessors auf die DXL-Datei angewendet. Wie bereits erwähnt, enthält jede neuere Domino-Distribution den Lotus XSL Prozessor in der Datei LotusXSL.jar. Zusätzlich sollte sich XML4J.jar im Klassenpfad befinden, da sowohl die DXL-Datei als auch die XSLT-Schablone mit dem dort enthaltenen Parser eingelesen werden. Der in Abbildung 6 zu findende Aufruf startet den XSL-Prozessor und teilt ihm mit, welche DXL-Datei (names.xml) mit welcher XSLT-Schablone (names2html.xsl) in welche Ausgabe-Datei (names.html) umgewandelt werden soll. Außerdem wird der XML4J-Parser als XMLParser spezifiziert. Seite 5 von 8 Abbildung 6 – Aufruf von LotusXSL und XML4J als Parser Ein weiteres interessantes Transformationsziel ist die Definition einer speziellen XML-Struktur, die sich an einer konkreten Datenbank orientiert. Man würde in dieser die <item>-Elemente in Tags umwandeln, die dem Feldnamen im Notes-Dokument entsprechen. Dadurch wäre eine typisiertere Schnittstelle möglich, die in der DTD bzw. der Schema-Definition dieser XML-Struktur klar dokumentiert ist. Aus XML- und damit auch aus DXL-Dateien lassen sich PDF-Dokumente (Portable Document Format) für den Acrobat Reader erstellen. Auf der Homepage des Apache-Projektes findet man die notwendigen Werkzeuge und Anleitungen, wie man aus beliebigen XML-Dateien mit Hilfe von FOP PDF-Dateien erzeugen kann. Zusammenfassung Das Lotus XML Toolkit eröffnet für den Java-Programmierer bisher ungeahnte Möglichkeiten. Der vollständige Ex- und Import von Datenbankinhalten und -gestaltung auf XML-Basis öffnet die Domino Plattform ganz erheblich. Das Toolkit lässt sich problemlos an spezielle Bedürfnisse anpassen. Links Seite 6 von 8 Listing 1 – Selektive DXLExport Applikation (Teil 1) Seite 7 von 8 Listing 2 – Selektive DXLExport Applikation (Teil 2) Seite 8 von 8