XML Editing Tool
Transcrição
XML Editing Tool
HTBLA Salzburg Höhere Lehranstalt für Elektronik Ausbildungsschwerpunkt Technische Informatik DIPLOMARBEIT XML Editing Tool Ausgeführt im Schuljahr 2007/8 von: Jürgen Leobacher, 5AHELI-Tb16 Martin Planer, 5AHELI-Tb20 Betreuer: Prof. Mag. Dr. Anton Hofmann Diplomarbeit XML Editing Tool Inhaltsverzeichnis 1 Abstract 3 2 Solution 3 2.1 2.2 2.3 2.4 Application modules . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.1 Web UI . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.2 XML upload . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.3 XML editing interface . . . . . . . . . . . . . . . . . . 5 2.1.4 XSD to Cocoon files transformer . . . . . . . . . . . . 6 2.1.5 Output Handling . . . . . . . . . . . . . . . . . . . . . 7 Call-Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.1 / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.2 /editing interface . . . . . . . . . . . . . . . . . . . . . 7 2.2.3 /output . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.4 /transform . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.5 /webui . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.1 Premises . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.2 Installing XET . . . . . . . . . . . . . . . . . . . . . . 10 2.3.3 Adding a user . . . . . . . . . . . . . . . . . . . . . . . 11 User documentation . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4.1 Web UI - Login . . . . . . . . . . . . . . . . . . . . . . 12 2.4.2 Web UI - Uploading/Creating XML data . . . . . . . . 13 2.4.3 XML Editing Interface . . . . . . . . . . . . . . . . . . 14 2.4.4 Saving/Viewing . . . . . . . . . . . . . . . . . . . . . . 14 3 Verzeichnisse Leobacher, Planer, 5AHELI HTBLA-Salzburg 15 1 Diplomarbeit XML Editing Tool Aufgabenstellung Es soll eine webbasierte XML-Editorschnittstelle zur einfachen Bearbeitung von XML-Metadaten entwickelt und für alle Kunden von Sony DADC bereitgestellt werden. Jedem Kunden ist eine benutzerdefiniert konfigurierbare Website zur Verfügung zu stellen, in der er nach erfolgreicher Authentifizierung existierende Produkte in Form von XML-Daten laden oder neue Produkte erzeugen kann. Durch einen modularen Aufbau des Systems wird die spätere Erweiterung und Anpassung an Kundenbedürfnisse (Design, Layout, Sprache, etc.) erleichtert. Die Vielfalt der von den Kunden in ihren Unternehmen eingesetzten Betriebssystemen setzt die Kompatibilität mit den gängigsten Browsern (Mozilla Firefox, Internet Explorer, Safari, etc.) voraus. Die Kundenspezifischen Parameter (Firmenname, interne Kundennummer, Sprache, XMLValidierungs-Schemata, etc.) sollen zentral in Java-Property-Dateien gespeichert werden. Um das Problem der nicht wohlgeformten XML-Daten in den Griff zu bekommen, müssen alle vom Kunden eingegebenen Daten gegen das entsprechende XML-Schema validiert und bei Falscheingabe eine Fehlermeldung erzeugt werden. Die Weiterverarbeitung der Produktinformationen in verschiedener Art und Weise erfordert die Ausgabe in mehreren Dateiformaten (HTML, PDF, DOC, XLS, etc.). Leobacher, Planer, 5AHELI HTBLA-Salzburg 2 Diplomarbeit XML Editing Tool Eidesstattliche Erklärung Ich erkläre an Eides statt, dass ich die vorliegende Diplomarbeit selbständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die den benutzten Quellen wörtlich und inhaltlich entnommenen Stellen als solche erkenntlich gemacht habe. Salzburg, am —————————————— Jürgen Leobacher —————————————— Martin Planer Leobacher, Planer, 5AHELI HTBLA-Salzburg 3 Diplomarbeit 1 XML Editing Tool Zusammenfassung Da es für die Firma Sony DADC und deren Kunden bislang notwendig war, Programme von Drittanwendern zur Bearbeitung von XML-Daten heranzuziehen, wurde das Projekt, eine Webapplikation zur Bearbeitung von XML-Daten zu erstellen, vorgestellt. Der größte Nachteil der meisten XMLBearbeitungsprogramme, die auf dem Markt erhältlich sind, ist deren vorausgesetztes Wissen bezüglich XML-Datenstrukturen. Für Kunden, die mit solchen Strukturen nicht vertraut sind, kann sich die Bearbeitung dieser Daten als umständlich und komplex erweisen. Wir haben somit eine, den Wünschen von Sony DADC entsprechende, Editorlösung entwickelt, die im Browser ausgeführt wird, und somit von Kundenseite, außer einem Webbrowser, keine technischen Voraussetzungen (z.B. installierte Software, Laufzeitumgebungen, etc.) erfordert. Die wichtigsten Aspekte, die bei der Implementierung berücksichtigt worden sind, waren eine übersichtliche Benutzerführung und eine einfache Bearbeitung der XMLDaten. Über den Anmeldevorgang am Beginn der Applikation authentifizieren sich die verschiedenen Organisationen (Kunden), damit das Programm die kundenspezifischen Daten wie beispielsweise XSD-Dateien, die das eigentliche XML-Produkt beschreiben, oder auch Kundenlogos, dynamisch, also von der aktuellen Organisation abhängig, laden zu können. Um die komplexe XML-Struktur so übersichtlich wie möglich auf eine dem 0-8-15-Benutzer gewohnte Ansicht abzubilden, werden die Daten verarbeitet und in einer sogenannten Baumstruktur zur Anzeige gebracht. Mit dieser können die verschiedenen Hierarchiestufen dargestellt werden, wobei, vergleichbar mit einem wirklichen Baum, jede Verzweigung für einen Hierarchiewechsel steht. Durch eigens vorgesehene Buttons können XML-Elemente hinzugefügt beziehungsweise weggenommen werden. Zur Entwicklung des Tools wurde das XML-Publishing-Framework der Apache Foundation, namens Cocoon, eingesetzt, das einige hilfreiche Funktionen, wie beispielsweise automatische AJAX-Unterstützung, oder XML-Validierung, automatisiert bereitstellt. Die Validierung, die nach jedem Absenden neuer Daten ausgeführt wird, läuft ohne jegliche Einwirkung des Benutzers ab. Sollten eingefügte Datensätze nicht gültig sein, erscheint neben dem betroffenen Element ein Ausrufezeichen, das durch dessen anklicken Informationen über den Fehler ausgibt. Cocoon selbst wird als Java-Servlet ausgeführt, und die Applikation wird, Leobacher, Planer, 5AHELI HTBLA-Salzburg 4 Diplomarbeit XML Editing Tool samt Laufzeitumgebung, im Apache Tomcat Servlet-Container auf einem Server der Firma Sony bereitgestellt. 2 Abstract Until now, Sony DADC and their customers had to use third party software products to edit XML documents. Therefore the need for an easy-to-use XML editing tool emerged. The main disadvantage of existing XML editing tools is the need for knowledge about XML data structures. As customers of Sony DADC hardly have this kind of knowledge, editing XML data can be difficult and complex. Another withdraw of existing tools is often the need for an installation on the computer of the end-user and therefore a higher administration effort. According to the specifications that were given to us by Sony DADC, we created an editing solution that runs in a web browser and therefore eliminates the need for technical prequisites (installation, runtime environment, etc.) other than a standard web browser. The main aspect that was taken into account during the whole development process was usability by persons without previous knowledge of XML. As many different organizations should be able to use the tool independently, the users are asked to authorize at the beginning of login window loads the user-specific data (XML schema, logo, stylesheets) dynamically after the login procedure. To hide the complex XML structure from the end-user and display it in a more familiar way, the tool uses a tree-view where each branch represents a hierarchical level. Elements can be created or be removed by buttons inside the tree-view. The application was created using the XML publishing framework Cocoon from the Apache Foundation. It contains several useful functions, e.g. AJAX support or XML validation, that were helpful during the development process that can run transparent to the user and only show notifications if something went wrong. Cocoon itself runs as a Java-Servlet in an Servlet-Container, e.g. Apache Tomcat, that has been provided by Sony DADC. Leobacher, Planer, 5AHELI HTBLA-Salzburg 5 Diplomarbeit 3 XML Editing Tool Firmenvorstellung Digital Content Services Software Engineering Digital Works A-5081 Anif, Sonystrae 20 Sony DADC hat langjährige Erfahrung in der Entwicklung individualisierter Anwendungen für die Audio-/Videoverwaltung und -lieferung, wobei wir unsere Asset-Management-Anwendung verwenden, um Firmen erfolgreich zu helfen, ihren Inhalt innerhalb einer kunden- und markenspezifischen Schnittstelle zu liefern. 4 Ist-Analyse Digital Content Services stellt kommerziellen Kunden (meist Musiklabels) Audio-/Video-Content inklusive deren Produktinformationen z.B. für den Verkauf über das Internet zur Verfügung. Die Produkt-Metadaten liegen in der Form von XML-Dateien den Mediendaten bei und beschreiben wichtige Eigenschaften der Daten, wie zum Beispiel bei einer Audio-CD: • Spieldauer • enthaltene Musiktitel • Künstler • Genre • Altersfreigaben • Preis • etc. Sollen diese Daten geändert werden besteht bis jetzt nur die Bearbeitung über externe Programme, zum Beispiel direkt in einem Texteditor. Da sich durch die manuelle Bearbeitung sehr leicht Fehler, die eine weitere Verarbeitung unmöglich machen, in die sensiblen Daten einschleichen, bedarf es genauer Kenntnis über die Struktur der Daten und über XML im Allgemeinen. Leobacher, Planer, 5AHELI HTBLA-Salzburg 6 Diplomarbeit 5 XML Editing Tool Auswirkungen auf die Aufgabenstellung Da die zur manuellen Bearbeitung benötigten Vorkenntnisse nicht von jedem vorausgesetzt werden können, sollen diese gänzlich eliminiert und die Bedienung drastisch vereinfacht werden. Die Daten sollen in einer einheitlichen, übersichtlichen und intuitiv zu bedienenden Oberfläche dargestellt werden, um diese auch von Laien bearbeitbar zu machen. 6 Ziele Ziel dieses Projektes ist die Erstellung eines webbasierten, einfachen Editors zur Bearbeitung von XML-Dateien. Über die Benutzeroberfläche müssen bestehende XML-Datensätze bearbeitet und Neue eingefügt werden können. Das Editieren is für mehrere Benutzer gleichzeitig zu ermöglichen und die Einbindung von neuen Benutzern soll einfach möglich sein. Der modulare Aufbau der Applikation soll eine einfache Erweiterbarkeit sicherstellen um das Programm in späteren Phasen um Funktionen, z. B. Mehrsprachen- oder MS-Excel-Unterstützung, ergänzen zu können. Das Aussehen der Seiten soll von den Benutzern selbst über Stylesheets angepasst und die benutzerspezifischen Parameter über Java-Property-Dateien konfiguriert werden können. Der Editor muss in allen gebräuchlichen Webbrowsern (Firefox, Safari, Internet Explorer) auf allen gebräuchlichen Plattformen (Mac OS, Windows, Linux) fehlerfrei dargestellt und bedient werden können und soll keinerlei zusätzliche Vorraussetzungen besitzen. Alle Daten eines XML-Dokuments müssen vor dem Abspeichern gegen das jeweilige XML-Schema auf Gültigkeit überprüft werden. 7 Nachvorschungen Nachforschungen haben ergeben, dass es keine vergleichbaren Programme gibt, die eine XML-Bearbeitung im Browser ausführen können. Bekannte Applikationen, die XML-Daten bearbeiten können, wie beispielsweise XML Leobacher, Planer, 5AHELI HTBLA-Salzburg 7 Diplomarbeit XML Editing Tool Spy, sind für Anwender die mit der XML-Datenstruktur nicht versiert sind, zu schwer zu bedienen und läuft zudem nicht im Webbrowser. Dieser Zustand gab den Anstoß, eine eigene Applikation zu entwickeln. 8 Lösungsvarianten Um zu Entscheiden welche Technologie für die Realisierung des XML-Tools zum Einsatz kommt, wurde eine Evaluation bereits vorhandener XML-Frameworks vorgenommen. Diese wurden auf folgende Gegebenheiten überprüft: • Open Source • XML-Bearbeitung via HTML Forms • XML-Validierung gegen XSD • einfache Implementierungsmöglichkeiten • Community • Technologie up-to-date Die Entscheidung fiel auf das Apache Cocoon Framework: • umfangreiche Möglichkeiten • modulare Struktur • aktuelle Technologie • Open Source • flexible Schnittstellengestaltung möglich Bei der Evaluation (siehe Technology Evaluation im Anhang) schien das XML-Publishing-Framework Apache Cocoon, im Vergleich zu ähnlichen Frameworks, am umfangreichsten und deswegen geeignet für den Einsatz für das XML Editing Tool. Leobacher, Planer, 5AHELI HTBLA-Salzburg 8 Diplomarbeit 9 9.1 9.1.1 XML Editing Tool Lösung/Solution Organization Schedule Leobacher, Planer, 5AHELI HTBLA-Salzburg 9 Diplomarbeit 9.2 XML Editing Tool Application modules This section describes the technical realization of the modules in detail and how they work together. Abbildung 1: Module overview 9.2.1 Web UI If the xml tool is used standalone the Web UI acts as superior interface that supplies the XML editing interface with the XML product file using the HTTP POST method. The Web UI is realized with standard HTML technology, to offer sites for several user groups/customers a stylesheet should be used. Further two logos, one for Sony DADC and one for the customer, must be configurable for each site. Leobacher, Planer, 5AHELI HTBLA-Salzburg 12 Diplomarbeit 9.2.2 XML Editing Tool XML upload To edit XMLs the user can select an .xml file from the local hard drive. When the user has chosen an XML file and confirmed he is redirected to the XML editing interface which displays an html form with the data of the XML file (create binding and load document Cocoon flowscript functions). Only one single file can be chosen for editing, multiple files have to be edited sequentially. Also no kind of merging two or multiple XMLs exists therefore. The extension of files must be configurable and is set to .xml in the initial phase. The server part must run within Tomcat, the client part is integrated into the Web UI sites. Embedding the application into an existing website happens by including the XML upload by means of an iframe. The correct url to reach it is [server]/xmlgt/webui/main/[organization]. 9.2.3 XML editing interface The XML editing interface is called with the parameter load (...editingpage/load) which is processed by the sitemap (Sitemap.xmap). This parameter effects a call of the onload function in the flowscript (flow.js) with the product file (dynamic filename). First step by the function is creating a new form by using a form definition file (formDefinition.xml) from the transformer. Last step ere redirecting back to the sitemap an xml filestream has to be set up by the function loadXML with the product file as parameter. Now after the conditions for representing a dynamic XML editing page with apache cocoon has been taken the onload function calls the sitemap with the function load ok. The load ok part implements the pretransformed formDefinition and formTemplate files. After submitting the changed metadata values, the flowscript is re-entered for saving the new XML file data onto the server. Now that editing process is over, the output handler is called if all data is valid against the formDefiniton file (equivalent to the XSD file). To prevent a potential validation error executed by cocoon an additional validation step against the actual XSD file is carried out. Leobacher, Planer, 5AHELI HTBLA-Salzburg 13 Diplomarbeit 9.2.4 XML Editing Tool XSD to Cocoon files transformer Abbildung 2: Sequence diagram of transformation Leobacher, Planer, 5AHELI HTBLA-Salzburg 14 Diplomarbeit XML Editing Tool Given that Cocoon uses its own format for defining forms (form files) a XSD to form definition file and form template file transformer has to be developed. To perform successful transformation make sure the XSD file is located at xmlgt/transform/input with the username (name of organization) as filename and the extension .xsd. If a form has to be created, the according XSD is read, parsed and the matching form definition file and form Template file is created and written to the server. These files may now be copied from xmlgt/transform/output to xmlgt/editinginterface/resources/[username] to make use of these files. As XSDs can have rather complex rules the transformation has to consider typical XSD types (e.g. XSD simple type / complex type) and rules (e.g. min- and maxOccurence fields, data format restrictions, etc.). 9.2.5 Output Handling Output of the XML editing interface is an XML containing the metadata manipulated in the html form previously by catching it from the server. For the initial phase this XML can be either downloaded or displayed in the browser. In later project phases the output handler should handle alternative formats (Excel, doc, pdf, etc.) and also allow redirection to a system like Webservices. 9.3 9.3.1 Call-Paths / Simply calling / will redirect you to the webui an will show the login form. 9.3.2 /editing interface The Editing-Interface is the main part of the XET project. Everything from reading and loading the XML document and editing it up to runtime-validation is taken place here. /editing interface/new/[username] the user-specific schema. Creates an empty form based on [username ] The username as used to login (same as the filename of the corresponding properties-file) Leobacher, Planer, 5AHELI HTBLA-Salzburg 15 Diplomarbeit /editing interface/load/[username]/[xml-file] file into a form for editing. XML Editing Tool Loads the given XML [username ] The username as used to login (same as the filename of the corresponding properties-file) [xml-file ] The name of the XML file in /uploads. The file has to exist before calling this function. 9.3.3 /output The Output-Handler is used to show the user a menu for showing or downloading the desired XML document. It also reverts some changes that were made to the XML document by Apache Cocoon by applying some transformations on it. /output/[username]/[xml-file] Applies the transformations and shows the user a menu to choose between showing and downloading the XML file. It also validates the outgoing XML against it’s XSD and shows an error if not valid. [username ] The username as used to login (same as the filename of the corresponding properties-file) [xml-file ] The name of the XML file in /uploads. The file has to exist before calling this function. /output/transform/[xml-file] Only applies the transformations and displays the output in the browser. This pipeline is only called internally and/or for debugging. [xml-file ] The name of the XML file in /uploads. The file has to exist before calling this function. /output/show/[xml-file] Displays the XML file directly in the browser. As the transformations are only called by /output/[username]/[xml-file] and /output/transform/[xml-file], one of these functions has to be called first in order to get a valid XML file. [xml-file ] The name of the XML file in /uploads. The file has to exist before calling this function. Leobacher, Planer, 5AHELI HTBLA-Salzburg 16 Diplomarbeit XML Editing Tool /output/download/[xml-file] Is used to download the XML file and save it on the harddisk. As the transformations are only called by /output/[username]/[xmlfile] and /output/transform/[xml-file], one of these functions has to be called first in order to get a valid XML file. [xml-file ] The name of the XML file in /uploads. The file has to exist before calling this function. /output/outputmenu/[username]/[xml-file] Only shows the user a menu to choose between showing and downloading the XML file. As the transformations are only called by /output/[username]/[xml-file] and /output/transform/[xmlfile], one of these functions has to be called first in order to get a valid XML file. [username ] The username as used to login (same as the filename of the corresponding properties-file) [xml-file ] The name of the XML file in /uploads. The file has to exist before calling this function. 9.3.4 /transform The Transformer is user to convert the xml schema definition to the equivalent file formats used by Apache Cocoon (form definition, form template). /transform/[username] Applies the XSD =¿ formDefinition, formTemplate transformation to the file [username].xsd in /xsd and writes the output to /transform/output. [username ] The username as used to login (same as the filename of the corresponding properties-file) /transform/[xsl]/[xsd]/[root-element] Applies the XSD =¿ formDefinition, formTemplate transformation to the file [xsd] and writes the output to /transform/output using the specified XSL and starting with the given root-element [root-element]. [xsl ] The XSLT file in /transform/resources that should be used for the transformation. Leobacher, Planer, 5AHELI HTBLA-Salzburg 17 Diplomarbeit XML Editing Tool [xsd ] The XSD file in /xsd that should be transformed. [root-element ] The root-element of the given XSD where the transformation should start. 9.3.5 /webui The Web-UI is used to authenticate a user and to display a menu to choose between inserting a new XML file and editing an existing one. /webui Calls the login() function and displays the login form. /webui/main/[username] Shows the main menu where the user can choose between inserting a new XML file and editing an existing one. [username ] The username as used to login (same as the filename of the corresponding properties-file) 9.4 9.4.1 Installation Premises To get XET up and running you will need the following: • XET.war file (including Apache Cocoon) • Apache Tomcat Servlet Container (Version 5.5.25 or higher recommended) or equivalent 9.4.2 Installing XET Simply deploy the XET.war file to your Apache Tomcat Server like any other Servlet using manual or auto deployment. Leobacher, Planer, 5AHELI HTBLA-Salzburg 18 Diplomarbeit 9.4.3 XML Editing Tool Adding a user To successfully add a new user to the XET application you will need • the XSD that validates the user-specific XML files • access to the Tomcat webapps folder with writing permissions Create a new properties file in der /properties folder called like the desired username (e.g. sample.properties if the desired username is sample) and fill the required lines. You can use the sample.properties file as a starting point in creating a new properties file. More information about the required properties can be found in chapter ??. Put the user-specific XSD file in the /xsd folder (note that the filename of the XSD file and the XSD property in the properties file have to identical!). Now the XSD file has to be transformed into the Cocoon-specific CForms files by calling the /transform/::username:: path of the application (e.g. http://localhost/xet/transform/sample for user sample). A message will show up if the transformation process has been completed successfully. Create a new folder with the name ::username:: in the /editing interface/forms folder (e.g. /editing interface/forms/sample for user sample) and move the 3 files that were generated by the transformer from /transform/output to this new folder. The new user should now be ready to be used. 9.5 User documentation In this chapter a full interaction cycle that the user executes while using the application is simulated. Every part is described so that the user knows how and why several steps ought to be taken. Leobacher, Planer, 5AHELI HTBLA-Salzburg 19 Diplomarbeit 9.5.1 XML Editing Tool Web UI - Login Abbildung 3: Login Screen After entering the appropriate URL (to reach the XML Editing Tool) a login dialog appears. Two user specified properties are needed, and should be inserted in the available text boxes: • User name Equivalent to the name of the organization. • Password Generally the user name will do. If required, insert your password too. Leobacher, Planer, 5AHELI HTBLA-Salzburg 20 Diplomarbeit 9.5.2 XML Editing Tool Web UI - Uploading/Creating XML data Abbildung 4: Uploading/Inserting Screen Provided that all inserted user data matches the correct patterns, the user is forwarded to the so called XML Uploading/Creating page. Two options are offered, to either create a new file by clicking the Insert button, or to edit an existing file by clicking the designated Edit button. If the Edit option was chosen, a file dialog occurs to upload an existing XML file from the local hard drive. In case of the Insert option, the user is directly forwarded to the XML Editing Interface. Leobacher, Planer, 5AHELI HTBLA-Salzburg 21 Diplomarbeit 9.5.3 XML Editing Tool XML Editing Interface Abbildung 5: Editing Interface The conventional XML data structure may be a bit unclear and confusing in some respect. Therefore the hierarchical structure of XML data is illustrated as tree view to provide a clearly arranged view at the data. Adding or removing elements is just as easy as clicking on the provided Add ’Element’ and Remove ’Element’ button respectively. After deciding to save changed data by clicking the Save button a data validation against the specified XSD is carried out. In case of an inserted entity is invalid an exclamation occurs to the right of the text box. To receive information about the error just click on it. A blue asterisk beside a text box indicates that the XML element is required and therefore must contain data. 9.5.4 Saving/Viewing After successfully editing existing XML files or inserting a new one, the user gets offered the choice to download the new XML file or just to view it in the browser. As the name of each button suggests, clicking Download effects a file download and Display illustrates the produced XML data in the browser. Leobacher, Planer, 5AHELI HTBLA-Salzburg 22 Diplomarbeit XML Editing Tool The third button named Back to home redirects to the Inserting/Uploading page to give chance for editing or creating another XML file. 10 Ertrag Während der Entwicklung des hier vorliegenden Projekts haben wir sehr viel wertvolle Erfahrung für den Ablauf eines Projekts mit dieser Größe im Allgemeinen gesammelt. Auch die Zusammenarbeit mit einer großen Firma wie Sony DADC gab uns Einblick in die internen Strukturen und Abläufen in wirtschaftlichen Unternehmen und zeigte uns Differenzen zwischen diesen und den in der Schule Gelernten auf. Die Verwendung des XML-Publishing-Frameworks Cocoon war, im Nachhinein betrachtet, wahrscheinlich nicht die Beste. Die Eigenheiten dieses Produkts (spezielle XML-Struktur zur Verwendung von Repeatern nötig, Transformation von XSD auf Cocoon-spezifische Formate nötig, etc.) sind nur durch Umwege (z.B. wie in unserem Fall durch unzählige XSL-Transformationen) in den Griff zu bekommen und behindern den Fluss der Entwicklung. Die Dokumentation des Cocoon-Frameworks ist leider dürftiger als es auf den ersten Blick aussieht. Die einzigen brauchbaren Quellen, die zur Entwicklung herangezogen werden können, sind die (sehr oberflächliche,) offizielle Dokumentationswiki1 , das Buch ”Cocoon 2 und Tomcat”2 von Stephan Niedermeier, das Cocoon-Tutorial3 desselben Autors sowie das Cocoon-Forum4 . Alles was über die Grundlagen hinausgeht, muss mühselig selbst erarbeitet werden. Die Fehlersuche gestaltet sich, aufgrund des fehlenden Debuggers für die Pipelines (es existiert nur ein Flowscript-Debugger, den uns nie eine wirkliche Hilfe war), zur Suche nach der Nadel im Heuhaufen. Bei einer neuen Entwicklung in diesem Tätigkeitsfeld würden wir nicht mehr auf Cocoon, sondern auf weiter verbreitete Frameworks und Programmiersprachen zurückgreifen (Java Servlets, Google Web Toolkit, Ruby on Rails, ...). 1 http://cocoon.apache.org/2.1 Niedermeier 2006: Stephan Niedermeier, Cocoon 2 und Tomcat: XML-Publishing mit dem Open-Source-Framework. (Galileo Press 2006) 3 http://cocoontutorial.logabit.com/ 4 http://www.cocoonforum.de/ 2 Leobacher, Planer, 5AHELI HTBLA-Salzburg 23 Diplomarbeit 11 XML Editing Tool Verzeichnisse Abbildungsverzeichnis 1 Module overview . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 Sequence diagram of transformation . . . . . . . . . . . . . . . 6 3 Login Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4 Uploading/Inserting Screen . . . . . . . . . . . . . . . . . . . 13 5 Editing Interface . . . . . . . . . . . . . . . . . . . . . . . . . 14 Leobacher, Planer, 5AHELI HTBLA-Salzburg 24 Diplomarbeit 12 XML Editing Tool Anhang Alle hier aufgelisteten Dateien liegen der Diplomarbeit, am Ende hinzugefügt, bei. 12.1 Vertiefende Arbeiten • Google Web Toolkit • XML und Datenbanken 12.2 Meeting Minutes/Report • XML Generation Tool Meeting Minutes 20071113 • XML Generation Tool Meeting Minutes 20071127 • XML Generation Tool Meeting Minutes 20080115 • XML Generation Tool Meeting Minutes 20080129 • XML Generation Tool Meeting Minutes 20080205 • XML Generation Tool Meeting Minutes 20080220 • XML Generation Tool Meeting Minutes 20080304 12.3 Weekly Report • XML Generation Tool Weekly Report KW05 • XML Generation Tool Weekly Report KW46 • XML Generation Tool Weekly Report KW48 12.4 Technology Evaluation • XML Tool Technology Evaluation 12.5 Requirements • XML Generation Tool Requirements v1.0 Leobacher, Planer, 5AHELI HTBLA-Salzburg 25 HTBLA Salzburg Höhere Lehranstalt für Elektronik Ausbildungsschwerpunkt Technische Informatik DIPLOMARBEIT Google Web Toolkit Ausgeführt im Schuljahr 2007/8 von: Jürgen Leobacher, 5AHELI-Tb16 Betreuer: Prof. Mag. Dr. Anton Hofmann Diplomarbeit Google Web Toolkit Inhaltsverzeichnis 1 Einleitung 6 2 Einführung ins GWT 6 3 Benutzerschnittstelle 7 3.1 Widgets und Panels . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Widgets selber schreiben . . . . . . . . . . . . . . . . . . . . . 10 3.2.1 Composite . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2.2 Neues Widget . . . . . . . . . . . . . . . . . . . . . . . 11 3.2.3 Styles mit CSS . . . . . . . . . . . . . . . . . . . . . . 13 4 Architektur 4.1 15 Debugging und Deployment . . . . . . . . . . . . . . . . . . . 15 4.1.1 Hosted Mode . . . . . . . . . . . . . . . . . . . . . . . 15 4.1.2 Web Mode . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.1.3 Java-to-JavaScript Compiler . . . . . . . . . . . . . . . 15 5 Applikationsentwicklung 5.1 16 Remote Procedure Calls . . . . . . . . . . . . . . . . . . . . . 16 5.1.1 5.2 7 RequestBuilder . . . . . . . . . . . . . . . . . . . . . . 16 Performanz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5.2.1 Startzeit . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.2.2 Laufzeit . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.3 Commandlinetools . . . . . . . . . . . . . . . . . . . . . . . . 20 5.4 Projektverzeichnisstruktur . . . . . . . . . . . . . . . . . . . . 21 5.5 Codebeispiel - Einfaches Tutorial . . . . . . . . . . . . . . . . 21 5.5.1 Projektsourcen erzeugen . . . . . . . . . . . . . . . . . 22 5.5.2 Projekt in Eclipse laden . . . . . . . . . . . . . . . . . 23 5.5.3 Style hinzufügen . . . . . . . . . . . . . . . . . . . . . 29 5.5.4 Am Webserver bereitstellen . . . . . . . . . . . . . . . 32 Jürgen Leobacher, 5AHELI HTL Salzburg 1 Diplomarbeit Google Web Toolkit 6 Pizzaprogramm 34 6.1 Programmbeschreibung . . . . . . . . . . . . . . . . . . . . . . 34 6.2 Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . 34 6.3 Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . 34 6.4 6.3.1 MeinRadioPanel . . . . . . . . . . . . . . . . . . . . . 36 6.3.2 Zusatzbelag (CheckBox) . . . . . . . . . . . . . . . . . 37 6.3.3 Zahlungsart . . . . . . . . . . . . . . . . . . . . . . . . 38 6.3.4 Bestellung abschicken . . . . . . . . . . . . . . . . . . . 40 Style verpassen . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Jürgen Leobacher, 5AHELI HTL Salzburg 2 Diplomarbeit Google Web Toolkit Abbildungsverzeichnis 1 Widgets-Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2 Panels-Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3 Daten/Code-Zyklus . . . . . . . . . . . . . . . . . . . . . . . . 18 4 Basisverzeichnisstruktur . . . . . . . . . . . . . . . . . . . . . 21 5 ProjectCreator . . . . . . . . . . . . . . . . . . . . . . . . . . 22 6 ApplicationCreator . . . . . . . . . . . . . . . . . . . . . . . . 22 7 Projektimport . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 8 Importdialog . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 9 Importdialog . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 10 Applikationsgerüst . . . . . . . . . . . . . . . . . . . . . . . . 26 11 Compilieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 12 GWT-Browser Hosted Mode . . . . . . . . . . . . . . . . . . . 29 13 Hinweisfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 14 Neue Datei anlegen . . . . . . . . . . . . . . . . . . . . . . . . 30 15 Dateidialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 16 GWT-Browser Hosted Mode . . . . . . . . . . . . . . . . . . . 32 17 Java-to-JavaScript compilieren . . . . . . . . . . . . . . . . . . 32 18 Applikation im Safari-Browser . . . . . . . . . . . . . . . . . . 33 19 Programm ohne Style . . . . . . . . . . . . . . . . . . . . . . . 45 20 Programm mit Style . . . . . . . . . . . . . . . . . . . . . . . 47 Jürgen Leobacher, 5AHELI HTL Salzburg 3 Diplomarbeit Google Web Toolkit Eidesstattliche Erklärung Ich erkläre an Eides statt, dass ich die vorliegende Diplomarbeit selbständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die den benutzten Quellen wörtlich und inhaltlich entnommenen Stellen als solche erkenntlich gemacht habe. Salzburg, am —————————————— Jürgen Leobacher Jürgen Leobacher, 5AHELI HTL Salzburg 4 Diplomarbeit Google Web Toolkit Abstract As the web and its enormous scope of use is spreading so fast these days, modern web frameworks are gaining popularity. Their aim is to provide developers with easy-to-use programming tools for intuitive user interface design. The key element of modern web technology is AJAX, which is an acronym that stands for Asynchronous JavaScript and XML, and is frequently implemented in this kind of frameworks. This fact makes it hard to differentiate between relevant frameworks that are worth considering in conjunction with successfully creating web applications. The Google Web Toolkit (GWT) is a prime example in terms of reducing the costs of writing highly sophisticated browser applications. Therefore the focus of the present document lies on the technical implementation of Google’s web developing tools. Reading this document requires no previous knowledge about the GWT. In fact, an understanding of Java programming and the basic internet infrastructure (HTTP-Protocol, Webserver, HTML/CSS, XML etc.) is taken for granted. The toolkit itself basically comprises of the actual framework and a banner cross compiler. The framework supplies developers with a bunch of functions, methods, APIs and reusable UI components that are capable of automating AJAX implementation. Google’s Java-to-JavaScript compiler converts Java code into compact JavaScript. The benefits of applying JavaScript are its minimalistic resource requirements and the automatic cross browser support. Furthermore a full life cycle of creating, programming and deploying a GWT project from scratch will be simulated. Since developers are writing in Java they may use their favorite IDE like Eclipse or NetBeans with fullfeatured debugging and unit testing support. Preventing memory leaks and redundant server calls (RPC) is of utmost significance. In return a paragraph about performance prevents web developers from programming error-prone and inefficient routines. Jürgen Leobacher, 5AHELI HTL Salzburg 5 Diplomarbeit 1 Google Web Toolkit Einleitung Da sich der Einsatz von Webtechnologien zur Applikationsgestaltung in der letzten Zeit immer mehr verbreitete, haben Frameworks, wie beispielsweise das Google Web Toolkit, die Entwicklern bei der Softwareentwicklung unter die Arme greifen sollten, an Interesse gewonnen. War vor wenigen Jahren der Einsatz von purem HTML noch ausreichend, sind aktuelle, moderne Webframeworks in ihrem Umfang bereits mit Frameworks für Desktopanwendungen vergleichbar. In der vorliegenden Arbeit wird, wie es der Titel schon vermuten lässt, das Web-Toolkit von Google, mit dem unter anderem die bekannte Webapplikationen Google Maps entwickelt worden ist, näher in dessen Möglichkeiten zur intuitiven Webgestaltung beleuchtet. 2 Einführung ins GWT Das Google Web Toolkit (GWT) ist, allgemein gesprochen, darauf ausgelegt die AJAX-Programmierung zu vereinfachen. AJAX (Asynchronous JavaScript and XML) macht aus einem passiven Webbrowser, der HTMLSeiten parst und anzeigt, eine intelligente JavaScript interpretierende Software, die durch dessen Implementierung die Ausführung von anspruchsvollen Webapplikationen erlaubt. Ohne AJAX führt jede Statusänderung der Webseite zu einem vollständigen Neuladen der Seite, und ein Verlaufseintrag wird angelegt, der es dem Benutzer ermöglicht, vergangene Zustände durch den Zurückbutton des Browsers abzurufen. Genau dort setzt AJAX an und konstatiert: ’Verwende nie den Zurückbutton!’. In dem praktischen Anwendungsbeispiel einer Onlinetransaktion wird es klar, warum das Verwenden des Zurückbuttons dem Anwender zum Nachteil gereicht. Wird der Auftrag zu bezahlen gegeben, folgt dem ein komplettes Neuladen der Seite. Angenommen der Browser bleibt nun genau zwischen dem Zeitpunkt vom Absenden der Daten und der geladenen, folgenden Seite stecken, oder der Webserver ist überlastet, dann kann das Klicken auf ’Zurück’ dazu führen, dass die Transaktion wiederholt ausgeführt wird. Theoretisch sollte es derartige Probleme bei mit AJAX-Technologie entwickelten Webapplikationen nicht geben, da der Status der Website nun clientseitig ausgeführt wird, indem bloß der sich ändernde Teil der Website in Form von XML-Daten mittels JavaScript zum Server geschickt wird. Dies ist dann ein sogenannter XML-HTTP-Request1 . Somit werden aufwendige Operationen, die normalerweise der Server, der mit HTTP angesprochen wird, ausführen müsste, auf des Clients System 1 http://www.w3.org/TR/XMLHttpRequest/ Jürgen Leobacher, 5AHELI HTL Salzburg 6 Diplomarbeit Google Web Toolkit übertragen. Ein vorteilhafter Nebeneffekt dabei ist eine Echtzeitinteraktion mit dem Benutzer, die bei Webapplikationen lange ersehnt war. GWT ist also ein Framework um Browserapplikationen vollständig in Java, mit allen gewohnten Tools und Klassen, ohne manuell JavaScript schreiben zu müssen, zu entwickeln. Möglich ist dies durch einen Crosscompiler, der den Java-Code in eine JavaScript Anwendung übersetzt, die nun ohnehin von allen gängigen modernen Browsern interpretiert werden kann. Der Unterschied zu JavaApplets dabei ist, die fehlende Notwendigkeit einer, am Client installierten Java Virtual Machine, die Java-Code interpretiert und ausführt. 3 Benutzerschnittstelle 3.1 Widgets und Panels Die Widgets2 des GWT enthalten alle bekannten HTML-UI-Elemente (UI= Userinterface), wie beispielsweise eine Listbox, Textbox, Button, Checkbox, etc. Den Entwicklern des Frameworks war es wichtig alle HTML-Widgets zu belassen, und nur dann Neue zu implementieren, wenn diese wirklich die Benutzerfreundlichkeit verbessern. Der Unterschied zu ähnlichen UI-Frameworks wie SWING3 oder SWT4 ist, dass die Oberfläche mit dynamischem HTML statt mit Pixelgrafiken erzeugt und dargestellt wird. Dies bewirkt eine Betriebssystem native Darstellung, sofern der Browser dies unterstützt. Die Liste der Widgets und Panels, die in der GWT user-interface library integriert sind, ist groß und sollte den Webentwicklern alles Notwendige für eine benutzerfreundliche Schnittstelle zur Verfügung stellen. 2 http://code.google.com/webtoolkit/documentation/com.google.gwt.doc. DeveloperGuide.UserInterface.html 3 http://java.sun.com/javase/6/docs/technotes/guides/swing/ 4 http://www.eclipse.org/swt/ Jürgen Leobacher, 5AHELI HTL Salzburg 7 Diplomarbeit Google Web Toolkit (a) Button (b) RadioButton (c) PushButton (d) ToggleButton (e) TextBox (f) CheckBox (g) PasswordTextBox (h) TextArea (i) Hyperlink (j) ListBox (k) MenuBar (l) Tree (m) Table (n) TabBar (o) DialogBox Abbildung 1: Widgets-Liste Jürgen Leobacher, 5AHELI HTL Salzburg 8 Diplomarbeit Google Web Toolkit (a) PopUpPanel (b) StackPanel (c) HorizontalPanel (d) VerticalPanel (e) FlowPanel (f) VerticalSplitPanel (g) HorizontalSplitPanel (h) DockPanel (i) TabBar Abbildung 2: Panels-Liste Neben den Widgets bestehen, wie ersichtlich, sogenannte Panels. In Panels , vergleichbar mit Containern der Java-Swing-Library, können Widgets gegeben werden, und dienen eher dem Layout, als der eigentlichen Benutzerinteraktion. Jürgen Leobacher, 5AHELI HTL Salzburg 9 Diplomarbeit 3.2 Google Web Toolkit Widgets selber schreiben Ein Widget basiert also auf einem UI-Object (bezogen auf das DOM5 ), das als Basisklasse dient, und unterscheidet sich prinzipiell bloß darin, dass es zusätzliche Funktionalitäten, wie ein anderes Aussehen oder wenn man eine Textbox betrachtet, eine Funktion besitzt, die mögliche Textboxwerte anzeigt. Will man nun selber ein Widget schreiben, gibt es grundsätzlich zwei Ansätze dies zu realisieren. Man kann entweder die Composite-Funktionalität des GWTs verwenden, mit der aus bereits vorhandenen Widgets ein eigenes erstellt werden kann, oder man erzeugt eines, das auf keinem bestehenden Widget basiert. Mit der zuletzt erwähnten Methode sind beispielweise alle Basis-Widgets des GWTs implementiert worden. 3.2.1 Composite Ein Composite, das selbst ein Widget ist, erlaubt es eigene Widgets und Panels zu erstellen. Dies geschieht durch das Zusammenfügen bereits vorhandener Widgets. Code 1 Composite-Beispiel class MeinComposite extends Composite { private FlowPanel pan = new FlowPanel ( ) ; private Label lbl = new Label ( ) ; private TextBox tbox = new TextBox ( ) ; } public MeinComposite ( ) { p . add ( lbl ) ; p . add ( tbox ) ; initWidget ( pan ) ; } (vgl. J. Webber - Creating Widgets, S.5) Dieses Composite-Beispiel zeigt, wie man ein eigenes Widget (MeinComposite) als Unterklasse der bereits vorhandenen Composite-Klasse ableitet. Zunächst werden alle Basis-Widgets als private, das bedeutet keine andere Klasse kann diese instanziieren, erzeugt. Zuletzt wird der Konstruktor MeinComposite() als public, jede Klasse kann Instanzen dieser Klasse erzeugen, 5 http://www.w3.org/DOM/ Jürgen Leobacher, 5AHELI HTL Salzburg 10 Diplomarbeit Google Web Toolkit so definiert, dass dem Panel pan ein Label lbl und eine Textbox tbox eingebunden werden. Bei der Verwendung von ”Mein Composite”wird also automatisch eine TextBox zusammen mit einem Label angezeigt. Wie in diesem Beispiel klar erkennbar wird, dient ein Composite prinzipiell als Bündelung bereits vorhandener Widgets, und kann in der Strukturierung der Benutzerschnittstelle Anwendung finden. 3.2.2 Neues Widget GWT bietet eine DOM-Klasse, die mit dem DOM (Document Object Model) kommunizieren kann. Das DOM beschreibt die Struktur eines HTMLDokuments. Somit kann man durch hinzufügen neuer HTML-Tags ein Widget erstellen, das ausschließlich auf vorhandenen HTML-Tags besteht. Mit der sinkEvents Methode wird dem neuen Widget ein EventListener zugewiesen. Im Programmcode wird, ähnlich wie bei den Composites, das zu Erzeugende Widget von der Basisklasse namens Widget abgeleitet. Praktisch sieht dies in Java wie folgt aus: Code 2 Ableiten von der Widget-Klasse public class NeuesWidget extends Widget { Im Konstruktor dieses Widgets, public NeuesWidget(), werden die eigentlichen (HTML-)Elemente, die dieses Widget repräsentieren, festgelegt. Es ist möglich, mehrere HTML-Tags hinzuzufügen, es muss jedoch ein Hauptelement gesetzt werden, was unter Verwendung der setElement Methode passiert, dessen Übergabeparameter ein Basis-UI-Element6 aus dem Document Object Model ist: Code 3 Hauptelement setzen setElement ( DOM . createHTMLTAG ( ) ) ; Wie bereits kurz angesprochen, muss jedem Widget einen EventListener zugeteilt werden. Diese Zuteilung erfolgt durch die sinkEvents Methode, deren Liste der UI-Elemente: http://google-web-toolkit.googlecode.com/svn/ javadoc/1.4/com/google/gwt/user/client/DOM.html 6 Jürgen Leobacher, 5AHELI HTL Salzburg 11 Diplomarbeit Google Web Toolkit Aufruf der Widget-Basisklasse mitteilt, auf welche Ereignisse reagiert werden soll. Diese Zuweisung wird ebenso im Konstruktor vorgenommen, und könnte, für ein Widget das auf einen Click und auf MouseEvents, also möglicherweise OnMouseOver oder OnMouseOut, reagiert, so aussehen: Code 4 sinkEvents Beispiel sinkEvents ( Event . ONCLICK | Event . MOUSEEVENTS ) ; Von den Widgets, die von Google implementiert wuden, ist bereits bekannt, dass jedem Widget standardmäßig ein Stylename zugewiesen ist. Dem eigenen Widget wird mittels setStyleName(”Name”), innerhalb des Konstruktors, ein sogenannter default StyleName zugewiesen. Mehrere Events7 , werden mit einer Pipe verbunden, was für eine Oderverknüpfung zu einem einzigen Wert steht. Wie aus der Objektorientierten Programmierung bereits bekannt, müssen Schnittstellen vorgesehen werden, mit denen man Variablen setzen kann. In diesem Beispiel eines Widgets, werden diese Schnittstellen vorgesehen, um Attribute des Widgets setzen zu können. Man bedient sich der set-Methoden, die die DOM-Klasse zum Setzen der eigentlichen Attribute bereitstellt. Code 5 Set-Methode public void setAttForWidget ( String Value ) { DOM . setAttribute ( getElement ( ) , Attribut , Wert ) ; } Um dem Widget eine Schnittstelle für EventListners geben zu können, muss die Klasse, beispielsweise für einen MouseListener, die SourcesMouseEvents implementieren: Code 6 Implement SourcesEvents public class WidgetName extends Widget implements SourcesMouseEvents { private MouseListenerCollection mouseListeners ; Die Collection-Variablen beinhalten die eigentlichen Listener der Events. Um solche Listener für das Widget auch setzen zu können, müssen Methoden, Liste der Events:http://google-web-toolkit.googlecode.com/svn/javadoc/1. 4/com/google/gwt/user/client/Event.html 7 Jürgen Leobacher, 5AHELI HTL Salzburg 12 Diplomarbeit Google Web Toolkit die dies ausführen, vorgesehen werden. Dies wird jeweils mit einer add bzw. remove Methode realisiert: Code 7 add/remove Listener Methoden public void addMouseListener ( MouseListener listener ) { mouseListeners . add ( listener ) ; } public void removeMouseListener ( MouseListener listener ) { mouseListeners . remove ( listener ) ; } Die vom Browser erkannten Events müssen noch an die Listener verteilt werden, damit sie im Programmcode ebenfalls erkannt werden können. Dies erfolgt durch Überschreiben (override) der onBrowserEvent Methode. In dieser Methode müssen alle Events, auf die das Widget reagieren soll, berücksichtigt werden: Code 8 fire MouseEvent public void onBrowserEvent ( Event event ) { switch ( DOM . eventGetType ( event ) ) { case Event . ONCLICK : case Event . ONMOUSEDOWN : case Event . ONMOUSEUP : case Event . ONMOUSEMOVE : case Event . ONMOUSEOVER : case Event . ONMOUSEOUT : if ( mouseListeners != null ) mouseListeners . fireMouseEvent ( this , event ) ; break ; } } Das waren alle Schritte, die vorgenommen werden müssen, um ein eigenes Widget, unabhängig eines bestehenden Widgets, zu erstellen. 3.2.3 Styles mit CSS In der folgenden Übersicht sind alle möglichen Methoden aufgelistet, die ein Widget mit einer Klasse in CSS in Beziehung bringen. Dies kann mit dem Attribut class, das man bei einem HTML-Tag setzen kann, gleichgesetzt werden. Jürgen Leobacher, 5AHELI HTL Salzburg 13 Diplomarbeit Google Web Toolkit Code 9 Style-Methoden Übersicht Widget . setStyleName ( ) // StyleName s e t z e n addStyleName ( ) // StyleName h i n z u f u e g e n removeStyleName ( ) // StylenName e n t f e r n e n setStylePrimaryName ( ) // p r i m a e r e n StyleName s e t z e n (vgl. J. Webber - Creating Widgets, S.8) Die Form eines Composites könnte zwar ausschließlich im Java-Code verändert werden, bringt jedoch, verglichen mit CSS8 , auch einige Probleme mit sich. Einerseits erfreuen sich CSS großer Beliebtheit, die meisten Entwickler sind bereits vertraut mit ihnen, und andererseits ist der Aufwand, verglichen mit äquivalentem, Java-Code geringer. Code 10 Style-Methoden in Anwendung // Java−Code MeinComposite wid = new MeinComposite ( ) ; wid . setStylePrimaryName ( " meinWidget " ) ; wid . addStyleDependentName ( " aktiv " ) ; //CSS−Code . meinWidget { } . meinWidget . meinWidget−aktiv { } (vgl. J. Webber - Creating Widgets, S.9) Wie die GWT-Style-Methoden zusammen mit CSS-Code funktionieren, wird im obigen Codebeispiel deutlich. Empfohlen werden Primary- und Dependent-Stylenames, die es einfach machen CSS-Selektoren für verschiedene Zustände zu definieren. Die Wahl von CSS muss jedoch nicht zwangsläufig von Vorteil sein. Prinzipiell sollte auf CSS immer dann verzichtet werden, wenn eine Eigenschaft für das Widget auf dessen Funktion oder Layout Einfluss nimmt. Absolute Positionsangaben beispielsweise, sollten im eigentlichen Programmcode stehen, da für potenzielle Unterelemente die Art der Positionierung wichtig sein kann. Cascading Style Sheets: Styles definieren wie HTML-Elemente dargestellt werden, und werden üblicherweise in Style Sheets mit der Endung ’css’ gespeichert. www.w3schools.com 8 Jürgen Leobacher, 5AHELI HTL Salzburg 14 Diplomarbeit 4 Google Web Toolkit Architektur 4.1 4.1.1 Debugging und Deployment Hosted Mode Läuft eine Applikation im Hosted Mode, wird diese als Bytecode in der Java Virtual Machine ausgeführt. Dieser Modus ist während der Entwicklung besonders vorteilhaft, da man alle Java Debugging Funktionen zur Verfügung hat und ein Treelogger 9 sowie der Hosted Browser, die das Debuggen zusätzlich vereinfachen. 4.1.2 Web Mode Im Web Mode läuft die Applikation als purer JavaScript-Code, kombiniert mit HTML. Die Transformation des Java-Codes in JavaScript erfolgt mit dem GWT Java-to-JavaScript Compiler. Üblicherweise wird eine Applikation an einem Server im Web Mode bereitgestellt, von wo aus diese dann für Benutzer erreichbar ist. Der Benutzer bekommt so den eigentlichen Bytecode oder die Binärversion des Programms nie zu Gesicht. 4.1.3 Java-to-JavaScript Compiler Dieser Compiler ist, neben dem Framework mit den vorgefertigten Widgets und Panels, die Hauptkomponente des GWT. Wie der Name sagt, übersetzt dieser den programmierten Java-Code in JavaScript. Um den Java-to-JavaScript Compiler auszuführen, muss das Projekt im Web Mode laufen. Um den JavaScript Output möglichst klein zu halten, werden nur Klassen und Methoden übersetzt, die in der Applikation auch wirklich eingesetzt werden, und redundante Codeformatierungen werden entfernt. Der letzte Punkt führt leider zu einer Nichtlesbarkeit des JavaScript Codes, was sich, hinsichtlich eines potentiellen Codediebstahls, auch vorteilhaft auswirken kann. 9 http://google-web-toolkit.googlecode.com/svn/javadoc/1.4/com/google/ gwt/core/ext/TreeLogger.html Jürgen Leobacher, 5AHELI HTL Salzburg 15 Diplomarbeit 5 5.1 Google Web Toolkit Applikationsentwicklung Remote Procedure Calls An einem gewissen Punkt, kann die clientseitige Kommunikation einer Webapplikation nicht mehr ausreichenden sein und somit müssen, um Daten von einem Server laden zu können, Remote Procedure Calls (RPCs) ausgeführt werden. Moderne Browser stellen ein XMLHttpRequest-Objekt zur Verfügung, das das Senden der HTML-Form-Daten zu einem Server erlaubt, ohne ein komplettes Neuladen der Seite zu erfordern. Mit GWT können RPCs entweder mit der RequestBuilder -Klasse ausgeführt werden, die die Funktionalitäten des eigentlichen XMLHttpRequest-Objekts aufweist, oder mit GWT-RPC 10 , das es erlaubt, dass die Kommunikation mittels JavaObjekten stattfindet. Im folgenden Abschnitt wird gezeigt, wie ein RPC mit dem RequestBuilder funktioniert. 5.1.1 RequestBuilder Die RequestBuilder -Klasse erlaubt es, Daten, einer HTML-Form zum Beispiel, an einen Server zu schicken, und auch Daten von einem Server zu empfangen. Code 11 RequestBuilder instanziieren RequestBuilder rb = new RequestBuilder ( RequestBuilder . GET , url ) ; Zuerst muss eine Instanz der Klasse erzeugt werden, in der die HTTPMethode (in diesem Fall GET) und die Zieladresse angegeben wird. Diese Instanz kann dann auf Methoden, die diese Klasse bietet, zugreifen. 10 http://code.google.com/webtoolkit/documentation/com.google.gwt.doc. DeveloperGuide.RemoteProcedureCalls.html Jürgen Leobacher, 5AHELI HTL Salzburg 16 Diplomarbeit Google Web Toolkit Code 12 Request ausführen Request request = rb . sendRequest ( "term=GWT+in+ Action " , new RequestCallback ( ) { public void onResponseReceived ( Request req , Response res ) { // Ausfuehrung } }); public void onError ( Request req , Throwable exception ) { // b e i F e h l e r n } (Hanson, Tasy - GWT in Action. S. 14) Nun wird der Request über eine Methode der Klasse ausgeführt, die ein Handle zurückgibt, die vom Typ Request ist, und somit von einem Try/Catch gesichert werden muss. Die sendRequest-Methode hat zwei Übergabeparamter, nämlich einen String, der zum Server gesendet wird und eine RequestCallback Instanz, die die Kommunikation steuert, und eventuelle Fehler aufzeigt. Die Verwendung von der Handler -Klasse ist notwendig, da dieser Request asynchron vollzogen wird, das heißt, die Daten werden zum Server geschickt und dort sofort verarbeitet, ohne dass von diesem eine Bestätigung zurückkommt. Die Daten, die bei RPCs verschickt werden, können vom Typ XML, HTML, oder auch JSON11 sein. JSON ist ein einfaches Nachrichtenformat, das besonders für die Kommunikation im Browser geeignet ist. 5.2 Performanz Das GWT-Framework bietet viele Möglichkeiten eine Webapplikation schnell und speichereffizient bereitzustellen. Man muss sich jedoch im Klaren sein, dass eine Webapplikation nunmal in einem Webbrowser läuft, und auch wenn aktuelle Browsergenerationen so gute Laufzeitumgebungen bieten wie noch nie zuvor, kann diesbezüglich noch kein Vergleich zu betriebssystemnativen Programmen bereitgestellt werden. Auch JavaScript ist sehr zeitaufwendig, betrachte man bloß den mehrfachen Zeitbedarf des Interpreters verglichen zu compilierten Code. Da in manchen Fällen JavaScript-Code sogar um das Hundertfache langsamer sein kann als nativer Code, sollte es ein zusätzlicher Ansporn sein zeit11 http://www.json.org/ Jürgen Leobacher, 5AHELI HTL Salzburg 17 Diplomarbeit Google Web Toolkit und speichereffizienten Code zu schreiben. Der wichtigste Aspekt ist deshalb immer die vom Benutzer gefühlte Performanz, die immer als erster Faktor betrachtet werden sollte. 5.2.1 Startzeit Die Zeit, wie lange eine Applikation startet ist ein sehr wichtiger, aber auch komplexer Faktor. Da dieser einerseits grundsätzlich von den IT-Ressourcen des Benutzers abhängt und andererseits oft bloß davon abhängt wie viel Zeit der Benutzer gewillt ist, beim Start des Programms zu warten. Die Konkurrenz im Web ist groß, deshalb sollte man diese Zeit so weit wie möglich verkürzen, um die Zahl der frustrierten Benutzer möglichst klein zu halten, um eine Vielzahl von Kunden zu gewinnen. Abbildung 3: Daten/Code-Zyklus (vlg. J. Webber - Performance, S.8) Die abgebildete Grafik zeigt, welche Phasen der Code (oder auch Daten) durchläuft, bis er dem Anwender sichtlich zur Anzeige gebracht wird. Zuerst muss berücksichtigt werden, ob der JavaScript-Code bereits gecacht ist, da dieser somit kein zweites Mal heruntergeladen werden müsste. Ehe dieses Skript interpretiert und ausgeführt wird, muss ein Download erfolgen, dessen Dauer je nach Datenmenge variieren kann. Bei großen Skriptdaten, beispielsweise MB-Größe, sollten diese mit gzip12 komprimiert werden. Die erstmalige Downloadzeit ist, entgegen möglicher langläufiger Meinung, nicht wichtiger als das Cachen großer Skripts, weshalb das GWT diesbezüglich eine automatisierte Lösung bietet. HTTP-Requests sind das mit Abstand zeitaufwendigste, das Webapplikationen im Browser je ausführen, und sollten deswegen, wo die Möglichkeit besteht, unbedingt vermieden werden. Beispiele dafür sind unteranderem externe JS-Dateien, CSS-Dateien, Bilder oder auch RPC-Requests13 die sehr viel Zeit kosten können. Abhilfe kann dem gzip (GNU zip) ist ein Kompressionstool, das entwickelt wurde um Compress (UNIX Kompressionsprogramm) zu ersetzen. www.gzip.org 13 http://technet2.microsoft.com/windowsserver/en/library/ 988b4438-d83b-45f3-b930-ee92e68ac32c1033.mspx?mfr=true 12 Jürgen Leobacher, 5AHELI HTL Salzburg 18 Diplomarbeit Google Web Toolkit durch Aggregation von mehreren einzelnen Skripts geschehen. Bei Bildern ist dies nicht ganz so einfach, weshalb die Verwendung von ImageBundle 14 , das Entwicklner erlaubt Bündel von statischen Bildern zu erzeugen, um diese mit einem einzigen HTTP-Request herunterzuladen, empfehlenswert ist. Die Bildgröße ist beim Compilieren bekannt, dadurch kann verhindert werden, dass sich eine Applikation sprunghaft aufbaut. Um Aktivitäten, wie Servercalls, im Auge zu behalten, gibt es praktische HTTP-Logger für den Browser die oft sehr hilfreich sein können. 5.2.2 Laufzeit Wie bereits angesprochen, ist die Manipulation eines DOM generell langsam, wodurch darauf geachtet werden sollte, keine unnötigen UI-Elemente, die nicht ausgeführt werden, zu laden. Ein guter Anhaltspunkt kann dabei die Erwartung an die Benutzeroberfläche seitens des Benutzers sein. Code 13 Inner-HTML Beispiel String id = HTMLPanel . createUniqueId ( ) ; String html = "<table >" + " <tr ><td >Header </td ></tr >" + " <tr ><td id=’" + id + " ’/></tr >" + " </table >" ; HTMLPanel p = new HTMLPanel ( html ) ; p . add ( new MeinComposite ( ) , id ) ; (vgl. J. Webber - Performance, S.16) Direkte Einbindung von HTML-Code kann beispielsweise schneller passieren, und man kann einer langsamen DOMManipulation aus dem Weg gehen. Der obige Beispielcode zeigt einen Auszug der praktischen Anwendung dieser Methode. Wie im Zusammenhang mit der Startzeit einer Applikation bereits erwähnt, können sich zu viele HTTPRequests zur Laufzeit ebenfalls negativ auswirken. Ein Ansatz dem entgegen zu halten, ist die Aggregation von mehreren RPCs. Code 14 Einzelne Servercalls public interface MyService { String login ( String user , String pass ) ; Settings getSettings ( String authToken ) ; Contact [ ] getContacts ( String authToken ) ; } 14 http://code.google.com/p/google-web-toolkit/wiki/ImageBundleDesign Jürgen Leobacher, 5AHELI HTL Salzburg 19 Diplomarbeit Google Web Toolkit (vgl. J. Webber - Performance, S.20) Folgt der Code der Struktur des obigen Beispiels und weiß man, dass der Benutzeranmeldung immer die gleichen RPCs folgen, können diese in einen einzigen Aufruf zusammengefasst werden. Code 15 Aggregierte Servercalls public class LoginResult { public String authToken ; public Settings settings ; public Contacts [ ] contacts ; } public interface MyService { LoginResult login ( String user , String pass ) ; } (vgl. J. Webber - Performance, S.21) Nun kann dem Server in einem einzigen Aufruf gemeldet werden, die benötigten Daten zu laden. 5.3 Commandlinetools Mit dem GWT kommen hilfreiche Commandlinetools, die über das Terminal bedient werden. Diese beinhalten unter anderem Funktionalitäten zur Erzeugung des Projektverzeichnisses und der Projektdateien (siehe 5.3 und 5.4.1), um das Projekt in Eclipse laden zu können. Für jedes Projekt, wird automatisch ein Skript angelegt, um den Java-Code in JavaScript zu kompilieren (ProjektName-compile). Der dadurch neu entstandene Code wird im Verzeichnis www, das im Hauptverzeichnis angelegt wird, abgelegt. Die Skripts ProjektName-shell und ProjektName-launch starten die Applikation im Hosted- bzw. im Webmode. Jürgen Leobacher, 5AHELI HTL Salzburg 20 Diplomarbeit 5.4 Google Web Toolkit Projektverzeichnisstruktur Abbildung 4: Basisverzeichnisstruktur 5.5 Codebeispiel - Einfaches Tutorial Da zur Entwicklung dieses Beispiels das Betriebssystem Mac OS X Leopard verwendet wird, ist die Wahl der korrekten GWT-Version, unter diesem Betriebssystem, sehr wichtig. Mit der aktuellen (März ’08) Version gibt es Probleme mit JAXP15 , dem Xerces16 Parser und dem von Google angepassten WebKit17 basierten Browser, der unter Carbon in Leopard nicht läuft. Die GWT-for-Mac-Entwickler haben viel Arbeit geleistet und eine dezidierte Leopard Version zum Download bereitgestellt, der jedoch nicht auf konventionelle Art, sondern ausschließlich über eine, im GWT-Forum bekannt gegebene, Adresse erreichbar ist: http://google-web-toolkit.googlecode. com/files/gwt-leopard-1.4.61.tar.gz. Den Tarball wie gewöhnlich extrahieren und in das Verzeichnis eines Webservers kopieren. 15 https://jaxp.dev.java.net/ http://xerces.apache.org/ 17 http://webkit.org/ 16 Jürgen Leobacher, 5AHELI HTL Salzburg 21 Diplomarbeit 5.5.1 Google Web Toolkit Projektsourcen erzeugen Die Projekterzeugung erfolgt mit den mitgelieferten Commandlinetools. Zuerst wird die Projektstruktur mit dem Kommando ./projectCreator-eclipseprojectName-outprojctDir erzeugt. Abbildung 5: ProjectCreator Der zweite und letzte Schritt zur Projekterzeugung erfolgt mit ./applicationCreator-eclipseprojectName-outprojectDirorg.client. ProjectName Abbildung 6: ApplicationCreator Der applicationCreator wird ausgeführt und erstellt alle notwendigen Dateien (Abbildung 2, Zeile:4-12) für ein GWT-Projekt unter Eclipse. Jürgen Leobacher, 5AHELI HTL Salzburg 22 Diplomarbeit 5.5.2 Google Web Toolkit Projekt in Eclipse laden Die Eclipse Workbench öffnen, und Menüpunkt Import auswählen. Abbildung 7: Projektimport Es öffnet sich ein neues Fenster mit möglichen Projektladeoptionen. In diesem Fall wird ein bereits vorhandenes Projekt geöffnet. Jürgen Leobacher, 5AHELI HTL Salzburg 23 Diplomarbeit Google Web Toolkit Abbildung 8: Importdialog Im nächsten Fenster den Pfad des Projektordners auswählen (also: HelloDir). Jürgen Leobacher, 5AHELI HTL Salzburg 24 Diplomarbeit Google Web Toolkit Abbildung 9: Importdialog Ob das Projekt wirklich geladen werden konnte, erkennt man, indem im Projektfenster der Name des Projekts erscheint und das Flag automatisch gesetzt wurde. Alles bestätigen und das Projekt wird in Eclipse geladen. Jürgen Leobacher, 5AHELI HTL Salzburg 25 Diplomarbeit Google Web Toolkit Abbildung 10: Applikationsgerüst In der Projektstruktur für diese einfache Applikation bestehen zwei relevante Dateien: • HelloWorld.html: Layout der Applikation in einfachem HTML. • HelloWorld.java: Programmierung der Funktionen, in Java, mit einfacher automatischer AJAX-Unterstützung. Die Datei HelloWorld.html kann auf die einfachste Ebene einer HTML-Datei heruntergebrochen werden: Das Script-Element darf nicht vergessen werden, da es den JavaScript-Code einbindet. Der Java-Code ist ebenso einfach gehalten, wie die HTML-Datei: Wie der Name der Funktion onModuleLoad bereits verrät, wird der Code in dieser bei Seitenaufruf automatisch ausgeführt. Als erster Schritt wird ein Button namens b mit dem Text Say Hello! erzeugt, der durch den ClickListener etwas macht wenn man ihn anklickt. Ausgeführt wird der Code in der Funktion onClick, die ein neues Fenstern mit dem Hinweis Hello World! am Bildschirm erscheinen lässt. Der Button wird nun noch ins so genannte Jürgen Leobacher, 5AHELI HTL Salzburg 26 Diplomarbeit Google Web Toolkit Code 16 HelloWorld.html <html> <head> <title>Hello World</ title> <script l a n g u a g e =’ j a v a s c r i p t ’ src=’ o r g . HelloWorld . nocache . j s ’ /> </ head> <body> <h1>Greet the earth</ h1> </ body> </ html> Code 17 HelloWorld.java package org . client ; import import import import import import com . google . gwt . core . client . EntryPoint ; com . google . gwt . user . client . ui . Button ; com . google . gwt . user . client . ui . ClickListener ; com . google . gwt . user . client . ui . RootPanel ; com . google . gwt . user . client . ui . Widget ; com . google . gwt . user . client . Window ; public class HelloWorld implements EntryPoint { public void onModuleLoad ( ) { Button b = new Button ( "Say Hello !" , new ClickListener ( ) { public void onClick ( Widget sender ) { Window . alert ( " Hello World !" ) ; } }); RootPanel . get ( ) . add ( b ) ; } Jürgen Leobacher, 5AHELI HTL Salzburg 27 Diplomarbeit Google Web Toolkit RootPanel geladen, das in diesem Fall dem Bereich zwischen der Überschrift und dem geschlossen body-Element in der HTML-Datei entspricht. Der Java-Code ist nun bereit compiliert zu werden, indem man Run Hello World in der Toolbar auswählt. Abbildung 11: Compilieren Folglich öffnet sich die Google Web Toolkit Development Shell und der angepasste GWT WebKit, in dem die Applikation im Hosted Mode läuft. Jürgen Leobacher, 5AHELI HTL Salzburg 28 Diplomarbeit Google Web Toolkit Abbildung 12: GWT-Browser Hosted Mode Klickt man nun auf Say Hello! öffnet sich der vorhin definierte Dialog. Abbildung 13: Hinweisfenster 5.5.3 Style hinzufügen Natürlich ist eine Website ohne anspruchsvollem Design nicht zeitgerecht. Diesem Problem kann mit einem CSS-Stylesheet einfach Abhilfe geschafft werden. Hierzu wird eine zusätzliche Zeile im HTML-Skript hinzugefügt, die angibt, unter welchem Pfad das Stylesheet zu erreichen ist. Wird das href -Attribut wie im Codebeispiel darüber angegeben, muss die Datei im selben Verzeichnis wie die eigentliche HTML-Datei liegen. Indem man mit einem Rechtsklick auf die HTML-Datei im Package Explorer, erst New und dann File auswählt, wird die CSS-Datei erzeugt. Jürgen Leobacher, 5AHELI HTL Salzburg 29 Diplomarbeit Google Web Toolkit Code 18 HelloWorld.html <html> <head> <title>Hello World</ title> <script l a n g u a g e =’ j a v a s c r i p t ’ src=’ o r g . HelloWorld . nocache . j s ’ /> <link rel=" stylesheet " type="text/css" href=" style .css" /> </ head> <body> <h1>HelloWorld</h1> </ body> </ html> Abbildung 14: Neue Datei anlegen Im darauf folgendem Fenster sollte darauf geachtet werden, ob der automatisch erstellte Pfad wirklich korrekt ist. Jürgen Leobacher, 5AHELI HTL Salzburg 30 Diplomarbeit Google Web Toolkit Abbildung 15: Dateidialog Die Datei ist nun erzeugt, steht im PackageExplorer direkt unter der HTMLDatei, und kann editiert werden. Code 19 style.css h1 { color : #c64 ; } . gwt−Button { color : #c64 ; } Dieses sehr einfach gehaltene Stylesheet färbt den Text der Überschrift und des Buttons in einem blassen Orange. Der erzeugte Button wird im Stylesheet GWT-spezifisch mit .gwt-Button angesprochen. Grundsätzlich, werden alle Widgets mit der gleichen Notation, nämlich .gwt-WidgetName Jürgen Leobacher, 5AHELI HTL Salzburg 31 Diplomarbeit Google Web Toolkit angesprochen. Abbildung 16: GWT-Browser Hosted Mode So einfach kann etwas Farbe in die Webapplikation gebracht werden. 5.5.4 Am Webserver bereitstellen Um die Applikation anderen Benutzern zur Verfügung zu stellen, muss diese auf allen gängigen Webbrowsern zur Anwendung gebracht werden. Hier liefert das GWT wiederum ein hilfreiches Commandlinetool um dies zu realisieren. Abbildung 17: Java-to-JavaScript compilieren Mit {ProjektName}-compile wird der Java-to-JavaScript Compiler ausgeführt und die neu erzeugten Sourcen werden ins Verzeichnis Jürgen Leobacher, 5AHELI HTL Salzburg 32 Diplomarbeit Google Web Toolkit www/org.{ProjektName} geschrieben. Dieses Verzeichnis kann nun auf einen beliebigen Webserver geladen, und davon aufgerufen werden. Abbildung 18: Applikation im Safari-Browser Jürgen Leobacher, 5AHELI HTL Salzburg 33 Diplomarbeit 6 Google Web Toolkit Pizzaprogramm Ziel dieses Anwendungsbeispiels ist es, alle behandelten Funktionalitäten des GWTs in einer Applikation zur Anwendung zu bringen. 6.1 Programmbeschreibung Dieses Pizzaprogramm soll die Bestellung einer Pizza über das Internet übernehmen. Diese Webapplikation könnte in einer Pizzeria praktisch Anwendung finden. Der Kunde kann sich, über das Webinterface, eine Pizza aussuchen, und diese nach Bedarf belegen. Abschließend kann der Kunde zwischen Bezahlung per Kreditkarte oder bar wählen. Nach Abschicken der Bestellung wird eine Rechnung, mit den zusammengefasseten Informationen, ausgegeben. 6.2 Voraussetzungen Die Entwicklung dieses Programms setzt voraus, dass ein GWT-Projekt für Eclipse erstellt (siehe: Einfaches Tutorial), und in Eclipse so weit geladen werden kann, um direkt in die Implementierung einsteigen zu können. Außerdem wird gleich zu Anfang ein Stylesheet eingebunden. 6.3 Implementierung Als Ausgangspunkt dienen die folgenden drei Dateien, die bislang einfache Grundgerüste sind. Code 20 Pizza.html <html> <head> <script l a n g u a g e =’ j a v a s c r i p t ’ src=’ o r g . P i z z a . nocache . j s ’></ script> <link rel=" stylesheet " type="text/css" href=" style .css"/> </ head> <body> <h1>Pizza bestellung</h1> </ body> </ html> Jürgen Leobacher, 5AHELI HTL Salzburg 34 Diplomarbeit Google Web Toolkit Code 21 Pizza.java package org . client ; import import import import import import com . google . gwt . core . client . EntryPoint ; com . google . gwt . user . client . ui . Button ; com . google . gwt . user . client . ui . ClickListener ; com . google . gwt . user . client . ui . Label ; com . google . gwt . user . client . ui . RootPanel ; com . google . gwt . user . client . ui . Widget ; public class Pizza implements EntryPoint { public void onModuleLoad ( ) { } } Code 22 style.css ( noch leer ) Es wird davon ausgegangen, dass ein Kunde auch nur eine Pizza bestellt. Deswegen werden für die Auswahl der Pizzen RadioButtons vorgesehen, die eine Pizza wählen lassen: Jürgen Leobacher, 5AHELI HTL Salzburg 35 Diplomarbeit 6.3.1 Google Web Toolkit MeinRadioPanel Code 23 MeinRadioPanel schreiben public class Pizza implements EntryPoint { class MeinRadioPanel extends Composite { private FlowPanel MyPanel = new FlowPanel ( ) ; private Label PanelHeader = new Label ( ) ; public MeinRadioPanel ( ) { PanelHeader . setVisible ( true ) ; MyPanel . add ( PanelHeader ) ; initWidget ( MyPanel ) ; setStyleName ( " MeinRadioPanel " ) ; } public void add ( Widget w ) { MyPanel . add ( w ) ; } } public void setCaption ( String HeaderName ) { PanelHeader . setText ( HeaderName ) ; } Um MeinRadioPanel, so der Name des eigenen Widgets, von der Composite Klasse ableiten zu können, muss das Paket com.google.gwt.user.client. ui.Composite importiert werden. Zunächst alle Widgets instanziieren, die anschließend im Konstruktor zusammengefügt werden. Im Konstruktor wird nun dem FlowPanel namens MyPanel das Label namens PanelHeader angehängt, ehe initWidget, das in jedem Composite-Konstruktor notwendig ist, aufgerufen wird. Um das Widget über CSS ansprechen zu können, wird ein StyleName gesetzt. FlowPanels besitzen eine add Methode, mit der, wie in diesem Fall beispielsweise, die RadioButtons hinzugefügt werden. Diese add Methode muss, wie die Methode zum Setzen der Überschrift, für das eigene MeinRadioPanel selbst programmiert werden, was über eine set Methode realisiert wird. Der Übergabeparameter ist ein Widget, da man jedes Widget zu MeinRadioPanel hinzufügen können soll. Jürgen Leobacher, 5AHELI HTL Salzburg 36 Diplomarbeit Google Web Toolkit Code 24 Pizzen Buttons erzeugen public void onModuleLoad ( ) { // P i z z e n RadioButtons e r z e u g e n final RadioButton Margherita = new RadioButton ( " PizzaListe " , " Margherita (5 EUR)" ) ; final RadioButton Salami = new RadioButton ( " PizzaListe " , " Salami (7 EUR)" ) ; final RadioButton FruttiDiMare = new RadioButton ( " PizzaListe " , " Frutti di Mare (7 ,5 EUR)" ) ; // s t a n d a r d m a e s s i g P i z z a M a r g h e r i t a waehlen Margherita . setChecked ( true ) ; // Pizza−Panel i n s t a n z i i e r e n MeinRadioPanel pizzapanel = new MeinRadioPanel ( ) ; pizzapanel . setCaption ( " Suchen Sie sich eine Pizza aus" ) ; // P i z z e n zum Panel h i n z u f u e g e n pizzapanel . add ( Margherita ) ; pizzapanel . add ( Salami ) ; pizzapanel . add ( FruttiDiMare ) ; RootPanel . get ( ) . add ( pizzapanel ) ; } } Zu Beginn werden Objekte der Klasse RadioButton erzeugt, wobei für jede Pizza ein eigenes angelegt wird. Mit setChecked(true) wird beim Programmstart automatisch der RadioButton der Pizza Margherita ausgewählt. Alle RadioButtons zusammen, werden einem FlowPanel hinzugefügt, innerhalb dessen, jeweils nur ein Element von vielen ausgewählt werden kann. Es wäre nicht gerade benutzerfreundlich, bloß die RadioButtons anzuzeigen, ohne einen Hinweis zu geben, was getan werden soll. Da FlowPanels standardmäßig keine Beschriftung oder vergleichbares unterstützen, wird an dieser Stelle einfach das eigene Widget implementiert, das sich von der CompositeKlasse ableitet, auf einem FlowPanel basiert, und die Möglichkeit der Beschriftung über ein Label anbietet. 6.3.2 Zusatzbelag (CheckBox) Da der Kunde theoretisch jeden Zusatzbelag auswählen kann, macht in diesem Fall der Einsatz von CheckBoxen Sinn. Alle CheckBoxen zusammen Jürgen Leobacher, 5AHELI HTL Salzburg 37 Diplomarbeit Google Web Toolkit werden einem Panel hinzugefügt, und dieses wird dann wiederum dem RootPanel hinzugefügt. Code 25 CheckBoxen für Zusatzbelag // Belag−Panel i n s t a n z i i e r e n MeinRadioPanel belagpanel = new MeinRadioPanel ( ) ; belagpanel . setCaption ( " Welcher Zusatzbelag darf es sein? ( Jeder Belag 1 EUR)" ) ; // Z u s a t z b e l a g final CheckBox final CheckBox final CheckBox RadioButtons e r z u e g e n Kaese = new CheckBox ( "Viel Kaese " ) ; Oliven = new CheckBox ( " Oliven " ) ; Knoblauch = new CheckBox ( " Knoblauch " ) ; // Belag zu Panel h i n z u f u e g e n belagpanel . add ( Kaese ) ; belagpanel . add ( Oliven ) ; belagpanel . add ( Knoblauch ) ; RootPanel . get ( ) . add ( belagpanel ) ; 6.3.3 Zahlungsart Code 26 CheckBoxen für Zusatzbelag // Z a h l u n g s a r t e n e r z e u g e n final RadioButton kreditkarte = new RadioButton ( " Zahlungsarten " , " Kreditkarte " ) ; final RadioButton barzahlung = new RadioButton ( " Zahlungsarten " , " Barzahlung " ) ; // Z a h l u n g s a r t −Panel MeinRadioPanel zahlungsart = new MeinRadioPanel ( ) ; zahlungsart . setCaption ( "Wie moechten Sie zahlen ?" ) ; // Z a h l u n g s a r t e n zum Panel h i n z u f u e g e n zahlungsart . add ( kreditkarte ) ; zahlungsart . add ( barzahlung ) ; RootPanel . get ( ) . add ( zahlungsart ) ; Vom Grundaufbau unterscheidet sich die Auswahl der Zahlungsart nicht von den vorhergehenden Auswahlmöglichkeiten. Nun wird jedoch ein Feature hinzugefügt, das, wenn die Zahlungsart Kreditkarte ausgewählt wurde, ein Widget anzeigt, das es erlaubt, Kreditkarteinformationen anzugeben. Dieses WidJürgen Leobacher, 5AHELI HTL Salzburg 38 Diplomarbeit Google Web Toolkit get wird eigens geschrieben, und wieder von der Anzeige entfernt, falls doch bar gezahlt werden will. Code 27 Widget für Kreditkarteninformationen class KreditKartenInfo extends Composite { private TextBox tbName = new TextBox ( ) ; private TextBox tbExpDate = new TextBox ( ) ; private Label lbName = new Label ( "Name auf Karte " ) ; private Label lbExpDate = new Label ( " Ablaufdatum " ) ; private FlowPanel MyPanel = new FlowPanel ( ) ; public KreditKartenInfo ( ) { MyPanel . add ( lbName ) ; MyPanel . add ( tbName ) ; MyPanel . add ( lbExpDate ) ; MyPanel . add ( tbExpDate ) ; initWidget ( MyPanel ) ; setStyleName ( " KreditKartenInfo " ) ; } public String getName ( ) { return tbName . getText ( ) ; } } public String getExpDate ( ) { return tbExpDate . getText ( ) ; } Das KreditKartenInfo Widget leitet sich, wie das MeinRadioButton Widget auch, von der Composite Klasse ab, und unterscheidet sich vom zuvor geschriebenen Widget, bezüglich der Codestruktur, grundsätzlich nicht. Jedoch werden, um die eingegebenen Informationen auch abrufen zu können, get Methoden vorgesehen. Sie geben jeweils einen String zurück, der den, in die TextBox eingegebenen Text, enthält. Um das dynamische Hinzufügen bzw. Entfernen zu realisieren, wird ein ClickListener hinzugefügt, der das Selektieren bzw. Deselektiren der jeweiligen Zahlungsinformationen mithorcht: Jürgen Leobacher, 5AHELI HTL Salzburg 39 Diplomarbeit Google Web Toolkit Code 28 ClickListener für Zahlungsart final KreditKartenInfo KartenInformationen = new KreditKartenInfo ( ) ; KartenInformationen . setVisible ( false ) ; barzahlung . setChecked ( true ) ; // Klick −L i s t e n e r um r a u s z u f i n d e n wenn RadioButton a n g e k l i c k t wurde kreditkarte . addClickListener ( new ClickListener ( ) { public void onClick ( Widget sender ) { kreditkarte . setChecked ( true ) ; KartenInformationen . setVisible ( true ) ; } }); barzahlung . addClickListener ( new ClickListener ( ) { public void onClick ( Widget sender ) { barzahlung . setChecked ( true ) ; KartenInformationen . setVisible ( false ) ; } }); RootPanel . get ( ) . add ( KartenInformationen ) ; Beim Anklicken, also in der Funktion onClick, wird das zuvor instanziierte Widget KartenInformation, im kreditkarte ClickListener, angezeigt, und im barzahlung ClickListener entfernt. Standardmäßig wird Barzahlung ausgewählt. Zuletzt, wie gewöhnlich, das Widget dem RootPabel hinzufügen. 6.3.4 Bestellung abschicken Damit der Kunde seine Bestellung abschicken kann, wird ein Button vorgesehen, der ein eigens geschriebenes Widget ist, das sich diemal nicht von der Composite-, sondern von der Widget-Klasse ableitet. Jürgen Leobacher, 5AHELI HTL Salzburg 40 Diplomarbeit Google Web Toolkit Code 29 Eigenes Abschicken-Widget public class Abschicken extends Widget implements SourcesClickEvents { private ClickListenerCollection clickListeners ; public Abschicken ( String Caption ) { setElement ( DOM . createButton ( ) ) ; String CaptionBold = "<strong >" + Caption + " </strong >" ; DOM . setInnerHTML ( getElement ( ) , CaptionBold ) ; sinkEvents ( Event . ONCLICK ) ; setStyleName ( " AbschickenButton " ) ; } public void addClickListener ( ClickListener listener ) { if ( clickListeners == null ) { clickListeners = new ClickListenerCollection ( ) ; } clickListeners . add ( listener ) ; } public void removeClickListener ( ClickListener listener ) { clickListeners . remove ( listener ) ; } } public void onBrowserEvent ( Event event ) { switch ( DOM . eventGetType ( event ) ) { case Event . ONCLICK : if ( clickListeners != null ) { clickListeners . fireClick ( this ) ; } } } Das Abschicken Widget leitet sich, wie bereits erwähnt, von der Klasse Widget ab, und implementiert SourcesClickEvents um dem Widget einen ClickListener hinzufügen zu können. Dem Konstruktor, der als Übergabeparameter einen String für den Namen hat, wird mit setElement dem Widget ein Button hinzugefügt, der durch die DOM -Klasse geladen wird. Um dem Button einen Namen, also den Text im Button, zu geben, wird sich der setInnerHTML Methode der DOM Klasse bedient. Der Button-Name könnte zwar auch mit setInnerText gesetzt werden, dann gäbe es jedoch nicht direkt die Möglichkeit, den Text fett (strong) darzustellen. Somit wird Jürgen Leobacher, 5AHELI HTL Salzburg 41 Diplomarbeit Google Web Toolkit der String erst mit dem strong HTML-Tag eingeschrieben, und anschließend mit setInnerHTML in den Button geschrieben. Mit sinkEvents wird der Klasse das ONCLICK Event aktiv hinzugefügt, ehe der StyleName gesetzt wird. Um im eigentlichen Programmablauf dem instanziierten Objekt den ClickListener hinzufügen zu können, muss die addClickListener Methode vorgesehen werden, in der der ClickListenerCollection 18 der eigentliche Listener hinzugefügt wird. Kann ein Listener hinzugefügt werden, muss es auch eine Methode geben, die diesen wieder entfernt, wofür removeClickListener vorgesehen ist. Das Widget muss eingehende Events, die von DOM-Klasse erkannt werden, also vom Browser kommen, noch an die Listener verteilen, was durch Überschreiben (override) der onBrowserEvent Methode des Widgets passiert. Im Falle eines ONCLICK Events wird der Click ausgeführt (fire). Code 30 Abschicken und Rechnung instanziieren final Abschicken SendeBestellung = new Abschicken ( " Bestellen " ) ; final Label Rechnung = new Label ( ) ; Rechnung . setVisible ( false ) ; //ID−S e l e k t o r f u e r Rechnung s e t z e n DOM . setElementAttribute ( Rechnung . getElement ( ) , "id" , " Rechnung " ) ; RootPanel . get ( ) . add ( SendeBestellung ) ; RootPanel . get ( ) . add ( Rechnung ) ; Der SendeBestellung Button und das Label für die Rechnung werden instanziiert, wobei die Rechnung vorerst noch verborgen wird, da die Bestellung noch nicht abgesendet wurde. Mit setElementAttribute wird dem Rechnung Widget das Attribut id, mit dem Wert Rechnung zugewiesen, um es im Stylesheet ansprechen zu können. 18 http://google-web-toolkit.googlecode.com/svn/javadoc/1.4/com/google/ gwt/user/client/ui/ClickListenerCollection.html Jürgen Leobacher, 5AHELI HTL Salzburg 42 Diplomarbeit Google Web Toolkit Code 31 Rechnung auswerten SendeBestellung . addClickListener ( new ClickListener ( ) { public void onClick ( Widget sender ) { int Preis = 0 ; String Bestellungen = "" ; String ZahlungMit = "" ; if ( Margherita . isChecked ( ) ) { Preis += 5 ; Bestellungen = "<p> Margherita </p>" ; } else if ( Salami . isChecked ( ) ) { Preis += 7 ; Bestellungen = "<p>Salami </p>" ; } else if ( FruttiDiMare . isChecked ( ) ) { Preis += 8 ; Bestellungen = "<p> Frutti di Mare </p>" ; } if ( Kaese . isChecked ( ) ) { Preis++; Bestellungen += "<p> und mehr Kaese </p>" ; } if ( Oliven . isChecked ( ) ) { Preis++; Bestellungen += "<p>und mehr Kaese </p>" ; } if ( Knoblauch . isChecked ( ) ) { Preis++; Bestellungen += "<p>und mehr Knoblauch </p>" ; } if ( kreditkarte . isChecked ( ) ) { ZahlungMit = "<p><strong > Zahlung mit Kreditkarte </ strong ></p>" + "Name:" + KartenInformationen . getName ( ) + "<br/>" + " Kartenablaufdatum :"+KartenInformationen . getExpDate ( ) ; } else if ( barzahlung . isChecked ( ) ) { ZahlungMit = "<p>Sie Zahlen Bar </p>" ; } // w e i t e r f u e h r u n g im n a e c h s t e n Code Beim Klicken auf den Abschicken-Button wird jede Bestellmöglichkeit abgefragt, und der daraus resultierende Preis ermittelt. Da nur eine Pizza Jürgen Leobacher, 5AHELI HTL Salzburg 43 Diplomarbeit Google Web Toolkit ausgewählt werden kann, wird die Abfrage mit if/else if realisiert, da bei Eintreten eines Falls, die darauffolgenden automatisch falsch sind. Die Bezeichnungen der Auswahl werden in einen String geschrieben, der nach jeder Auswahl erweitert wird. Der String wird mit HTML-Tags versehen. Code 32 Rechnung schreiben und anzeigen // W e i t e r f u e h r u n g d e s v o r h e r g e h e n d e n Codes String StrPreis = "<p>"+Integer . toString ( Preis)+"EUR </p>" ; DOM . setInnerHTML ( Rechnung . getElement ( ) , "<h3 >Rechnung </h3 >" + "<strong >Pizza </ strong >" + Bestellungen + "<strong >Preis </ strong >" + StrPreis + ZahlungMit ); Rechnung . setVisible ( true ) ; } }); Der Preis muss erst einer Typkonvertierung von Integer zu String unterzogen werden. Die zuvor erzeugten Strings werden mit DOM.setInnerHTML in die Rechnung geschrieben, und da jeder String HTML-Tags enthält, werden diese nun als solche Interpretiert und angezeigt. Jürgen Leobacher, 5AHELI HTL Salzburg 44 Diplomarbeit 6.4 Google Web Toolkit Style verpassen Abbildung 19: Programm ohne Style Die Webapplikation könnte zwar so verwendet werden, sieht aber nicht gerade schön aus, und ist alles andere als Übersichtlich. Um das zu ändern, kommt das am Anfang bereits erzeugte Stylesheet, style.css, zum Einsatz: Jürgen Leobacher, 5AHELI HTL Salzburg 45 Diplomarbeit Google Web Toolkit Code 33 style.css h1 { text−align : center ; color : #8e2800 ; } . MeinRadioPanel { padding−bottom : 20 px ; background−color : #fff0a5 ; } . gwt−RadioButton { padding−right : 20 px ; } . gwt−CheckBox { padding−right : 20 px ; } . KreditKartenInfo { background−color : #468966; } #Rechnung { background−image : url ( papier . png ) ; border : 1px solid #000000; } Wendet man dieses Stylesheet an, sieht die Applikation schlussendlich so aus: Jürgen Leobacher, 5AHELI HTL Salzburg 46 Diplomarbeit Google Web Toolkit Abbildung 20: Programm mit Style Jürgen Leobacher, 5AHELI HTL Salzburg 47 Diplomarbeit Google Web Toolkit Quellennachweise Google 2008: Google Code - Webtoolkit (Modes). Internet: http://code. google.com/webtoolkit/overview.html#Modes (08/04/08 8:29) Google 2008: Google Code - Webtoolkit (Architechture). Internet: http:// code.google.com/webtoolkit/overview.html#Architecture (07/04/08 17:18:19) Voices That Matter: Google Web Toolkit Conference 2007: Joel Webber, Creating Widgets - GWT Conference. Internet: http://www.voicesthatmatter. com/gwt2007/presentations/CreatingWidgets_Webber.pdf (07/04/08 16:32:08) Google 2008: Google Code - Webtoolkit (Getting Started - Eclipse). Internet: http://code.google.com/webtoolkit/gettingstarted.html (28/03/08 17:18:22) Voices That Matter: Google Web Toolkit Conference 2007. Joel Webber, Performance. Internet: http://www.voicesthatmatter.com/gwt2007/presentations/ Performance_Webber.pdf (12/04/08 10:32:08) Dewsbury 2008: Ryan Dewsbury, Google Web Toolkit Applications. (AddisonWesley Longman, Amsterdam; 28. Januar 2008) Hanson, Tasy 2007: Robert Hanson, Adam Tacy, GWT in Action: Easy Ajax with the Google Web Toolkit. (Manning Pubn, 31. Juli 2007) Jürgen Leobacher, 5AHELI HTL Salzburg 48 HTBLA Salzburg Höhere Lehranstalt für Elektronik Ausbildungsschwerpunkt Technische Informatik DIPLOMARBEIT XML und Datenbanken Ausgeführt im Schuljahr 2007/8 von: Martin Planer, 5AHELI-Tb20 Betreuer: Prof. Mag. Dr. Anton Hofmann Diplomarbeit XML und Datenbanken Inhaltsverzeichnis Eidesstattliche Erklärung 3 Zusammenfassung 4 Abstract 5 1 XML 6 1.1 XML Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.1 XML Element . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.2 XML Attribut . . . . . . . . . . . . . . . . . . . . . . . 8 1.1.3 XML-Deklaration . . . . . . . . . . . . . . . . . . . . . 9 1.1.4 Wohlgeformtheit . . . . . . . . . . . . . . . . . . . . . 9 1.1.5 Gültigkeit . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2 XSD (XML Schema Definition) . . . . . . . . . . . . . . . . . 11 1.2.1 1.3 1.4 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.3.1 XPath Syntax . . . . . . . . . . . . . . . . . . . . . . . 16 1.3.2 Achsen . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.3.3 Knotentests . . . . . . . . . . . . . . . . . . . . . . . . 19 1.3.4 Prädikate . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.3.5 XPath Beispiele . . . . . . . . . . . . . . . . . . . . . . 20 XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.1 FLWOR . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Martin Planer, 5AHELI HTL Salzburg 1 Diplomarbeit XML und Datenbanken 2 Datenbanken 24 2.1 Warum ist XML keine (gute) Datenbank? . . . . . . . . . . . 24 2.2 XML Verwendung mit Datenbanken . . . . . . . . . . . . . . . 25 2.3 2.2.1 Verwendung von XML als Datenaustauschformat . . . 25 2.2.2 Direktes Speichern der XML-Dokumente . . . . . . . . 27 XML-enabled Datenbanken . . . . . . . . . . . . . . . . . . . 29 2.3.1 Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.4 Native XML-Datenbanken . . . . . . . . . . . . . . . . . . . . 35 2.5 Berkeley DB XML . . . . . . . . . . . . . . . . . . . . . . . . 38 2.5.1 Einführung in Berkeley DB XML . . . . . . . . . . . . 38 2.5.2 Berkeley DB XML API . . . . . . . . . . . . . . . . . . 42 Literaturverzeichnis 47 Abbildungsverzeichnis 49 Tabellenverzeichnis 50 Listings 51 Martin Planer, 5AHELI HTL Salzburg 2 Diplomarbeit XML und Datenbanken Eidesstattliche Erklärung Ich erkläre an Eides statt, dass ich die vorliegende Diplomarbeit selbstständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die den benutzten Quellen wörtlich und inhaltlich entnommenen Stellen als solche erkenntlich gemacht habe. Salzburg, am —————————————— Martin Planer Martin Planer, 5AHELI HTL Salzburg 3 Diplomarbeit XML und Datenbanken Zusammenfassung Die steigende Anzahl von verschiedensten Applikationen, vor allem im Internet, und die Vernetzung dieser untereinander, stärkte das Erfordernis nach einem einfachen Weg zum universellen Datenaustausch zwischen den Anwendungen. Seit seiner ersten Veröffentlichung 1998 entwickelte sich XML (eXtensible Markup Language) zu genau diesem Standard. XML bietet eine einfache, aber dennoch leistungsfähige Möglichkeit strukturierte Daten einheitlich und plattformunabhängig darzustellen bzw. auszutauschen, die dabei sowohl für EDV-Systeme, als auch für Menschen lesbar bleiben. Aufgrund der immer weiter steigenden Popularität von XML haben sich unzählige weitere Sprachen auf Basis von XML, für fast jeden erdenklichen Anwendungsfall, entwickelt. Obwohl XML schon heutzutage als de facto Standard für den Datenaustausch angesehen werden kann, erfolgt die Speicherung von Daten zum Großteil immer noch in relationalen Datenbanken. Diese Systeme bieten sehr viele Funktionen auf die Firmen nicht mehr verzichten können und die XML nicht bieten kann, zum Beispiel Datenintegrität, hohe Performanz, ausgereifte Administrations- und Diagnosewerkzeuge. Die Zusammenführung der Vorteile beider Systeme ist jedoch nicht ohne Weiteres möglich, da die Struktur der Datenspeicherung sehr unterschiedlich ist. Der erste Teil dieses Dokuments geht nun auf XML, inkl. aller relevanten XML-Derivate, im Allgemeinen ein, die notwendig sind, um mit XMLDokumenten im Zusammenspiel mit relationalen, aber auch mit nativen XML-Datenbanken, arbeiten zu können. Im zweiten Teil wird nähre auf die Verbindung von XML und Datenbanken eingegangen. Es bestehen mehrere Möglichkeiten, um XML-Dokumente einerseits in einer Datenbank abzulegen, andererseits bestehende Daten in einer Datenbank als XML-Dokument darzustellen. Im abschließenden Kapitel werden die theoretischen Grundlagen über XML und Datenbanken, mit Hilfe der freien Berkeley DB XML von Oracle, auf ein praktisches Beispiel angewandt und die Verwendung eines solchen Datenbanksystems in einer Anwendung verdeutlicht. Martin Planer, 5AHELI HTL Salzburg 4 Diplomarbeit XML und Datenbanken Abstract The myriads of emerging software applications - mainly on the internet an the interconnection between them, boosted the need for an easy way to share data between those applications. Since its first release in 1998, XML (eXtensible Markup Language) has developed to such a standard. XML delivers an easy yet powerful possibility to display and exchange structured data, while staying readable by computer systems and humans. Due to its continuing increas in popularity, there have been countless developments in languages based on XML. Although XML has become the de facto standard for data exchange, relational database management systems still dominate the market for information storage. These systems provide several features, that corporations can’t go without, but XML does not feature. To mention only a few, these features are e.g. data integrity, high performance or mature administration and diagnostic tools. Bringing the advantages of both systems together isn’t a goal that can be achieved easily, since the data structure of both systems is very different. The first part of this document will cover the basics of XML and all relevant XML derivates, that are neccessary to use XML with relational but also with native XML databases. The second part will deal with the interconnection between XML and databases. There are several ways to store XML documents in a database as well as to generate an XML document from an existing database. In the last chapter the theoretical foundations on XML and databases will be used on a concrete example using the free Berkeley DB XML from Oracle and will show the usage of such a database system in own applications. Martin Planer, 5AHELI HTL Salzburg 5 Diplomarbeit XML und Datenbanken Kapitel 1 XML 1.1 XML Allgemein XML (eXtensible Markup Language oder erweiterbare Auszeichnungssprache) ist eine Sprache, um Daten in einer hierarchischen Struktur zu speichern und darzustellen. Die Struktur selbst, in der die Daten gespeichert werden, ist bei XML nicht vorgegeben, sondern kann, nach Belieben und Bedarf, frei definiert werden (z.B. in einer XSD-Datei, vgl. Kap. 1.2). Ein XML-Dokument besteht aus Elementen, diese können optional noch Attribute enthalten, Daten und, falls benötigt, Kommentare. Listing 1.1: Ein simples Beispiel-XML <? xml version="1.0" e n c o d i n g="ISO -8859 -1" ?> <c d k a t a l o g> <cd> < t i t e l>Ein Albumtitel</ t i t e l> <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099</ j a h r> </ cd> <cd> < t i t e l>Ein weiterer Albumtitel</ t i t e l> <k u e n s t l e r>Ein weiterer Kuenstler</ k u e n s t l e r> <j a h r>2017</ j a h r> </ cd> </ c d k a t a l o g> Martin Planer, 5AHELI HTL Salzburg 6 Diplomarbeit 1.1.1 XML und Datenbanken XML Element Ein Element in XML beschreibt in der für XML-Dokumente typischen Baumstruktur einen der Knotenpunkte. Elemente können entweder direkt Daten beinhalten oder wieder weitere Elemente und somit eine hierarchische Struktur erzeugen. Optional können XML-Elemente auch Attribute enthalten. Elemente werden in XML durch eine spitze, öffnende Klammer ( <“) einge” leitet. Anschließend folgt der Name des Elements und, durch ein Leerzeichen getrennt, 0 bis unendlich viele Attribute, sowie eine sich schließende spitze Klammer ( >“), um die Elementdefinition abzuschließen. ” Der Name des Elements kann frei gewählt werden, jedoch müssen einige Regeln beachtet werden: • Der Name des Elements darf nicht mit einer Ziffer oder einem Satz/Sonderzeichen beginnen. • Der Name darf nicht mit xml“ (egal in welcher Schreibweise) beginnen. ” • Der Name darf keine Leerzeichen ( ) enthalten ”” (vgl. Jänicke 2007, Kap. ”XML-Elemente”) Die Definition eines Elements wird in XML mit einer schließenden spitzen Klammer abgeschlossen. Das komplette Konstrukt aus öffnender Klammer, dem Namen, den optionalen Attributen sowie der schließenden Klammer nennt man auch Tag. Listing 1.2: Ein öffnendes XML-Tag <Elementname A t t r i b u t 1=" Wert1 "> Nach der Definition des Elements folgt der eigentliche Inhalt, der, wie bereits oben erwähnt, entweder wieder aus einem oder mehreren Elemente(n) oder aus Daten bestehen kann. Um ein Element abzuschließen, muss das entsprechende schließende Tag des Elements angegeben werden. Es besteht im Grunde genommen aus den selben Bereichen wie das öffnende Tag, jedoch wird direkt nach der öffnenden Klammer ein Schrägstrich ( /“) eingefügt, um es als schließendes Tag zu ” kennzeichnen und die Attribute des Elements werden weggelassen, da sie ja schon oben definiert wurden. Martin Planer, 5AHELI HTL Salzburg 7 Diplomarbeit XML und Datenbanken Listing 1.3: Ein schließendes XML-Tag </ Elementname> Enthält ein Element keine Daten oder Elemente - es ist also leer - kann das Tag auch direkt, in einer Zeile, abgeschlossen werden. Dazu wird der Schrägstrich schon in der Definition des Elements vor die schließende spitze Klammer gesetzt, um Platz zu sparen und das Dokument übersichtlicher zu halten. Listing 1.4: Ein leeres, geschlossenes XML-Element <Elementname A t t r i b u t 1=" Wert1 " /> < !−− a e q u i v a l e n t zu −−> <Elementname A t t r i b u t 1=" Wert1 "> </ Elementname> Wie im obigen Beispiel bereits zu sehen ist, können XML-Dokumente mit Kommentaren versehen werden, um die Verständlichkeit zu erhöhen. Kommentare werden in XML durch die Zeichenfolge <!— eingeleitet und gelten, ” ” bis sie durch die Zeichenfolge −− > wieder aufgehoben werden. Der Text ” ” zwischen diesen beiden Zeichenfolgen wird nicht weiter verarbeitet. 1.1.2 XML Attribut Mittels eines XML Attributs kann einem XML-Element ein zusätzlicher Parameter übergeben werden. Wie in den Beispielen zu den XML-Elementen schon zu sehen ist, werden Attribute im Element-Tag, durch ein Leerzeichen vom Elementnamen getrennt, definiert. Der Name eines Attributs ist wiederum frei wählbar. Der Wert des Attributs wird durch ein folgendes Gleichheitszeichen ( =“) dem Namen zu” gewiesen und muss in Anführungszeichen gesetzt werden ( ... oder ’ ... ’). ” ” Ein Attribut darf weiters keine Unterelemente enthalten sondern nur alphanumerische Daten. Listing 1.5: Ein XML-Attribut <Elementname A t t r i b u t 1=" Wert1 "> </ Elementname> Martin Planer, 5AHELI HTL Salzburg 8 Diplomarbeit 1.1.3 XML und Datenbanken XML-Deklaration Ein XML-Dokument wird durch ein spezielles Element in der ersten Zeile als solches definiert. Listing 1.6: Eine XML-Deklaration <? xml ?> Die XML-Deklaration wird, wie im Listing ersichtlich, durch <?“ eingelei” tet, beinhaltet den Elementnamen xml“ und wird anschließend mit ?>“ ” ” beendet und muss nicht durch separates, schließendes Tag beendet werden. Optional können der XML-Deklaration zusätzlich 3 Attribute zugewiesen werden: version Die verwendete Versionsnummer der XML-Spezifikation. Das Attribut kann derzeit die Werte 1.0 oder 1.1 annehmen. encoding Definiert die Zeichenkodierung des XML-Dokuments. Falls keine Zeichenkodierung angegeben ist, wird als Zeichenkodierung UTF-8 angenommen. standalone Der Wert des Attributs ist entweder yes oder no. Der Wert yes zeigt an, dass das XML-Dokument keine weiteren externen Referenzen, wie zum Beispiel eine externe DTD, einbindet. Der Vorgabewert ist no, was bedeutet, das externe Referenzen eingebunden werden können. Listing 1.7: Beispiel einer XML-Deklaration <? xml version="1.0" e n c o d i n g="ISO -8859 -1" standalone="yes" ?> 1.1.4 Wohlgeformtheit Wohlgeformtheit ist ein Zustand eines XML-Dokuments, der für die Verarbeitung von XML-Daten unabdingbar ist. Ein XML-Dokument gilt als wohlgeformt, wenn es sämtliche Wohlgeformtheitsbeschränkungen der XML Spezifikation einhält. Exemplarisch dafür die wichtigsten Wohlgeformtheitsbeschränkungen (ohne Anspruch auf Vollständigkeit): • Das Dokument enthält genau ein (1) Wurzelelement, Martin Planer, 5AHELI HTL Salzburg 9 Diplomarbeit XML und Datenbanken • Alle Elemente besitzen ein öffnendes und ein schließendes Tag bzw. sind, wenn sie leer sind, in sich geschlossen. • Alle Elemente müssen auf der selben hierarchischen Ebene geschlossen werden, auf der sie auch geöffnet wurden. • Alle Elemente müssen im selben Element geschlossen werden, in dem sie geöffnet wurden. • Die Attributnamen in einem Element müssen eindeutig sein. (vgl. Bray, Paoli, Sperberg-McQueen, Maler 2000) Damit ergeben sich folgende Beispielfälle: Listing 1.8: Beispiel einer XML-Deklaration <? xml version="1.0" e n c o d i n g="ISO -8859 -1" standalone="yes" ?> <c d k a t a l o g> <cd v e r l i e h e n="nein"> < t i t e l>Ein Albumtitel</ t i t e l> <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099 </ cd> </ j a h r> </ c d k a t a l o g> <c d k a t a l o g> <cd v e r l i e h e n="nein" v e r l i e h e n="ja"> < t i t e l>Ein weiterer Albumtitel</ t i t e l> <k u e n s t l e r>Ein weiterer Kuenstler</ k u e n s t l e r> <j a h r>2017</ j a h r> </ cd> </ c d k a t a l o g> Dieses XML-Dokument ist aus folgenden Gründen eindeutig nicht wohlgeformt: • Das Dokument enthält 2 Wurzelelemente. • Im ersten CD Element wird das Tag jahr“ geöffnet, jedoch erst nach ” dem Schließen des <cd> Tags geschlossen. • Im zweiten CD Element wird das Attribut verliehen“ doppelt verwen” det, der Attributname ist nicht mehr eindeutig. Korrekt müsste das XML-Dokument wie in Listing 1.1 lauten. Martin Planer, 5AHELI HTL Salzburg 10 Diplomarbeit 1.1.5 XML und Datenbanken Gültigkeit Um XML-Daten zwischen verschiedenen Anwendungen austauschen zu können, muss zuvor eine, für den Zweck einheitliche Struktur des XML-Dokuments definiert werden. Entspricht ein XML-Dokument dieser, ihm zugewiesenen, Definition und ist es zusätzlich wohlgeformt, spricht man von einem gültigen XML-Dokument. Strukturen für XML-Dokumente können auf verschiedene Weise definiert werden. Die gebräuchlichsten sind: • Dokumenttypdefinition (engl. Document-Type-Definition, DTD) • XML Schema (XML-Schema-Definition, XSD) Ich werde in dieser Arbeit nur auf die Möglichkeit der Definition per XML Schema eingehen, da Varianten sehr umfangreich sind und XSD von den beiden aufgeführten die modernere, selbst auf XML basierende Lösung ist. 1.2 XSD (XML Schema Definition) XSD (XML Schema Definition) ist eine, auf XML basierende, Sprache um die Struktur eines XML-Dokuments zu definieren. XML Schema ist als Nachfolger des älteren, aber immer noch häufig verwendeten, DTD-Standards gedacht und ersetzt diesen, auf Grund vieler Vorteile, langsam, aber sicher (XML-basiert, leistungsfähiger, Namensraumunterstützung, ...). XSD definiert, welche Elemente und Attribute und in welcher Anzahl in einem XML-Dokument vorkommen dürfen, die hierarchische Struktur dieser Elemente untereinander und welche Werte ein solches Element enthalten darf. XML-Dokumente können, zusätzlich zur Überprüfung auf Wohlgeformtheit, auch auf die Gültigkeit gegen das entsprechende XSD geprüft werden. Mittels XSD können so auch eigene, von XML abgeleitete, aber eigenständige, Auszeichnungssprachen definiert werden (z.B. RSS, XHTML, etc.). 1.2.1 Syntax Da XSD ein XML-Format ist, muss auch jedes XSD-Dokument mit einer XML-Deklaration beginnen. Martin Planer, 5AHELI HTL Salzburg 11 Diplomarbeit XML und Datenbanken Listing 1.9: Eine XML-Deklaration für XSD <? xml ?> Das Root-Element, das alle anderen Elemente in einer Schema Definition umschließt, ist das xs:schema-Element. Die im Dokument zu verwendenden Namensräume, können in diesem Element als Attribute angegeben werden. Listing 1.10: Das xs:schema-Element <? xml version="1.0" ?> <x s : s c h e m a x m l n s : x s=" http: // www.w3.org /2001/ XMLSchema "> ... </ x s : s c h e m a> Innerhalb des xs:schema-Elements können alle benötigten Elemente definiert werden. Hier unterscheidet man zwischen • einfachen Typen (simpleType) • komplexen Typen (complexType) simpleType-Elemente Ein simpleType-Element kann nur Werte direkt enthalten, nicht aber Attribute oder weitere Unterelemente. Zusätzlich zu dem Namen des Elements, muss hier noch der Datentyp angegeben werden, den dieses Element enthalten soll. Die gebräuchlichsten sind xs:string Eine Zeichenkette xs:decimal Eine Dezimalzahl xs:integer Eine Ganzzahl xs:boolean Ein boolscher Werte, repräsentiert über 0/1 bzw. true/false xs:date Eine Datumsangabe xs:time Eine Zeitangabe Zusätzlich können noch Standardwerte eingetragen werden, die angenommen werden, falls kein anderer Wert angegeben wird. Listing 1.11: XSD - simpleType <x s : e l e m e n t name=" Beispiel " type=" xs:string " default=" Standardwert "/> Martin Planer, 5AHELI HTL Salzburg 12 Diplomarbeit XML und Datenbanken complexType-Elemente Ein complexType-Element enthält weitere Unterelemente und/oder Attribute. Um ein Element als komplexen Typen zu definieren, wird ihm ein Kindelement namens xs:complexType zugewiesen, in den wiederum weitere Elemente definiert werden können. Die Reihenfolge der eingeschlossenen Elemente kann hier wiederum entweder strikt, über die Verwendung des Unterelements xs:sequence (die Elemente müssen in der angegebenen Reihenfolge vorkommen), oder locker über die Verwendung von xs:group (die Reihenfolge der Elemente ist nebensächlich) definiert werden. Da ein complexType keine Werte direkt enthalten kann, muss hier auch kein Datentyp oder ein Standardwert angegeben werden. Zusätzlich können für ein komplexes Element auch Attribute definiert werden. Die Attributdefinition erfolgt im Grund genommen gleich wie eine Definition eines einfachen Typs, nur wird anstatt des xs:element-Tags ein xs:attributeTag verwendet. Listing 1.12: XSD - complexType <x s : e l e m e n t name=" Ueberelement "> <xs:complexType> <x s : s e q u e n c e> < x s : a t t r i b u t e name=" Attribut1 " type=" xs:string "/> <x s : e l e m e n t name=" Beispiel " type=" xs:string " default=" Standardwert "/> ... </ x s : s e q u e n c e> </ xs:complexType> </ x s : e l e m e n t> Einschränkungen (Restrictions) Um dies zu akzeptierenden Werte eines simplen Typs genauer zu definieren, können Einschränkungen auf Basis eines der Standardtypen definiert werden. Der Werte der simpleTypeElements wird hierbei nicht direkt, über das type=”X”-Attribut angegeben, sonder, ähnlich dem complexType-Elements, über ein weiteres Unterelement namens xs:simpleType. In diesem xs:simpleType-Element können nur die Einschränkungen definiert werden. Unter anderem sind möglich: <xs:enumeration value=”XXX”> Ein oder mehrere solcher Elemente definieren die zu akzeptierenden Werte direkt. Nur angegebene Werte sind zulässig. Martin Planer, 5AHELI HTL Salzburg 13 Diplomarbeit XML und Datenbanken <xs:length value=”XXX”> Definiert die genaue Anzahl an Zeichen, die dieses Element enthalten darf/muss. <xs:minLength value=”XXX”> Definiert die minimale Anzahl an Zeichen, die dieses Element enthalten muss. <xs:maxLength value=”XXX”> Definiert die maximale Anzahl an Zeichen, die dieses Element enthalten darf. <xs:maxInclusive value=”XXX”> Definiert den maximalen Zahlenwert, die dieses Element enthalten darf. <xs:minInclusive value=”XXX”> Definiert den minimalen Zahlenwert, die dieses Element enthalten darf. <xs:maxExclusive value=”XXX”> Definiert den maximalen Zahlenwert (exklusive der angegebenen Zahl), die dieses Element enthalten darf (Der Wert muss also kleiner sein, als die angegebene Zahl). <xs:minExclusive value=”XXX”> Definiert den minimalen Zahlenwert (exklusive der angegebenen Zahl), die dieses Element enthalten darf (Der Wert muss also größer sein, als die angegebene Zahl). <xs:pattern value=”XXX”> Definiert einen regulären Ausdruck, der das exakte Muster der akzeptierten Daten spezifiziert. Das folgende Beispiel akzeptiert nur Ganzzahlen von 1 (inklusive) bis 10 (inklusive). Listing 1.13: XSD - Einschränkungen des Datentyps <x s : e l e m e n t name=" Beispiel1 "> <x s : s i m p l e T y p e> < x s : r e s t r i c t i o n b a s e=" xs:integer "> <x s : m i n I n c l u s i v e v a l u e="1"> <x s : m a x I n c l u s i v e v a l u e="10"> </ x s : r e s t r i c t i o n> </ x s : s i m p l e T y p e> </ x s : e l e m e n t> Die Häufigkeit, in denen die angegebenen Elemente vorkommen dürfen, kann über folgende Attribute, direkt in der Elementdefinition definiert werden. minOccurs Bestimmt wie oft ein Element vorkommen muss. Der Standardwert ist 1. Martin Planer, 5AHELI HTL Salzburg 14 Diplomarbeit XML und Datenbanken maxOccurs Bestimmt wie oft ein Element vorkommen darf. Durch die Angabe des Strings ”unbounded”, sind beliebig viele Elemente erlaubt. Der Standardwert ist 1. Listing 1.14: XSD - Angabe der Häufigkeit <x s : e l e m e n t name=" Beispiel " type=" xs:string " minOccurs="0" maxOccurs=" unbounded "/> Referenzen Um häufig verwendete Elemente nicht bei jedem Vorkommen wieder neu definieren zu müssen, können diese auch direkt unterhalb des xs:schema-Elements definiert, und von einer beliebigen Stelle, mittels <xs:element ref=”[name]”>, darauf referenziert werden. Listing 1.15: XSD - Referenzen <? xml version="1.0" ?> <x s : s c h e m a x m l n s : x s=" http: // www.w3.org /2001/ XMLSchema "> <x s : e l e m e n t name=" Ueberelement "> <xs:complexType> <x s : s e q u e n c e> < x s : a t t r i b u t e name=" Attribut1 " type=" xs:string "/> <x s : e l e m e n t r e f=" Beispiel1 "/> </ x s : s e q u e n c e> </ xs:complexType> </ x s : e l e m e n t> <x s : e l e m e n t name=" Beispiel1 "> <x s : s i m p l e T y p e> < x s : r e s t r i c t i o n b a s e=" xs:integer "> <x s : m i n I n c l u s i v e v a l u e="1"> <x s : m a x I n c l u s i v e v a l u e="10"> </ x s : r e s t r i c t i o n> </ x s : s i m p l e T y p e> </ x s : e l e m e n t> </ x s : s c h e m a> Aufgrund der Komplexität von XSD, wird hier nicht weiter darauf eingegangen. Die gezeigten Grundlagen sollten ausreichend sein, um dem restlichen Dokument folgen zu können. Weiterführende Informationen zur XML Schema Definition sind auf den Website des W3C (http://www.w3.org/XML/ Schema) oder in der Einführung der W3Schools (http://www.w3schools. com/schema/default.asp) verfügbar. Martin Planer, 5AHELI HTL Salzburg 15 Diplomarbeit 1.3 XML und Datenbanken XPath XPath (XML Path Language) ist eine Abfragesprachen um auf bestimmte Bereiche oder Elemente eines XML-Dokumentes zugreifen zu können. XPath benutzt einen sehr URL-ähnlichen Syntax um einen oder mehrere Knoten zu selektieren, das Ergebnis mittels eingebauten Funktionen, je nach Wunsch, einzuschränken und auf Daten innerhalb der Selektion zuzugreifen. XPath wurde vom W3C (World Wide Web Konsortium) entwickelt und am 16. November 1999 als Empfehlung veröffentlicht. 1.3.1 XPath Syntax Ein XPath-Ausdruck besteht aus einem oder mehreren Lokalisierungsschritt(en), wobei jeder Lokalisierungsschritt vom jeweils nächsten durch ein /“-Zeichen ” getrennt ist. Ein Lokalisierungsschritt besteht aus: • einer Achse • einem Knotentest • null oder mehrere Prädikate Achsen beschreiben die Beziehung zwischen dem Kontextknoten (dem gerade aktiven Knoten) und dem zu selektierenden Knoten. Knotentests definieren den gesuchten Knoten bzw. die gesuchte Knotenmenge genauer. Prädikate verfeinern die Suche noch weiter. 1.3.2 Achsen Anhand des folgenden Beispiels werden XPath-Achsen erklärt. Listing 1.16: Beispiel zur Erklärung von XPath-Achsen <a> <b> <c /> <c /> [ a1 ] [ b1 ] [ c1 ] [ c2 ] Martin Planer, 5AHELI HTL Salzburg 16 Diplomarbeit <c /> <c /> </b> <b> <d> <e <e </d> <d> <e <e </d> </b> </a> XML und Datenbanken [ c3 ] [ c4 ] /> /> [ b2 ] [ d1 ] [ e1 ] [ e2 ] /> /> [ d2 ] [ e3 ] [ e4 ] (vgl. Winkler 2008, Kap. Achsen“) ” Xpath definiert folgende wichtige Achsen: Martin Planer, 5AHELI HTL Salzburg 17 Diplomarbeit Achsenname child auch: . oder weglassen descendant parent auch: .. ancestor following-sibling precedingsibling following preceding attribute auch: @ self auch: . descendant-orself auch: // ancestor-or-self XML und Datenbanken Beschreibung Liefert alle Kindknoten, d.h. alle Knoten die eine hierarchische Ebene unterhalb des Kontextknotens. Liefert alle Nachkommen, d.h. alle Knoten die hierarchisch unterhalb des Kontextknotens sind. Liefert, sofern vorhanden, den Elternknoten, d.h. den Knoten eine Ebene oberhalb des Kontextknotens. Liefert alle Vorfahren, d.h. alle vorhergehenden Knoten, jeweils um eine Ebene weiter nach oben. Liefert alle nachfolgenden Geschwisterknoten, d.h. alle nachfolgenden Knoten auf der selben Ebene, falls vorhanden. Liefert alle vorhergehenden Geschwisterknoten, d.h. alle vorhergehenden Knoten auf der selben Ebene, falls vorhanden. Liefert alle nachfolgenden Geschwisterknoten inkl. deren Nachkommen, falls vorhanden. Liefert alle Knoten die hierarchisch über dem Kontextknoten liegen, aber nicht dessen eigene Vorfahren sind. Liefert alle Attribute des aktuellen Knotens. Liefert den aktuellen Knoten zurück. Liefert alle descendant-Knoten inkl. dem Kontextknoten. Beispiel Für [b2] sind das hier die Knoten [d1] und [d2]. Für [b2] sind das hier [d1], [e1], [e2], [d2], [e3] und [e4]. Für [b2] ist das der Knoten [a1]. Für [d2] sind das hier [b2] und [a1]. Für [b1] ist das [b2]. Für [b2] ist das [b1]. Für [b1] sind das [b2], [d1], [e1], [e2], [d2], [e3] und [e4]. Für [e4] sind das [e3], [d1], [e1], [e2], [b1], [c1], [c2], [c3] und [c4]. Für [d2] sind das [d2], [e3] und [e4]. Liefert alle ancestor-Knoten inkl. Für [d2] sind das [d2], dem Kontextknoten. [b2] und [a1]. Martin Planer, 5AHELI HTL Salzburg 18 Diplomarbeit XML und Datenbanken (vgl. Winkler 2008, Kap. Achsen“) ” 1.3.3 Knotentests Durch zwei Doppelpunkte getrennt ( ::“), kann nach einer Achse noch ein ” Knotentest angehängt werden, der der XPath-Ausdruck noch genauer spezifiziert. Knotentests können z.B. sein: Knotennamen Es werden nur Knoten mit dem angegebenen Namen selektiert. * Es werden alle Knoten selektiert, egal mit welchem Namen. text() Wählt alle Textknoten aus. comment() Wählt alle Kommentarknoten aus. node() Wählt alle Knoten beliebigen Typs aus. Beispiele: child::abc Wählt alle Kindknoten mit dem Namen abc“ aus. ” following::* Wählt alle folgenden Knoten aus. @id Wählt das Attribut id“ aus. Hier muss wegen den Kurzform kein ::“ ” ” angegeben werden. 1.3.4 Prädikate Um die XPath-Anweisungen noch genauer zu definieren, können optional noch beliebig viele Prädikate an die Anweisung angehängt werden. Prädikate stehen werden nach den Achsen und den Knotentests in eckigen Klammern ( [ und ]“) angehängt. ”” ” Die eckigen Klammern können jede Art von XPath-Ausdruck oder Funktion enthalten, die ein auswertbares Ergebnis zurückliefert. Beispiele: Martin Planer, 5AHELI HTL Salzburg 19 Diplomarbeit XML und Datenbanken child::a[@id ] Liefert jeden Kindknoten mit dem Namen a“ zurück, der ” ein Attribut id“ enthält. ” child::b[starts-with(., A“) ] Liefert jeden Knoten mit dem Namen b“ ” ” zurück, dessen Inhalt mit A“ beginnt. ” Die oben benutzte Funktion starts-with() ist nur ein Beispiel der vielen in XPath integrierten Funktionen, auf die ich, aufgrund der enormen Anzahl, nicht näher eingehen möchte und verweise nur auf die ausführliche XPathFunktions-Referenz von w3schools.org (http://www.w3schools.com/xpath/ xpath_functions.asp). 1.3.5 XPath Beispiele Durch die Anwendung einiger XPath-Beispiele auf das folgende XML-Dokument, soll die Verwendung von XPath veranschaulicht werden. Listing 1.17: XML-Dokument zur Veranschaulichung von XPath <? xml version="1.0" e n c o d i n g="ISO -8859 -1" standalone="yes" ?> <c d k a t a l o g> <cd v e r l i e h e n="nein"> < t i t e l>Ein Albumtitel</ t i t e l> <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099</ j a h r> < l i e d e r> < l i e d p o s i t i o n="1"> < t i t e l>Ich bin ein Lied .</ t i t e l> </ l i e d> < l i e d p o s i t i o n="2"> < t i t e l>I’m a song .</titel > </lied > </lieder > </cd > <cd verliehen =" ja"> <titel >Ein weiterer Albumtitel </ titel > <kuenstler >Ein weiterer Kuenstler </ kuenstler > <jahr >2017 </ jahr > <lieder > <lied position ="1" > <titel >Ich bin ein Lied .</titel > </lied > <lied position ="2" > <titel >I’m a song .</ t i t e l> </ l i e d> </ l i e d e r> Martin Planer, 5AHELI HTL Salzburg 20 Diplomarbeit XML und Datenbanken </ cd> </ c d k a t a l o g> In den folgenden Beispielen werden die Achsen nur angegeben, falls sie wirklich notwendig sind. Ansonsten wird die gekürzte Version verwendet, um die Beispiele übersichtlicher zu halten. /cdkatalog/cd Wählt alle cd-Elemente aus, die ein cdkatalog-Elternelement besitzen. //cd Wählt alle cd-Elemente aus, egal wo sie sich im Dokument befinden. //cd[@verliehen = ’nein’ ] Wählt alle cd-Elemente im Dokument bei denen das verliehen-Attribut auf nein“ gesetzt ist. ” /cdkatalog/cd[count(./lieder/lied) ¿= 2 ] Wählt alle cd-Elemente, die ein cdkatalog-Elternelement besitzen und mindestens 2 Lieder beinhalten. //lied[@position = 1, starts-with(./titel, Jon“), ../../jahr ¡ 2000 /titel] ” Wählt alle Titel von Liedern aus, die an erster Position im Album stehen, deren Titel mit Jon“ beginnt und wo das Album, auf dem das ” Lieb vorhanden ist, vor 2000 erschienen ist. XPath-Ausdrücke wie der Letzte der Beispiele zeigen deutlich, dass die Komplexität der Ausdrücke selbst viel schneller steigt, als die Komplexität der Abfrage selbst und die Ausdrücke dann nur mehr schwer zu verstehen sind. Um diesem Effekt bei umfassenden Abfragen entgegenzuwirken, wurde vom W3C der XQuery-Standard auf Basis von XPath entwickelt. 1.4 XQuery XQuery ist eine, auf XPath aufbauende, Abfragesprache für XML-Dokumente. Aufgrund dieser Tatsache ist jeder gültige XPath-Ausdruck gleichzeitig ein gültiger XQuery-Ausdruck. Martin Planer, 5AHELI HTL Salzburg 21 Diplomarbeit 1.4.1 XML und Datenbanken FLWOR FLWOR-Ausdrücke (gesprochen: flower“) sind eine Möglichkeit in XQuery ” um komplexe Abfragen gegliedert und strukturiert zu definieren. FLWORAusdrücke erinnern sehr stark an die SQL-Statements von relationalen Datenbanken, mit der Ausnahme, dass die Daten nicht aus Tabellen, Zeilen und Spalten, sondern aus XML-Dokumenten abgefragt werden. FLWOR steht für FOR, LET, WHERE, ORDER BY und RETURN. Ein simpler FLWOR-Ausdruck, um vom Beispiel-XML-Dokument weiter oben alle cd-Elemente abzufragen, die nach dem Jahr 2000 erschienen sind, lautet: Listing 1.18: Simpler FLWOR-Ausdruck for $c in doc ( " cdkatalog .xml" ) // cd where $c/ jahr > "2000" return $c FOR bindet die Ergebnisse des angegebenen Pfads an eine Variable. LET definiert eine Variable und weist ihr einen Wert zu. WHERE dient zur Einschränkung der Abfrage. Hier können eine oder mehrere Bedingung(en) angegeben werden, um die Abfrage auf diese zu prüfen. ORDER BY sortiert die Ergebnisse nach dem Ergebnis des angegebenen Pfads. RETURN definiert, welche Information von der Abfrage zurückgeliefert werden soll. Ein weiteres Beispiel, um vom Beispiel-XML-Dokument weiter oben, unter Verwendung aller möglichen FLWOR-Ausdrücke, Informationen abzufragen. Listing 1.19: Komplexer FLWOR-Ausdruck let $ doc := doc ( " cdkatalog .xml" ) for $c in $ doc // cd where $c/ jahr > "2000" order by $ jahr return $c Martin Planer, 5AHELI HTL Salzburg 22 Diplomarbeit XML und Datenbanken Die Abfrage selektiert wieder, wie im oberen Beispiel bereits gezeigt, alle cdElemente, die nach dem Jahr 2000 erschienen sind, jedoch sortier nach deren Jahreszahlen. Weiterführende Informationen zu finden sich unter anderem auf http://www. w3schools.com/xquery/default.asp. Martin Planer, 5AHELI HTL Salzburg 23 Diplomarbeit XML und Datenbanken Kapitel 2 Datenbanken 2.1 Warum ist XML keine (gute) Datenbank? Aufgrund dessen, dass das hierarchische Modell einer XML-Datei sowie die Unicode-Unterstützung und das, auch von Menschen gut lesbare, Textformat sehr gut dazu geeignet ist ein Vielzahl verschiedener Daten zu speichern, wird oft die Meinung vertreten, ein XML-Dokument sei ein gutes Format für eine Datenbank. Es gibt jedoch zahlreiche Gründe die gegen die Verwendung von XML als eine Datenbank sprechen. Das reine Textformat eines XML-Dokumentes ist zwar ein guter Kompromiss, um die Daten für beide, Menschen und EDV-Systeme, lesbar zu machen, aber gerade für Computersysteme erhöht es den Aufwand, um an bestimmte Daten zu kommen, enorm, da das Dokument bei jedem Zugriff erneut geparst werden muss. Weiteres fehlen essenzielle Features einer richtigen Datenbank, wie z.B. Indizierung, zur schnellen Suche innerhalb der Datenbank, Mehrbenutzerunterstützung, da eine XML-Datei nicht ohne Weiteres von mehreren Benutzern gleichzeitig benutzt werden kann, (Ausfall-)Sicherheit, um die Konsistenz der Daten zu gewährleisten oder Protokollierung der ausgeführten Änderungen/Abfragen. XML-Dokumente können also nur bedingt, in Fällen in denen die oben genannten Punkte keine tragende Rolle spielen (Konfigurationsdateien, Adressdatenbank, etc.) sinnvoll als Datenbank eingesetzt werden. Martin Planer, 5AHELI HTL Salzburg 24 Diplomarbeit 2.2 XML und Datenbanken XML Verwendung mit Datenbanken XML-Dokumente können auf 2 verschiedene Arten mit Datenbanken verwendet werden. Entweder als reines Datenaustauschformat oder die Struktur des Dokuments wird wirklich in der Datenbank gespeichert. 2.2.1 Verwendung von XML als Datenaustauschformat Sind von einem XML-Dokument wirklich nur die Daten, nicht aber die Struktur des XML-Dokuments von Bedeutung, können die Daten aus dem Dokument gefiltert werden und in normalen Spalten einer Tabelle gespeichert werden. Diesen Vorgang nennt man auch Shredding. Der umgekehrte Vorgang, die in den Spalten der Tabelle gespeicherten Daten wieder zu einem XML-Dokuments zusammenzufügen, nennt man publishing. Abbildung 2.1: Shredding / Publishing (Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004, S.7) Als Beispiel soll das folgende Dokument mittels Shredding in einer relationalen Datenbank gespeichert werden. Listing 2.1: Ein simples Beispiel-XML <? xml version="1.0" e n c o d i n g="ISO -8859 -1" ?> <c d s> <cd> < t i t e l>Ein Albumtitel</ t i t e l> Martin Planer, 5AHELI HTL Salzburg 25 Diplomarbeit XML und Datenbanken <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099</ j a h r> < l i e d e r> < l i e d p o s i t i o n="1"> < t i t e l>Ich bin ein Lied .</ t i t e l> </ l i e d> < l i e d p o s i t i o n="2"> < t i t e l>I’m a song .</titel > </lied > </lieder > </cd > <cd > ... </cd > </cds > Infolge dessen müssen 2 Tabellen angelegt werden, nämlich cds und lieder. Die Daten jeder CD werden in einer Zeile der Tabelle cds gespeichert. CDNummer Titel Kuenstler 1 Ein Albumtitel Ein Kuenstler ... ... ... Jahr 2099 ... Tabelle 2.1: CDs-Tabelle Die einzelnen Lieder der CD werden von der zweiten Tabelle, lieder, durch den Primärschlüssel in der Tabelle cds, auf die jeweilige CD bezogen. CDNummer 1 1 ... Position 1 2 ... Titel Ich bin ein Lied. I’m a song. ... Tabelle 2.2: Lieder-Tabelle Bei dieser Art der Verwendung von XML-Dokumenten mit Datenbanken ist die XML-Struktur selbst ist in der Datenbank nicht ersichtlich. Datenbanken die diese Art der Speicherung verwenden, nennt man XML-enabled Datenbanken. Martin Planer, 5AHELI HTL Salzburg 26 Diplomarbeit 2.2.2 XML und Datenbanken Direktes Speichern der XML-Dokumente Eine weitere Möglichkeit der Speicherung in Datenbanken, ist die direkte Speicherung des XML-Dokumentes in eine Reihe von Tabellen. Im Beispiel des XML-Dokumentes weiter oben, wäre das zum Beispiel: Jedem hinzugefügten Dokument wird eine eindeutige Identifikationsnummer und ein eindeutiger Name zugewiesen. Diese Daten werden in der DokumenteTabelle abgelegt. ID 1 2 ... Name sampleProduct.xml product2211.xml ... Tabelle 2.3: Dokumente-Tabelle Durch Bezugnahme auf die Document-ID, die ParentID des Dokumentes bzw. (in tieferen Ebenen des Dokumentes) auf die sonst jeweilige ParentID des übergeordneten Elements, kann nun die komplette hierarchische Struktur eines XML-Dokumentes in weiteren Tabellen abgebildet werden. ElementID 1 2 3 4 5 6 7 8 9 ... DocumentID 1 1 1 1 1 1 1 1 1 ... ParentID NULL 1 1 2 2 2 2 7 8 ... Name cds cd cd titel kuenstler jahr lieder lied titel ... OrderInParent 1 1 2 1 2 3 4 1 1 ... Tabelle 2.4: Elemente-Tabelle Martin Planer, 5AHELI HTL Salzburg 27 Diplomarbeit XML und Datenbanken AttributeID DocumentID ParentID Name Value 1 1 8 position 1 ... ... ... ... ... Tabelle 2.5: Attribute-Tabelle TextID 1 2 3 4 ... DocumentID 1 1 1 1 ... ParentID 4 5 6 9 ... Value Ein Albumtitel Ein Kuenstler 2099 Ich bin ein Lied. ... Value 1 1 1 1 ... Tabelle 2.6: Text-Tabelle Die Struktur des XML-Dokumentes wird also 1:1 in der Datenbank abgebildet, dass Informationen über Attribute oder Elementtypen erhalten bleiben. Datenbanken die diese Variante der Speicherung verwenden, nennt man XML-native Datenbanken. Abbildung 2.2: Direktes Speichern der XML Dokumente in der Datenbank (Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004, S.8) Martin Planer, 5AHELI HTL Salzburg 28 Diplomarbeit 2.3 XML und Datenbanken XML-enabled Datenbanken Wie weiter oben schon erwähnt, ist das Datenmodell bei XML-enabled Datenbank nicht gleich dem des XML-Dokumentes und dient meist nur zur Speicherung der Daten und nicht der Struktur. Solche Datenbanken bestehen meist nur aus einer Software, die einer relationalen Datenbank vorgeschaltet wird, um die XML-Daten von der XML-Struktur in die Struktur der Datenbank zu konvertieren - und vice versa. Aufgrund der Einschränkungen von relationalen Datenbanken, können durch dieses Verfahren eine Eigenschaften von XML-Dokumenten nicht abgebildet werden, zum Beispiel Gemischter Inhalt, Referenzen, Kommentare, Reihenfolge der Elemente etc. XML wird in diesem Anwendungsfall nur als Datenaustauschformat verwendet. Das XML-Dokument besteht nur temporär und kann nicht eindeutig identifiziert werden. Auch ein 100 Die Verwendung von XML-enabled Datenbanken ist also ausschließlich für Anwendungen verwendbar, bei denen nur die in den XML-Dokumenten gespeicherten Daten von Belang sind, nicht aber die Struktur des Dokuments. Es ist auch ein Weg um bestehende Daten aus einer relationalen Datenbank in XML-Anwendungen weiterzuverwenden. 2.3.1 Mapping Um die XML-Daten an der richtigen Stelle in der Datenbank ablegen zu können, müssen die Zugehörigkeiten der XML-Elemente zu deren entsprechenden Datenbanktabellen festgelegt werden, dies geschieht durch das sogenannten Mapping. Der Vorteil eines solchen Mapping besteht darin, dass vorhandene Daten in der Datenbank durch verschiedene Mappings für verschiedene XML-Dokumente verwendet werden können. Es bestehen 3 Möglichkeiten dieser Zuordnung: • table-based mapping • object-relational mapping • query languages Zu Beachten ist hierbei, dass table-based mapping und object-relational mapping bidirektionale Mappingvarianten darstellen, sie erlauben also den Datentransfer von und zur Datenbank. Query languages (Abfragesprachen) bieten zur Zeit nur den Transfer von der Datenbank zur Applikation. Martin Planer, 5AHELI HTL Salzburg 29 Diplomarbeit XML und Datenbanken Table-Based Mapping Für die Verwendung von XML-Dokumenten mit einem table-based mapping, muss das XML-Dokument die selbe logische Struktur wie die Tabelle aufweisen, auf die die Daten abgebildet werden. Listing 2.2: Ein simples Beispiel-XML <? xml version="1.0" e n c o d i n g="ISO -8859 -1" ?> <d a t a b a s e> <c d s> <cd> <nummer>1</nummer> < t i t e l>Ein Albumtitel</ t i t e l> <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099</ j a h r> </ cd> <cd> ... </ cd> </ c d s> < l i e d e r> < l i e d> <cdnummer>1</cdnummer> <p o s i t i o n>1</ p o s i t i o n> < t i t e l>Ich bin ein Lied .</ t i t e l> </ l i e d> < l i e d> <cdnummer>1</cdnummer> <p o s i t i o n>1</ p o s i t i o n> < t i t e l>I’m a song .</titel > </lied > </lieder > </database > Durch die Einschränkungen durch die relationale Datenbank ist im XMLDokument nur eine hierarchische Ebene möglich. Unter- bzw. übergeordnete Elemente müssen sowohl im XML-Dokument als auch in der Datenbank über eindeutige IDs verknüpft werden. Diese IDs erzeugen, einem entsprechend großen Datensatz vorausgesetzt, einen nicht zu unterschätzenden Overhead, der auf jeden Fall berücksichtigt werden muss, da die IDs immer mindestens zweimal angegeben werden müssen. Auch eine weitere Verschachtelung der von der Datenbank erzeugten XMLDokumente ist höchstens später über eine zusätzliche XSL-Transformation möglich. Martin Planer, 5AHELI HTL Salzburg 30 Diplomarbeit XML und Datenbanken Abbildung 2.3: XSLT Transformation bei Table-Based Mapping (Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004, S.585) Trotz der anscheinend großen Nachteile dieser Mappingvariante wird sie dennoch häufig verwendet, da die Software zur Transformation der Daten zwischen XML-Dokument und Datenbank sehr simpel zu realisieren ist und das Einfügen von Daten in die Datenbank sehr effizient von Statten geht (z.B. beim Replizieren einer Datenbank). Object-Relational Mapping Mittel des Object-Relational Mappings können auch tief verschachtelte XMLDokumente direkt behandelt werden. Das XML-Dokument wird hierzu als ein serialisierter Baum von Objekten und deren Eigenschaften betrachtet werden, die die Beziehungen der Elemente widerspiegeln. Die Struktur wird dann wie folgt auf Datenbank abgebildet: Objekte auf Tabellen (XML: Komplexe Typen) Eigenschaften auf die Spalten der Tabellen (XML: Einfache Typen, Attribute) Beziehungen auf Primär- bzw. Fremdschlüssel (XML: Referenzen) Listing 2.3: Ein simples Beispiel-XML <? xml version="1.0" e n c o d i n g="ISO -8859 -1" ?> <c d s> <cd> < t i t e l>Ein Albumtitel</ t i t e l> <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099</ j a h r> < l i e d e r> Martin Planer, 5AHELI HTL Salzburg 31 Diplomarbeit XML und Datenbanken Abbildung 2.4: Object-Relational Mapping (Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004, S.586) < l i e d p o s i t i o n="1"> < t i t e l>Ich bin ein Lied .</ t i t e l> </ l i e d> < l i e d p o s i t i o n="2"> < t i t e l>I’m a song .</titel > </lied > </lieder > </cd > <cd > ... </cd > </cds > Im Fall des obigen Beispiel-XML-Dokuments lassen sich 2 Objekte sowie deren Eigenschaften identifizieren: • Objekt cd – Eigenschaft ”titel” – Eigenschaft ”kuenstler” – Eigenschaft ”jahr” • Objekt lied Martin Planer, 5AHELI HTL Salzburg 32 Diplomarbeit XML und Datenbanken – Eigenschaft ”position” – Eigenschaft ”titel” Diese 2 Objekte könnten wie folgt auf die Tabellen abgebildet werden: ID 1 ... titel kuenstler Ein Albumtitel Ein Kuenstler ... ... jahr 2099 ... Tabelle 2.7: CDs-Tabelle ID 1 2 ... cdID 1 1 ... position 1 2 ... titel Ich bin ein Lied. I’m a song. ... Tabelle 2.8: Lieder-Tabelle Query Languages Query Languages (Abfragesprachen) eliminieren den Bedarf einer engen Bindung zwischen den Schemata von XML-Dokument und Datenbank, und bieten somit mehr Spielraum beim Erzeugen von XML-Dokumenten aus Datenbanken. Die zwei wichtigsten Vertreter solcher Abfragesprachen sind: • SQL/XML • XQuery SQL/XML SQL/XML stellt eine Erweiterung von SQL dar und ist für dein Einsatz mit XML-enabled relationalen Datenbanken konzipiert worden. Die Hauptunterschiede zu SQL sind die Einführung eines XML-Datentyps und Funktionen zur Erzeugung von XML-Dokumenten (Elemente, Attribute, ...). Martin Planer, 5AHELI HTL Salzburg 33 Diplomarbeit XML und Datenbanken XML Der XML-Datentyp. Kann entweder NULL, Text oder ein XML-Dokument enthalten. XMLAgg() Eine Funktion, um XML-Daten bei ”GROUP BYAbfragen in Gruppen zusammenzufassen. XMLAttributes() Eine Funktion, um XML-Attribute in XML-Elemente einzufügen. XMLConcat() Eine Funktion, um zwei oder mehrere XML-Werte zu verknüpfen. XMLElement() Eine Funktion, um ein XML-Element in der Ausgabe zu erzeugen. XMLForest() Eine Funktion, um eine Liste (”Forest”) von XML-Elementen aus einer Liste relationaler Daten zu erzeugen. XMLNamespaces() Eine Funktion, um Namensräume in einem XML-Dokument zu erzeugen. XMLSerialize() Eine Funktion, um einen XML-Wert in eine Zeichenkette zu serialisieren. (vgl. Gennick 2003, Abschnitt ”The SQL/XML Standard”) Als Beispiel werden nun aus folgenden Tabellen einer relationalen Datenbank Daten mittels SQL/XML abgefragt und daraus ein XML-Dokument erzeugt. CDNummer 1 2 ... Titel Ein Albumtitel Noch ein Albumtitel ... Kuenstler Ein Kuenstler Noch ein Kuenstler ... Jahr 2099 3099 ... Tabelle 2.9: CDs-Tabelle Die SQL/XML-Anweisung, um aus der Datenbank alle Alben abzufragen, lautet: Martin Planer, 5AHELI HTL Salzburg 34 Diplomarbeit XML und Datenbanken Listing 2.4: SQL/XML Beispiel SELECT XMLELEMENT ( NAME cd , XMLATTRIBUTES ( CDs . CDNummer AS cdnummer ) , XMLELEMENT ( NAME titel , CDs . Titel ) , XMLELEMENT ( NAME kuenstler , CDs . Kuenstler ) , XMLELEMENT ( NAME jahr , CDs . Jahr ) ) AS cdxml FROM CDs Für jeden Datensatz in der CDs Tabelle der Datenbank wird ein XMLDokument erstellt, zum Beispiel: Listing 2.5: SQL/XML Beispiel <cd cdnummer="1"> < t i t e l>Ein Albumtitel</ t i t e l> <k u e n s t l e r>Ein Kuenstler</ k u e n s t l e r> <j a h r>2099</ j a h r> </ cd> XQuery XQuery ist eine vom W3C (World Wide Web Consortium) definierte Abfragesprache zur Abfrage von Daten aus XML-Dokumenten. Da Daten eben nur aus XML-Dokumenten abgefragt werden können, muss zur Verwendung von XQuery mit relationalen Datenbanken, zuerst ein virtuelles XML-Dokument erzeugt werden (z.B. mittels einem Table-Based Mapping). Die Syntax von XQuery wurde in diesem Dokument schon näher erläutert. Siehe dazu Abschnitt 1.4, ”XQuery”. 2.4 Native XML-Datenbanken Native XML-Datenbanken benutzen das XML-Modell direkt und können so beliebige XML-Dokumente speichern. Sie sind daher bestens für Anwendungen mit sehr komplex und tief verschachtelten oder semistrukturierten Daten, deren Speicherung in traditionellen relationalen Datenbanken ein Problem darstellt. Da bei nativen XML-Datenbanken jedes beliebige XML-Dokument, ohne vorheriges Mapping und/oder Konfigurieren der Datenbank, gespeichert werden kann, sind sie auch hervorragend für Anwendungen einsetzbar, in denen die endgültige XML- bzw. Datenstruktur noch nicht endgültig festgelegt ist. Martin Planer, 5AHELI HTL Salzburg 35 Diplomarbeit XML und Datenbanken Abbildung 2.5: XQuery Abfrage einer relationalen Datenbank (Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004, S.16) Prädestinierte Einsatzgebiete für native XML-Datenbanken sind somit: • Archivierung von (XML-)Dokumenten • Speicherung von semistrukturierten Daten, also Daten deren Struktur nicht immer die selbe ist. Laut http://www.xmldb.org ist eine native XML-Datenbank eine die: • ein Datenmodell für XML definiert. • ein XML-Dokument als kleinste logische Einheit zur Speicherung verwendet. • eine beliebige physische Speichermöglichkeit verwendet. (vgl. http://www.xmldb.org) Martin Planer, 5AHELI HTL Salzburg 36 Diplomarbeit XML und Datenbanken XML-Datenmodell Das XML-Datenmodell einer nativen XML-Datenbank definiert, welche logischen Einheiten eines XML-Dokuments signifikant sind. Das minimale Modell enthält Elemente, Attribute, Text und die Reihenfolge von Dokumenten. Je nach Anwendung sind zusätzliche Dinge definiert, z.B. Referenzen, CDATA-Bereiche1 , etc. Heutzutage ist das XPath-Datenmodell bei nativen XML-Datenbanken sehr verbreitet. Dieses wird jedoch zunehmend vom XQuery-Datenmodell verdrängt. Mehr Informationen über dieses standardisierte Datenmodell finden Sie auf der Website des W3C (http://www.w3.org/TR/xpath-datamodel/) Kleinste logische Einheit Die kleinste, zusammenhängende Speichereinheit einer relationalen Datenbank sind die Reihen (Zeilen) einer Tabelle. Genauso besitzt eine XML-Datenbank ein XML-Dokument als kleinste, zusammenhängende Speichereinheit. Jedes XML-Fragment, das nur von einem einzelnen Element umschlossen wird, gilt hierbei als XML-Dokument. Beliebige physische Speichermöglichkeit / Implementation Laut Definition darf eine native XML-Datenbank jede Art der Implementation nutzen, z.B.: • Speicherung der XML-Dokumente in CLOBs (Character Large OBject) einer relationalen Datenbank und Indizierung der einzelnen Elemente und Attribute. • Speicherung der geparsten XML-Dokumente in mehreren einzelnen Tabellen (Elemente, Attribute, Text, ...). • Speicherung der geparsten XML-Dokumente als DOM-Tree in einer objektorientierten Datenbank. • Speicherung der geparsten XML-Dokumente in indizierten Hash-Tabellen. • Speicherung XML-Dokumente als XML-Dateien und zusätzliche Indizierung durch Hash-Tabellen. (vgl Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004, S.20) Character Data (Zeichendaten) definieren in XML einen Bereich, der nur Text enthält und nicht interpretiert werden soll. 1 Martin Planer, 5AHELI HTL Salzburg 37 Diplomarbeit XML und Datenbanken Das Einfügen und Abfragen von Daten aus einer nativen XML-Datenbank erfolgt meist über Anfragesprachen wie XQuery bzw. XUpdate in Verbindung mit produktspezifischen Schnittstellen / Bibliotheken. 2.5 Berkeley DB XML Unter Verwendung der Berkeley DB XML von Oracle, soll nun die Verwendung einer XML-Datenbank anhand einiger praktischer Beispiele erläutert werden. Berkeley DB XML (BDB XML) ist eine, in Anwendungen, einbettbare (embeddable) Datenbankengine. Es wird zur Benutzung also kein eigener Datenbankserver benötigt, sondern die betreffende Anwendung kommuniziert direkt - über eine entsprechende Bibliothek - mit der Datenbank. Berkeley DB XML enthält aber auch ein Kommandozeilenprogramm, um die Funktionen auch ohne eine eigene Anwendung testen und mit XML-Daten arbeiten zu können. 2.5.1 Einführung in Berkeley DB XML Im folgenden Abschnitt soll der grundlegende Umgang mit der Berkeley DB XML (Einfügen/Abfragen von Daten, Erzeugen von Containern, Sortierung, etc.) mittels dem beigelegten Kommandozeilenprogramm erläutert werden. Container Berkeley DB XML verwendet sogenannte Container um jegliche Art von XML-Daten zu speichern. Container enthalten eine Sammlung von XMLDokumenten und Metadaten über diese Daten (z.B. Indizes). Die XMLDokumente können hierbei entweder als komplette Dokumente in dem Container abgespeichert werden oder zuerst in die einzelnen Knoten aufgeteilt und dann als mehrere Teildokumente gespeichert werden. Da die Variante der Speicherung der einzelnen Knoten meist performanter arbeitet als die Speicherung des kompletten Dokuments, ist dies auch die Standardeinstellung. Die folgenden Befehle werden alle im Kommandozeilentool dbxml(.exe) ausgeführt, das sich im Ordner [Pfad der Berkeley DB XML Installation]/bin/dbxml/ befindet. Martin Planer, 5AHELI HTL Salzburg 38 Diplomarbeit XML und Datenbanken Beim Starten des Programms sollte die folgende Eingabeaufforderung erscheinen. Listing 2.6: BDB XML Kommandozeile dbxml> Das Programm erwartet ab sofort die Eingabe von Befehlen. Um mit der Berkeley DB XML experimentieren zu können, benötigen wir zuerst einen Container. Wir erzeugen hier einen neuen Container mit dem folgenden Befehl. Listing 2.7: Erzeugen eines neuen Containers dbxml> createContainer cds . dbxml Der Befehl erzeugt einen leeren Container mit dem Namen cds.dbxml im Arbeitsverzeichnis. Der Name des Containers kann frei gewählt werden, es empfiehlt sich jedoch auch Leerzeichen, Sonderzeichen und sonstige potentielle Hürden zu verzichten. Die Dateiendung .dbxml dient nur zur Identifikation der Datei als BDB XML-Container und ist nicht zwingend vorgeschrieben. Nach dem erzeugen eines neuen Containers wird dieser automatisch als aktiven Container geöffnet. Soll mit einem bestehenden Container gearbeitet werden, muss dieser erst mit dem Befehl Listing 2.8: Erzeugen eines neuen Containers dbxml> openContainer [ dateiname ] geladen werden. In unserem fall wäre also der Befehl Listing 2.9: Öffnen eines bestehenden Containers dbxml> openContainer cds . dbxml nötig. Arbeiten mit Daten Für das Einfügen von XML-Dokumenten zur Datenbank besteht der Befehl Listing 2.10: Öffnen eines bestehenden Containers - Beispiel dbxml> putDocument [ name ] [ wert ] [ f | s | q ] Martin Planer, 5AHELI HTL Salzburg 39 Diplomarbeit XML und Datenbanken [name ] ist ein eindeutiger Name für das Dokument, der es in der Datenbank identifiziert. [f—s—q ] gibt an, in welcher Form die Daten eingefügt werden. f importiert die Daten von einer Datei. s fügt die, als Zeichenkette, übergebenen Daten in die Datenbank ein. q fügt das Ergebnis des übergebenen XQueryAusdrucks in die Datenbank ein. [wert ] ist ein Parameter, dessen Inhalt von dem Wert des letzen Parameters abhängig ist. Ist der dritte Parameter f, dann wird hier der Dateiname der XML-Datei angegeben, die in die Datenbank importiert werden soll. Ist er s wird hier das Dokument direkt, von 2 einfachen Anführungszeichen abgegrenzt, übergeben. Wird der wird des letzen Parameters auf q gesetzt, muss hier ein XQuery-Ausdruck angegeben werden, der die einzufügenden Daten erzeugt. Wir fügen nun ein paar Dokumente zur Datenbank hinzu, um darauf Abfragen ausführen zu können. Listing 2.11: Hinzufügen von Dokumenten - Beispiel dbxml> putDocument cd1 ’<cd > <titel >Ein Albumtitel </ titel > <kuenstler >Ein Kuenstler </ kuenstler > <jahr >2099 </ jahr > <lieder > <lied position ="1" > <titel >Ich bin ein Lied .</titel > </lied > <lied position ="2" > <titel >I am a song .</titel > </lied > </lieder > </cd >’ s dbxml> putDocument cd2 ’<cd > <titel >An Album Title </ titel > <kuenstler >An Artist </ kuenstler > <jahr >3054 </ jahr > <lieder > <lied position ="1" > <titel >Ich bin auch ein Lied .</titel > </lied > <lied position ="2" > <titel >I am another song .</titel > </lied > </lieder > Martin Planer, 5AHELI HTL Salzburg 40 Diplomarbeit XML und Datenbanken </cd >’ s Der Container beinhaltet nun ein paar CD-Einträge, aus denen wir Daten über XQuery-Ausdrücke abfragen können. Abfragen können über den Befehl Listing 2.12: Abfrage von Daten dbxml> query ’[ Abfrage ]’ ausgeführt werden. Zum Abfragen aller Albumtitel benötigen wir also zum Beispiel: Listing 2.13: Abfrage von Daten - Beispiel dbxml> query ’collection (" cds. dbxml ")/cd/ titel / string () ’ 2 objects returned for eager expression ’collection (" cds. dbxml ") /cd/ titel / string () ’ Wie zu sehen ist, werden 2 Objekte als Ergebnis gefunden. Um diese anzuzeigen benutzen wir den Befehl Listing 2.14: Anzeigen der Ergebnisse dbxml> print An Album Title Ein Albumtitel Mit solch einer Abfrage an die BDB XML werden, wie bei einem SELECTStatement bei einer relationalen Datenbank, Daten von der Datenbank abgefragt. Mittel der Funktion colletion() wird der Container bekanntgegeben, von dem abgefragt werden soll (äquivalent zum SELECT ... FROM ... bei relationalen Datenbanken). Durch die logische Verknüpfung von mehreren collection()-Aufrufen, können auch Daten von mehreren Containern gleichzeitig abgefragt werden, genau so wie einzelne, hinzugefügte Dokumente über die von XPath bekannte Funktion doc(). Als nächster Schritt können komplexere XQuery-Ausdrücke zum Abfragen bzw. Einfügen von Daten benutzt werden. Um z.B. 10 CD-Einträge automatisiert in die Datenbank einzufügen, wäre folgender XQuery-Ausdruck denkbar: Listing 2.15: XQuery-Ausdrücke in BDB XML dbxml> putDocument "" ’ for $i in (0 to 19) return Martin Planer, 5AHELI HTL Salzburg 41 Diplomarbeit XML und Datenbanken <cd > <titel > Titel {$i}</titel > <kuenstler > Kuenstler {$i}</ kuenstler > <jahr >{$i}{$i}{$i}{$i}</jahr > <lieder > <lied position ="1" > <titel >Lied {$i}</titel > </lied > <lied position ="2" > <titel >Song {$i}</titel > </lied > </lieder > </cd >’ q Die Einträge werden anhand der Laufvariable i benannt und bekommen, durch die Angabe eines leeren Namens, automatisch einen eindeutigen Namen zugewiesen. Unter Verwendung aller in XPath bzw. XQuery verfügbaren Ausdrücke, können beliebig komplexe Abfragen erstellt werden. Auf dies wird jedoch nicht weiter eingegangen. Weitere Informationen zur Abfrage über XQuery-Ausdrücke finden Sie im Kapitel 1.4, ”XQuery”, und auf den dort und im Literaturverzeichnis angegebenen Links. 2.5.2 Berkeley DB XML API Das Kommandozeilentool, das im letzten Kapitel verwendet wurde, ist eigentlich nur ein Programm um die Fahigkeiten der Berkeley DB XML auszuprobieren und kennenzulernen bzw. um einzelne Datensätze manuell zu editieren. Die BDB XML ist als ëmbedded”Datenbank konzipiert und wird in den meisten Anwendungsfällen direkt in ein Programm eingebettet. Die dazu vorhandenen Schnittstellen werden im folgenden Kapitel erläutert. Es existiert ein Berkeley DB XML API mit Bindings für mehrere Programmiersprachen (u.a. Python, Java, C++). Die zur Verfügung stehenden Objekte und Methoden sind in allen Sprachen die selben. Klassen und Methoden XmlManager XmlManager ist eines der wichtigsten Interfaces der Datenbank. Der Manager verwaltet die Container, bereitet Abfragen vor und führt diese aus, kümmert sich um benötigte FileStreams, etc, etc. Martin Planer, 5AHELI HTL Salzburg 42 Diplomarbeit XML und Datenbanken XmlContainer XmlContainer kapselt einen Dokumenten-Container inklusive dessen Indizes und Statistiken. Er bietet außerdem Methoden, um die gespeicherten Dokumente zu verwalten (einfügen, löschen, indizieren). XmlUpdateContext XmlUpdateContext bietet ein Objekt, um UpdateAnfragen auf einen XmlContainer auszuführen (einfügen bzw. ändern von Daten). XmlQueryContext XmlQueryContext bietet ein Objekt, um Abfragen auf einen XmlContainer auszuführen. Er bietet außerdem Variablen- und Namespacebindung sowie Parameter, wie die Ergebnisse zurückgeliefert werden sollen. XmlResults XMLResults fasst alle Ergebnisse einer Abfrage zusammen und besteht aus einer Sammlung von XmlValue-Objecten. XmlValue XmlValue kapselt den Wert eines Knotens in einem XML-Dokument. Der Wert kann von einem jedem beliebigen Typ sein, der in der XmlValue::Type Enumeration definiert ist (u.a. NONE, STRING, DOUBLE, BOOLEAN, NODE). XmlException XmlException ist repräsentiert den Ausnahmetyp, der geworfen wird, sollte ein Fehler in der Abarbeitung des Programms auftreten. Das Programm muss diese Ausnahme abfangen können. Mittel dieser kleinen Auswahl der in der API verfügbaren Klassen und Methoden, lässt sich bereits ein Programm erstellen, das die Berkeley DB XML verwendet. C++ Beispielprogramm Die im vorhergehenden Kapitel erwähnten Teile der BDB XML API werden nun zu einem simplen Beispielprogramm in C++ zusammengefügt. Der Ablauf des Programms wird einen Container anlegen, ihn mit Daten füllen und anschließend wieder Daten aus ihm abfragen. Um die Bibliothek verwenden zu können, muss die Headerdatei eingebunden werden: Martin Planer, 5AHELI HTL Salzburg 43 Diplomarbeit XML und Datenbanken Listing 2.16: Einbinden der Headerdatei # include <dbxml/DbXml . hpp> Optional kann noch der Namensraum definiert werden, der verwendet werden soll. Listing 2.17: Namensraum definieren using namespace DbXml ; Der wichtigste Teil der Anwendung ist der XmlManager, der fast alle Abläufe in der Datenbank verwaltet. Es muss vor der Verwendung der Datenbank erzeugt werden. Listing 2.18: XmlManager erzeugen XmlManager mgr ; Um einen Container und einen Kontext darauf zu erzeugen, muss die Methode .createContainer des XmlManager s aufgerufen werden und einem XmlContainer zugewiesen werden. Listing 2.19: XmlManager erzeugen XmlContainer cont = mgr . createContainer ( "cds. dbxml " ) ; Um Daten in den gerade erzeugen Container einzufügen, benötigen wird einen XmlUpdateContext, der wieder über eine Methode der XmlManager s erzeugt werden kann. Listing 2.20: XmlUpdateContext erzeugen XmlUpdateContext uc = mgr . createUpdateContext ( ) ; Mit Hilfe des XmlUpdateContexts können nun Daten in den Container eingefügt werden. Listing 2.21: Einfügen von Daten cont . putDocument ( "cd1" , "<cd ><titel >Ein Albumtitel </ titel >< kuenstler >Ein Kuenstler </ kuenstler ><jahr >2099 </ jahr ><lieder >< lied position ="1"><titel >Ich bin ein Lied .</titel ></lied >< lied position ="2"><titel >I am a song .</titel ></lied ></ lieder ></cd >" , uc ) ; cont . putDocument ( "cd2" , "<cd ><titel >An Album Title </ titel >< kuenstler >An Artist </ kuenstler ><jahr >3054 </ jahr ><lieder ><lied position ="1"><titel >Ich bin auch ein Lied .</titel ></lied >< lied position ="2"><titel >I am another song .</titel ></lied ></ lieder ></cd >" , uc ) ; Martin Planer, 5AHELI HTL Salzburg 44 Diplomarbeit XML und Datenbanken Zur Abfrage von Informationan aus den hinzugefügten Daten, wird nun ein XmlQueryContext benötigt. Listing 2.22: XmlQueryContext erzeugen XmlQueryContext qc = mgr . createQueryContext ( ) ; Mit Hilfe des XmlQueryContexts können nun Daten aus dem Container abgefragt und in einem XmlResults-Objekt gespeichert werden. Listing 2.23: Daten abfragen XmlResults res = mgr . query ( " collection (’cds. dbxml ’)/cd/ titel / string ()" , qc ) ; Um die Daten aus dem XmlResults auszulesen, muss ein XmlValue-Objekt angelegt werden. In dieses XmlValue-Objekt können nun die einzelnen XmlValues innerhalb des XmlResult-Objektes geschrieben und ausgegeben werden. Listing 2.24: Ergebnisse auslesen und ausgeben XmlValue value ; while ( res . next ( value ) ) cout << "Wert: " << value . asString ( ) << endl ; Um die Fehler, die während des Ablaufs des Programms auftreten können, abzufangen, muss der gesamte Ablauf von einem try-catch-Block umschlossen, und die XmlException abgefangen werden. Listing 2.25: Abfangen der XmlException try { <<Programmcode>> } catch ( XmlException &e ) { cout << " Fehler : " << e . what ( ) << endl ; } Das komplette, lauffähige C++ Beispielprogramm: Listing 2.26: Komplettes C++ Beispielprogramm # include <s t r i n g > # include <f s t r e a m > # include " dbxml / DbXml .hpp" using namespace std ; using namespace DbXml ; Martin Planer, 5AHELI HTL Salzburg 45 Diplomarbeit XML und Datenbanken int main ( int argc , char ∗∗ argv ) { try { XmlManager mgr ; XmlContainer cont = mgr . createContainer ( "cds. dbxml " ) ; XmlUpdateContext uc = mgr . createUpdateContext ( ) ; cont . putDocument ( "cd1" , "<cd ><titel >Ein Albumtitel </ titel >< kuenstler >Ein Kuenstler </ kuenstler ><jahr >2099 </ jahr >< lieder ><lied position ="1"><titel >Ich bin ein Lied .</titel ></lied ><lied position ="2"><titel >I am a song .</titel ></ lied ></ lieder ></cd >" , uc ) ; cont . putDocument ( "cd2" , "<cd ><titel >An Album Title </ titel >< kuenstler >An Artist </ kuenstler ><jahr >3054 </ jahr ><lieder >< lied position ="1"><titel >Ich bin auch ein Lied .</titel ></ lied ><lied position ="2"><titel >I am another song .</titel ></lied ></ lieder ></cd >" , uc ) ; XmlQueryContext qc = mgr . createQueryContext ( ) ; XmlResults res = mgr . query ( " collection (’cds. dbxml ’)/cd/ titel / string ()" , qc ) ; XmlValue value ; while ( res . next ( value ) ) cout << "Wert: " << value . asString ( ) << endl ; } catch ( XmlException &e ) { std : : cout << " Fehler : " << e . what ( ) << std : : endl ; } return 0 ; } (vgl. Oracle 2008[1], S.32) Martin Planer, 5AHELI HTL Salzburg 46 Diplomarbeit XML und Datenbanken Literaturverzeichnis Powell 2007: Gavin Powell, Beginning XML Databases. (Indianapolis 2007) Williams 2000: Kevin Williams, Professional XML Databases. (Birmingham 2000) Schmidt, Tomczyk 2002: Andreas Schmidt, Peter Tomczyk, Datenbanken und XML: Konzepte, Anwendungen, Systeme. (Heidelberg 2002) Boag, Chamberlin, Fernández, Florescu, Robie, Siméon 2007: Scott Boag, Don Chamberlin, Mary Fernández, Daniela Florescu, Jonathan Robie, Jérôme Siméon, XQuery 1.0: An XML Query Language. Internet: http://www.w3.org/TR/xquery/ (28.01.2008 19:45:37) Bray, Paoli, Sperberg-McQueen, Maler 2000: Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler, Extensible Markup Language (XML) 1.0 (Zweite Auflage). Internet: http://edition-w3c.de/TR/ 2000/REC-xml-20001006/ (12.02.2008 21:09:23) Clark, DeRose 1999: James Clark, Steve DeRose, XML Path Language (XPath) Version 1.0. Internet: http://www.obqo.de/w3c-trans/ xpath-de-20020226 (21.02.2008 18:59:07) Jänicke 2007: Christian Jänicke, XML, DTD und XML-Schema. Internet: http://www.bitworld.de/grundlagen_xml.html (12.02.2008 21:14:29) Klein 2001: Klein Oliver, Datenbanken und XML. Internet: http:// www.urz.uni-heidelberg.de/imperia/md/content/urz/programme/ db_und_xml.pdf (03.02.2008 10:08:12) Obasanjo 2001: Dare Obasanjo, An Exploration Of Xml In Database Management Systems. Internet: http://www.25hoursaday.com/StoringAndQueryingXML. html (05.02.2008 17:16:29) Martin Planer, 5AHELI HTL Salzburg 47 Diplomarbeit XML und Datenbanken Steegmans, Bourret, Cline, Guyennet, Kulkarni, Priestley, Sylenko, Wahli 2004: Bart Steegmans, Ronald Bourret, Owen Cline, Olivier Guyennet, Shrinivas Kulkarni, Stephen Priestley, Valeriy Sylenko, Ueli Wahli, XML for DB2 Information Integration. Internet: http://www.redbooks.ibm. com/redbooks/pdfs/sg246994.pdf (05.02.2008 17:38:52) Bourret 2005: Ronald Bourret, XML and Databases. Internet: http:// www.rpbourret.com/xml/XMLAndDatabases.htm (14.02.2008 19:12:26) Oracle 2008[1]: Oracle, Introduction to Berkeley DB XML. Internet: http://www.oracle.com/technology/documentation/berkeley-db/ xml/intro_xml/BerkeleyDBXML-Intro.pdf (07.03.2008 20:47:34) Oracle 2008[2]: Oracle, Getting Started with Berkeley DB XML for C++. Internet: http://www.oracle.com/technology/documentation/ berkeley-db/xml/gsg_xml/cxx/BerkeleyDBXML-CXX-GSG.pdf (07.03.2008 21:03:19) Oracle 2008[3]: Oracle, Berkeley DB XML: C++ API. Internet: http: //www.oracle.com/technology/documentation/berkeley-db/xml/api_ cxx/frame.html (07.03.2008 21:17:49) Winkler 2008: Jan Winkler, XPath: Pfade bestimmen. Internet: http: //www.html-world.de/program/xpath_3.php (21.02.2008 18:43:15) Refsnes Data 2008: Refsnes Data, XPath Tutorial. Internet: http:// www.w3schools.com/xpath/ (21.02.2008 19:11:59) Gennick 2003: Jonathan Gennick, SQL in, XML out. Internet: http:// www.oracle.com/technology/oramag/oracle/03-may/o33xml.html (17.03.2008 15:32:19) Fernández Malhotra, Marsh, Nagy, Walsh 2007: Mary Fernández, Ashok Malhotra, Jonathan Marsh, Marton Nagy, Norman Walsh, XQuery 1.0 and XPath 2.0 Data Model (XDM). Internet: http://www.w3.org/ TR/xpath-datamodel/ (21.02.2008 19:02:19) Martin Planer, 5AHELI HTL Salzburg 48 Diplomarbeit XML und Datenbanken Abbildungsverzeichnis 2.1 Shredding / Publishing . . . . . . . . . . . . . . . . . . . . . . 25 2.2 Direktes Speichern der XML Dokumente in der Datenbank . . 28 2.3 XSLT Transformation bei Table-Based Mapping . . . . . . . . 31 2.4 Object-Relational Mapping . . . . . . . . . . . . . . . . . . . . 32 2.5 XQuery Abfrage einer relationalen Datenbank . . . . . . . . . 36 Martin Planer, 5AHELI HTL Salzburg 49 Diplomarbeit XML und Datenbanken Tabellenverzeichnis 2.1 CDs-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.2 Lieder-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.3 Dokumente-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . 27 2.4 Elemente-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.5 Attribute-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.6 Text-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.7 CDs-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.8 Lieder-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.9 CDs-Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Martin Planer, 5AHELI HTL Salzburg 50 Diplomarbeit XML und Datenbanken Listings 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 Ein simples Beispiel-XML . . . . . . . . . . . . . . Ein öffnendes XML-Tag . . . . . . . . . . . . . . . Ein schließendes XML-Tag . . . . . . . . . . . . . . Ein leeres, geschlossenes XML-Element . . . . . . . Ein XML-Attribut . . . . . . . . . . . . . . . . . . Eine XML-Deklaration . . . . . . . . . . . . . . . . Beispiel einer XML-Deklaration . . . . . . . . . . . Beispiel einer XML-Deklaration . . . . . . . . . . . Eine XML-Deklaration für XSD . . . . . . . . . . . Das xs:schema-Element . . . . . . . . . . . . . . . . XSD - simpleType . . . . . . . . . . . . . . . . . . XSD - complexType . . . . . . . . . . . . . . . . . XSD - Einschränkungen des Datentyps . . . . . . . XSD - Angabe der Häufigkeit . . . . . . . . . . . . XSD - Referenzen . . . . . . . . . . . . . . . . . . . Beispiel zur Erklärung von XPath-Achsen . . . . . XML-Dokument zur Veranschaulichung von XPath Simpler FLWOR-Ausdruck . . . . . . . . . . . . . . Komplexer FLWOR-Ausdruck . . . . . . . . . . . . Ein simples Beispiel-XML . . . . . . . . . . . . . . Ein simples Beispiel-XML . . . . . . . . . . . . . . Ein simples Beispiel-XML . . . . . . . . . . . . . . SQL/XML Beispiel . . . . . . . . . . . . . . . . . . SQL/XML Beispiel . . . . . . . . . . . . . . . . . . BDB XML Kommandozeile . . . . . . . . . . . . . Erzeugen eines neuen Containers . . . . . . . . . . Erzeugen eines neuen Containers . . . . . . . . . . Öffnen eines bestehenden Containers . . . . . . . . Öffnen eines bestehenden Containers - Beispiel . . . Hinzufügen von Dokumenten - Beispiel . . . . . . . Abfrage von Daten . . . . . . . . . . . . . . . . . . Martin Planer, 5AHELI HTL Salzburg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7 8 8 8 9 9 10 12 12 12 13 14 15 15 16 20 22 22 25 30 31 35 35 39 39 39 39 39 40 41 51 Diplomarbeit 2.13 2.14 2.15 2.16 2.17 2.18 2.19 2.20 2.21 2.22 2.23 2.24 2.25 2.26 XML und Datenbanken Abfrage von Daten - Beispiel . . . . Anzeigen der Ergebnisse . . . . . . XQuery-Ausdrücke in BDB XML . Einbinden der Headerdatei . . . . . Namensraum definieren . . . . . . . XmlManager erzeugen . . . . . . . XmlManager erzeugen . . . . . . . XmlUpdateContext erzeugen . . . . Einfügen von Daten . . . . . . . . . XmlQueryContext erzeugen . . . . Daten abfragen . . . . . . . . . . . Ergebnisse auslesen und ausgeben . Abfangen der XmlException . . . . Komplettes C++ Beispielprogramm Martin Planer, 5AHELI HTL Salzburg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 41 44 44 44 44 44 44 45 45 45 45 45 52