Einführung in XML - IT
Transcrição
Einführung in XML - IT
S T E I N B E I S -T R A N S F E R Z E N T R U M SOFTWARETECHNIK Einführung in XML von Prof. Dr. Manfred Dausmann Dipl.-Ing. (FH) Alexander König Stand: November 2010 STZ Softwaretechnik Prof. Dr. Goll und Partner Entennest 2 73730 Esslingen-Zell Leiter: Prof. Dr. Joachim Goll Fon: (07 11) 305 111 50 Fax: (07 11) 305 111 12 - Vorwort - Vorwort Die hier vorliegende Version des Skriptums zur Vorlesung "Einführung in XML" basiert auf Unterlagen des gleichnamigen Ferienkurses, an denen außer den Autoren auch noch Herr Stefan Burkhardt mitgearbeitet hatte. Des weiteren haben einige Studien- und Diplomarbeiten zu den Erweiterungen und Überarbeitungen des Stoffes beigetragen. Dafür möchten wir uns bei den Herren Michael Bässler, Matthias Book, Christian Feick, Elmar Kubitz, Wolfgang Langner, Stefan Schuster, Holger Steudle und Matthias Trischler ganz herzlich bedanken. Hinweise auf Fehler und Vorschläge für Verbesserungen werden gerne entgegen genommen: [email protected]. Dieses Skript "Einführung in XML" darf in seiner Gesamtheit nur zum privaten Studiengebrauch benützt werden. Das Skript ist in seiner Gesamtheit urheberrechtlich geschützt. Folglich sind Vervielfältigungen, Übersetzungen, Mikroverfilmungen, Scan-Vervielfältigungen, Verbreitungen sowie die Einspeicherung und Verarbeitung in elektronischen Systemen unzulässig. Ein darüber hinausgehender Gebrauch ist zivil- und strafrechtlich unzulässig. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -i- © Prof. J. Goll - Verzeichnisse - Inhaltsverzeichnis 1 EINLEITUNG...................................................................................................................................1 2 ENTSTEHUNG VON XML ............................................................................................................2 2.1 2.1.1 2.1.2 2.2 2.3 2.3.1 2.3.2 2.3.3 2.4 MARKUP-SPRACHEN ...................................................................................................................2 SGML ....................................................................................................................................2 HTML ....................................................................................................................................3 DAS WORLD WIDE WEB CONSORTIUM .....................................................................................5 DER XML STANDARD .................................................................................................................7 DIE XML GRAMMATIK ..........................................................................................................8 DOCUMENT TYPE DEFINITION ...............................................................................................8 KORREKTHEIT VON XML DOKUMENTEN ..............................................................................9 XML-BASIERTE SPRACHEN........................................................................................................9 3 XML DOKUMENTE .....................................................................................................................11 3.1 3.2 3.2.1 3.2.2 3.2.3 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.4 3.5 3.5.1 3.5.2 3.5.3 3.5.4 3.6 DAS SPRACHKONZEPT ..............................................................................................................11 AUFBAU VON XML DOKUMENTEN ..........................................................................................12 DER PROLOG ........................................................................................................................13 DER DOKUMENTKÖRPER......................................................................................................14 BEISPIEL: DAS ADRESSBUCH DOKUMENT ...........................................................................15 DOCUMENT TYPE DEFINITION .................................................................................................16 ELEMENTE ............................................................................................................................16 ATTRIBUTE ...........................................................................................................................18 BEISPIEL: DIE ADRESSBUCH DTD .......................................................................................19 ENTITIES ...............................................................................................................................19 DOCUMENT TYPE DEKLARATION ........................................................................................21 DIE BAUMSTRUKTUR ................................................................................................................21 NAMESPACES .............................................................................................................................23 DEFAULT-NAMENSRAUM .....................................................................................................23 NAMENSRÄUME MIT PRÄFIX ................................................................................................24 PROBLEMATIK VON NAMENSRÄUMEN .................................................................................24 DEFINITION EIGENER NAMENSRÄUME .................................................................................25 AUFTEILUNG IN PHYSISCHE EINHEITEN ..................................................................................25 4 XML PARSER UND SCHNITTSTELLEN .................................................................................26 4.1 4.1.1 4.1.2 4.2 4.3 4.3.1 4.3.2 4.3.3 4.4 4.4.1 ÜBERSICHT ................................................................................................................................26 WOHLGEFORMT VS. GÜLTIG ................................................................................................27 NICHT-VALIDIERENDE PARSER ............................................................................................27 PROGRAMMIERUNG IN JAVA ....................................................................................................28 DAS DOCUMENT OBJECT MODEL ............................................................................................29 DAS DOM PROGRAMMIERMODELL .....................................................................................29 DOM IN JAVA.......................................................................................................................31 PARSEN DES ADRESSBUCHES MIT DOM ..............................................................................32 SIMPLE API FOR XML .............................................................................................................36 DAS PROGRAMMIERMODELL VON SAX...............................................................................37 STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - ii - © Prof. J. Goll - Verzeichnisse 4.4.2 SAX IN JAVA ........................................................................................................................37 4.4.3 PARSEN DES ADRESSBUCHES MIT SAX ...............................................................................39 4.5 VERGLEICH VON DOM UND SAX ............................................................................................42 4.6 WEITERFÜHRENDE ENTWICKLUNGEN ....................................................................................42 4.6.1 SAX + DOM = SAXDOMIX ...............................................................................................42 4.6.2 DIE JDOM BIBLIOTHEK .......................................................................................................43 4.6.3 DEFERRED PARSING .............................................................................................................44 4.6.4 PULL PARSING ......................................................................................................................44 4.7 ZUSAMMENFASSUNG .................................................................................................................45 5 STYLESHEETS..............................................................................................................................46 5.1 5.1.1 5.1.2 5.1.3 5.2 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.4 5.4.1 5.4.2 5.4.3 5.4.4 5.4.5 5.4.6 5.5 5.5.1 5.5.2 5.6 5.6.1 5.6.2 5.6.3 5.6.4 5.6.5 5.6.6 5.6.7 5.6.8 DIE VORFAHREN VON XSL ......................................................................................................47 CASCADING STYLESHEETS ...................................................................................................47 DOCUMENT STYLE SEMANTICS AND SPECIFICATION LANGUAGE .......................................47 ANWENDBARKEIT VON STYLESHEETS .................................................................................47 DIE EXTENSIBLE STYLESHEET LANGUAGE ............................................................................48 XPATH .......................................................................................................................................51 PFADAUSDRÜCKE .................................................................................................................51 FILTER ..................................................................................................................................53 ACHSEN ................................................................................................................................53 FUNKTIONEN ........................................................................................................................55 XSL TRANSFORMATIONS .........................................................................................................56 DEFINITION DER TRANSFORMATIONEN................................................................................56 DEFAULT TRANSFORMATIONEN ..........................................................................................57 BEISPIEL: TRANSFORMATION DES ADRESSBUCH-DOKUMENTES.........................................58 ZUORDNUNG VON STYLESHEETS ZU DOKUMENTEN ............................................................60 FORMATIERUNG DES OUTPUT ..............................................................................................60 ZUSAMMENFASSUNG............................................................................................................61 PERFORMANCE ASPEKTE .........................................................................................................62 ÄNDERUNGEN IM STYLESHEET ............................................................................................62 XSLTC (TRANSLETS) ..........................................................................................................64 FORMATTING OBJECTS (XSL-FO) ..........................................................................................65 AUFBAU EINES FO DOKUMENTES ........................................................................................67 LAYOUTVORLAGEN ..............................................................................................................68 SEITENSTRUKTURIERUNG ....................................................................................................69 SEITENFOLGEN .....................................................................................................................71 DARSTELLUNG DES INHALTES .............................................................................................71 BEISPIEL ...............................................................................................................................72 VERFÜGBARE XSL-FO PROZESSOREN ................................................................................72 ZUSAMMENFASSUNG............................................................................................................73 6 XML SCHEMA ..............................................................................................................................74 6.1 ENTWICKLUNG VON XML SCHEMA ........................................................................................74 6.1.1 VORGÄNGER VON XML SCHEMA ........................................................................................74 6.1.2 DEFINITION VON XML SCHEMA ..........................................................................................75 6.1.3 VERGLEICH XML SCHEMA – DTD ......................................................................................76 6.2 VALIDIERUNG ÜBER XML SCHEMA DEFINITIONEN ...............................................................78 6.2.1 VALIDIERUNG DER XML SCHEMA DEFINITION ...................................................................80 6.2.2 EINBINDEN EINER SCHEMA DEFINITION IN EIN XML DOKUMENT ......................................80 6.2.3 ZUORDNUNG ZU EINEM NAMESPACE ...................................................................................81 6.3 AUFBAU EINER SCHEMA DEFINITION ......................................................................................82 STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - iii - © Prof. J. Goll - Verzeichnisse 6.3.1 DEFINITION VON ELEMENTEN ..............................................................................................82 6.3.2 VORDEFINIERTE TYPEN .......................................................................................................84 6.3.3 DEFINITION VON EINFACHEN TYPEN....................................................................................85 6.3.4 LOKALE, GLOBALE UND ANONYME TYPEN .........................................................................87 6.3.5 DEFINITION KOMPLEXER TYPEN ..........................................................................................88 6.3.6 HIERARCHIE DER ELEMENTE ...............................................................................................89 6.3.7 GESCHACHTELTE ELEMENTE UND ATTRIBUTE....................................................................91 6.3.8 KOMPLEXE TYPEN FÜR GEMISCHTEN INHALT .....................................................................92 6.3.9 ERWEITERUNGEN UND EINSCHRÄNKUNG VON KOMPLEXEN TYPEN ...................................92 6.3.10 DOKUMENTATION EINES SCHEMAS ....................................................................................92 6.4 XML SCHEMA BEISPIEL...........................................................................................................93 6.5 XML BINDING FOR JAVA .........................................................................................................95 6.5.1 ARBEITSWEISE VON JAXB...................................................................................................95 6.5.2 AUFBAU DER GENERIERTEN KLASSEN .................................................................................96 6.5.3 JAXB-API............................................................................................................................97 6.5.4 BEWERTUNG.........................................................................................................................98 6.6 ZUSAMMENFASSUNG .................................................................................................................98 7 LINKING IN XML.......................................................................................................................100 7.1 7.2 7.3 ÜBERSICHT ..............................................................................................................................100 XLINK ......................................................................................................................................101 XPOINTER................................................................................................................................102 8 WEB SERVICES ..........................................................................................................................104 8.1 8.1.1 8.1.2 8.1.3 8.2 8.2.1 8.2.2 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.5 8.5.1 8.5.2 8.5.3 8.6 8.7 8.7.1 8.7.2 8.7.3 WEB SERVICE DESCRIPTION LANGUAGE – WSDL ..............................................................105 AUFBAU EINES WSDL DOKUMENTS..................................................................................105 WSDL BEISPIEL .................................................................................................................106 WSDL FÜR DEN ECHO-SERVICE ........................................................................................108 SIMPLE OBJECT ACCESS PROTOCOL – SOAP ......................................................................109 AUFBAU EINER SOAP NACHRICHT ....................................................................................110 BEISPIELE FÜR SOAP NACHRICHTEN ................................................................................111 UNIVERSAL DESCRIPTION DISCOVERY AND INTEGRATION – UDDI ...................................113 UDDI STRUKTUREN UND SICHTEN ....................................................................................113 UDDI REGISTRIES ..............................................................................................................114 ZUGRIFF AUF UDDI ...........................................................................................................114 WEB SERVICES TOOLS ...........................................................................................................114 ALLGEMEINE ÜBERSICHT ..................................................................................................115 ÜBERSICHT ÜBER AXIS ......................................................................................................115 ENTWICKELN EIGENER WEB SERVICES ................................................................................117 VORGEHEN BEI DER BOTTOM-UP ENTWICKLUNG .............................................................118 VORGEHEN BEI DER TOP-DOWN ENTWICKLUNG ...............................................................118 VORGEHEN BEI DER ENTWICKLUNG DES CLIENTS.............................................................118 TRANSPORTPROTOKOLLE ......................................................................................................118 ZUSAMMENFASSUNG ...............................................................................................................119 EINSCHRÄNKUNGEN BEI WEB SERVICES ...........................................................................119 BEWERTUNG VON WEB SERVICES ALLGEMEIN .................................................................120 AUSBLICK ...........................................................................................................................120 9 SEMANTIC WEB.........................................................................................................................121 STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - iv - © Prof. J. Goll - Verzeichnisse 9.1 9.2 RESOURCE DESCRIPTION FRAMEWORK – RDF ...................................................................121 WEB ONTOLOGY LANGUAGE – OWL ...................................................................................121 10 ZUSAMMENFASSUNG ............................................................................................................122 10.1 VORTEILE VON XML ............................................................................................................122 10.1.1 XML HARMONIERT MIT HTML, HTTP UND WEBBROWSERN .........................................122 10.1.2 XML IST EINFACH UND PORTABEL...................................................................................122 10.1.3 XML KANN DOKUMENTE BELIEBIGER KOMPLEXITÄT ABBILDEN ...................................123 10.1.4 XML IST MEHR ALS NUR EINE AUSZEICHNUNGSSPRACHE...............................................123 10.1.5 INTERNATIONALITÄT........................................................................................................124 10.2 ANWENDUNGSFELDER FÜR XML.........................................................................................124 10.2.1 XML ALS STANDARDISIERTES DATENAUSTAUSCHFORMAT ............................................125 10.2.2 VERLAGERUNG DER RECHENLEISTUNG VOM SERVER ZUM CLIENT ................................125 10.2.3 VARIABLE DARSTELLUNG VON INFORMATIONEN ...........................................................125 10.2.4 INTELLIGENTES SUCHEN IN XML DATENBESTÄNDEN ....................................................126 10.3 AUSBLICK ..............................................................................................................................126 11 QUELLENVERZEICHNIS .......................................................................................................127 11.1 11.2 11.3 11.4 LITERATUR ............................................................................................................................127 BÜCHER..................................................................................................................................128 LINKS ZU INFORMATIONSQUELLEN .....................................................................................129 LINKS ZU SOFTWARE HERSTELLERN ..................................................................................130 12 XML TOOLS ..............................................................................................................................131 12.1 XML EDITOREN ....................................................................................................................131 12.1.1 XEENA ..............................................................................................................................131 12.1.2 MERLOT............................................................................................................................132 12.1.3 MORPHON .........................................................................................................................132 12.1.4 EPCEDIT ...........................................................................................................................133 12.1.5 WEITERE XML EDITOREN ...............................................................................................134 12.2 XML PARSER ........................................................................................................................135 12.2.1 XML4J .............................................................................................................................135 12.2.2 XERCES.............................................................................................................................135 12.2.3 JAVA API FOR XML PROCESSING ....................................................................................135 12.3 XSL TOOLS ............................................................................................................................136 12.3.1 XSLT PROZESSOREN .......................................................................................................136 12.3.2 COCOON ...........................................................................................................................137 12.3.3 XSLT EDITOREN ..............................................................................................................137 12.3.4 XSL-FO PROZESSOREN ....................................................................................................138 STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -v- © Prof. J. Goll - Verzeichnisse - Abkürzungsverzeichnis API BIPS COM CORBA DCOM CSS DOM DSSSL DTD ebXML EDI FPI FSML HDML HTML HTTP HTTPR IDL IIOP J2EE JAXB JAXP JMS MathML MIME OFX ORB OTP OWL PDF PICS PNG RDF RPC RTF SAX SDML SGML SMIL SOA SOAP SVG UDDI URI URL W3C Application Programming Interface Bank Internet Payment System Component Object Model Common Object Request Broker Architecture Distributed Component Object Model Cascading Stylesheets Document Object Model Document Style Semantics and Specification Language Document Type Definition electronic business XML Electronic Data Interchange Formal Public Identifier Financial Services Markup Language Handheld Device Markup Language Hypertext Markup Language Hypertext Transfer Protocol Hypertext Transfer Protocol Reliable Interface Definition Language Internet Inter-ORB Protocol Java2 Enterprise Edition Java API for XML Binding Java API for XML Processing Java Message Service Mathematical Markup Language Multipurpose Internet Mail Extension Open Financial Exchange Object Request Broker Open Trade Protocol Web Ontology Language Printable Document Format Platform for Internet Content Selection Portable Network Graphics Resource Description Framework Remote Procedure Call Rich Text Format Simple API for XML Parsing Signed Document Markup Language Standard Generalized Markup Language Synchronized Multimedia Integration Language Service Oriented Architecture Simple Object Access Protocol Scalable Vector Graphics Universal Description, Discovery and Integration Uniform Resource Identifier Universal Resource Location World Wide Web Consortium STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - vi - © Prof. J. Goll - Verzeichnisse WML WSDL WSIF WWW XHTML XML XQL XSD XSL XSLT XSL-FO Wireless Markup Language Web Service Description Language Web Services Invocation Framework World Wide Web XML based HTML eXtensible Markup Language XML Query Language XML Schema Definition XML Stylesheet Language XSL Transformations XSL Formatting Objects STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - vii - © Prof. J. Goll - 1. Einleitung - 1 Einleitung Die eXtensible Markup Language XML ist derzeit in aller Munde. Denn XML hat sich zu einem Standard zur Datenbeschreibung im Internet entwickelt. D.h. mit XML hat man die Möglichkeit, Daten – sei es auf Webseiten oder für unterschiedliche Anwendungen – allgemeinverständlich zu beschreiben. Viele große Unternehmen wie z.B. IBM, Sun, SAP und Microsoft bieten volle Unterstützung für das neue Datenformat. Das hat dazu beigetragen, die Bekanntheit und Verbreitung maßgeblich zu beschleunigen. Je mehr das Internet als Kommunikationsmedium genutzt wird, um so mehr werden auch XML Technologien eingesetzt, da mit XML eine neue Basis für die Integration verschiedener Partner, Prozesse und Anwendungen existiert. XML ist eine textbasierte Meta-Auszeichnungssprache, die die Beschreibung, den Austausch, die Darstellung und die Manipulation von strukturierten Daten erlaubt, so dass diese – vor allem über das Internet – von einer Vielzahl von Anwendungen genutzt werden können. XML ist "extensible", da es sich im Gegensatz zu HTML nicht um ein festes Format im Sinne einer bestimmten Auszeichnungssprache, sondern vielmehr um eine Metasprache handelt, die Vorschriften bereit stellt, eine beliebige Vielzahl konkreter Auszeichnungssprachen für die verschiedensten Arten von Dokumenten zu definieren. Neben der Unterstützung des Dokumentenaustausches ermöglicht XML allgemein die flexible Weiterverwendung von Daten und ist die Grundlage für eine Verwendung von Metadaten, was u.a. zu einer erhöhten Interoperabilität unterschiedlicher Anwendungen und mächtigen Retrievalmöglichkeiten führt. In diesem Skriptum werden zuerst die grundlegenden Eigenschaften von XML vorgestellt. Insbesondere werden dabei die Unterschiede zu HTML herausgearbeitet. Jede Anwendung, die XML Dokumente verarbeiten will, muss diese lesen, bzw. schreiben können. Hierfür wurden Schnittstellen definiert, sodass sich nicht jede einzelne Anwendung um die Details der Syntax kümmern muss. Die wichtigsten Schnittstellen, das Document Object Model (DOM) und das Simple API for XML Parsing (SAX), werden im Kapitel 4 vorgestellt. Es folgen Übersichten über zwei wichtige Standards, die sich im Umfeld von XML etabliert haben und ebenfalls das Arbeiten mit XML Dokumenten für Anwendungen vereinfachen: die eXtensible Stylesheet Language (XSL), eine Sprache zur Beschreibung des Layout von XML Dokumenten, und XML Schema, ein Vokabular mit dem Struktur und Inhalt von XML Dokumenten präzise beschrieben werden können. Die Verlinkung von Dokumenten mit Hilfe von XLink und XPointer folgt im Kapitel 7. Web Services und ihre Technologien, die alle XML-basiert sind, werden dann im Kapitel 8 vorgestellt. Das Kapitel 9 enthält die bereits geschaffenen Möglichkeiten für ein Semantisches Web, die ebenfalls XML-basiert sin. Am Schluss wird ein Ausblick auf zukünftige Entwicklungen und mögliche Anwendungsfelder für XML gegeben. Hinweise auf Tools zur Bearbeitung von XML Dokumenten und Verweise auf Informationsquellen sind dann im Anhang (ToDo) zu finden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -1- © Prof. J. Goll - 2. Entstehung von XML - 2 Entstehung von XML 2.1 Markup-Sprachen Die Markierungstechnik, die bei Markup-Sprachen eingesetzt wird, ist heute ein verbreitetes Mittel, um Daten in sequentiellen Dateien oder Streams zu strukturieren. Typischerweise sieht das so aus (hier ein Beispiel aus HTML): <HTML> <HEAD> <TITLE>Informationen zu XML</TITLE> </HEAD> <BODY> XML ist eine Markup Language. </BODY> </HTML> Wie man an obigem Beispiel erkennen kann, werden bei Markup-Sprachen bestimmte Segmente des Textes durch Anfang- und End-Marken markiert und einer bestimmten semantischen Klasse zugeordnet. Dabei können Markierungen entsprechend der verwendeten Sprache auch geschachtelt werden. Die Marken werden auch mit dem entsprechenden englischen Wort Tag bezeichnet. Um diese Tags vom restlichen Text eindeutig zu trennen, werden sie in ein "<"Zeichen und ">"-Zeichen eingeschlossen. Das führt natürlich dazu, dass man diese Zeichen, wenn man sie im normalen Text verwenden möchte, durch eine andere Zeichenfolge ersetzen muss. Hierfür wählte man die Ersatzzeichenfolgen < für "<" und > für ">", als Abkürzung für "lower than" und "greater than". Start-Tags werden in der Form <TAGNAME> notiert, End-Tags erhalten einen zusätzlichen Slash "/" nach dem "<": </TAGNAME>. 2.1.1 SGML Schon Anfang der 70er Jahre sahen sich Entwickler mit einer Vielzahl von MarkupSprachen konfrontiert, die zwar alle auf dem gleichen Prinzip basierten, aber aufgrund unterschiedlicher Marken nicht mit den gleichen Tools zu bearbeiten waren. Daraufhin entschloss man sich, eine neue Sprache zu entwickeln, die es ermöglichen sollte beliebige Markup-Sprachen zu beschreiben, welche dann möglichst mit den gleichen Tools verarbeitet werden können sollten. Da diese Sprache aus logischer Sicht eine Ebene über den mit ihr beschriebenen Sprachen liegt, spricht man hier von einer Metasprache1. 1 Das "Meta"-Prinzip ist nicht auf eine Ebene festgelegt. Zum Beispiel wäre eine Sprache, die eine Sprache beschreibt, die wiederum wieder andere Sprachen beschreibt, eine Meta-Meta-Sprache. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -2- © Prof. J. Goll - 2. Entstehung von XML Das Ergebnis dieser Entwicklungen war SGML, die Standard Generalized Markup Language. Diese wurde im Jahre 1986 schließlich als ISO-Standard (ISO-8879) verabschiedet. Nachdem SGML selbst keine vordefinierten Tags kennt, ist es nicht möglich SGML "einfach so" zur Erstellung von Dokumenten zu verwenden. Bevor man den eigentlichen Dokumenten-Inhalt angeben kann, muss erst klargestellt werden, um was für einen Dokumenten-Typ es sich handeln soll. Dazu wird am Anfang eines SGML Dokuments ein Verweis auf die zugehörige Document Type Definition (DTD) angelegt. Erst mit dieser DTD ist die verwendete Sprache definiert, das heißt kann ein Dokument validiert werden. Die dazu notwendigen Konzepte werden im Kapitel 3 vorgestellt werden. 2.1.2 HTML Die wohl bekannteste Anwendung von SGML ist die Hypertext Markup Language. Die Syntax von HTML ist wie bei allen anderen SGML Anwendungen in einer DTD festgehalten. Diese findet man zum Beispiel in der aktuellen HTML 4.01 Spezifikation auf den Seiten 263 – 311 [HTML40]. Obwohl HTML ursprünglich auch die Philosophie verfolgte, mit den Tags lediglich die Bedeutung des markierten Textes zu verdeutlichen, so wurde die Sprache durch proprietäre Erweiterungen und eigenwillige Design-Tools zur reinen Layout-Sprache umfunktioniert. So werden zum Beispiel häufig Text-Segmente mit ÜberschriftenTags versehen, damit diese im Browser mit einer größeren Schriftart dargestellt werden. Das Problematische daran ist: Suchmaschinen verwenden bevorzugt Überschriften, um Seiten nach dem Inhalt zu indizieren. Ein anderes Beispiel, wo Struktur und Optik miteinander in Konflikt kommen, ist der BLOCKQUOTE-Tag: HTML Designer verwenden ihn häufig, um einen Teil des Textes einzurücken, was beispielsweise bei einem Text-to-Speech-System dazu führen kann, dass die markierte Stelle als Zitat wiedergegeben wird, was sie ja eigentlich nicht ist. Inzwischen nutzen viele Anwendungen wie etwa Datenbanken mit HTML Frontend das WWW als Oberfläche. Allerdings geht durch die Verwendung von HTML die reiche, innere Struktur der Daten verloren. Komplexere Strukturen wie das Relationenschema einer Datenbank oder Objekthierarchien sind nicht abbildbar. Weiterhin ist es mit HTML nicht möglich, Daten semantisch auszuzeichnen, d.h. den Dokumenten Informationen über ihren Inhalt, jenseits der reinen Darstellung, mitzugeben. "Bei der Umsetzung in Web-Dokumente findet immer ein Informationsverlust statt. Bei einer über das Web abfragbaren relationalen Datenbank etwa verschwindet die auf dem Server vorhandene Strukturierung der Nutzdaten in Felder auf der Client-Seite in einem Meer von Tags. Eine Nutzung der Daten beim Betrachter, die über das Ausschneiden von Text mittels Cut & Paste hinausgeht, ist nicht mehr möglich." [Mach97]. In der folgenden Tabelle werden diese Unterschiede zwischen HTML und XML anhand eines einfachen Beispiels deutlich. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -3- © Prof. J. Goll - 2. Entstehung von XML HTML XML <P> <strong>Bosak, Jon </strong> <?xml version="1.0"?> XML, Java, and the future of the Web <ARTIKEL> </P> <AUTOR>Bosak, Jon</AUTOR> <TITEL>XML, Java, and the future of the Web </TITEL> </ARTIKEL> Tabelle 2-1: HTML versus XML Die häufig als "HTML-Dilemma" bezeichneten Defizite von HTML lassen sich wie folgt zusammenfassen [Bosa97]: 1. Erweiterbarkeit: HTML erlaubt weder das Setzen eigener Tags noch das Spezifizieren individueller Attribute zur semantischen Auszeichnung von Daten. HTML ist damit ein reines Präsentationsformat. Ein in HTML codiertes Dokument enthält nur Informationen, wie Inhalte darzustellen sind; weitergehende Informationen über die Semantik des Inhalts sind nicht abbildbar. 2. Struktur: In HTML können keine Datenstrukturen jenseits von Formatinformationen beschrieben werden. Der Zusammenhang der Daten untereinander ist nicht beschreibbar. 3. Validierung: Bei HTML fehlen Sprachspezifikationen, die den Anwendungen, die HTML-codierte Daten verarbeiten sollen, eine Überprüfung der strukturellen Validität der Daten erlauben, d.h. eine Überprüfung der Korrektheit der Struktur des Markup in HTML Dokumenten. Außerdem weist HTML noch andere Mängel auf, die den Einsatz von HTML als Markup-Sprache außerhalb eines Browsers nahezu unmöglich machen: Beispielsweise haben proprietäre Erweiterungen den Standard inzwischen weitgehend verwässert. So stand man nach mehreren Jahren der Benutzung von HTML vor dem Problem, dass andere Tools den heutigen HTML Code nicht sinnvoll interpretieren können und dass beliebige anwendungsspezifische Strukturen in HTML nicht abbildbar sind. Man erkannte, dass man die Meta-Eigenschaft von SGML auch im Web verwenden sollte, um die Sprache dem Verwendungszweck anpassen zu können und damit unter anderem auch dem Missbrauch vordefinierter Tags vorzugreifen. Allerdings ist SGML sehr komplex. Darum ist es auch keine einfache Aufgabe, SGMLverarbeitende Tools zu entwickeln. Daraufhin entschloss man sich, eine vereinfachte Version von SGML zu kreieren, die zwar gleich mächtig wie SGML, aber einfacher zu STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -4- © Prof. J. Goll - 2. Entstehung von XML verarbeiten sein sollte. Das Ergebnis dieser Bestrebungen war XML, die eXtensible Markup Language, die lediglich eine Untermenge von SGML ist2. 2.2 Das World Wide Web Consortium Um die Bedeutung von XML richtig einschätzen zu können, soll nun zuerst das Konsortium, das den Standard verabschiedet hat, vorgestellt werden, bevor auf die Syntax von XML eingegangen wird. Die Spezifikation von XML – so wie andere für XML notwendige Technologien – wurde vom World Wide Web Consortium (W3C) entwickelt. Die entsprechenden Spezifikationen werden dort auch weiter gepflegt. Abbildung 2-1: Das Logo des W3C Das W3C ist eine Institution, die im Oktober 1994 von Tim Berners-Lee (dem "Erfinder" des Web) am MIT (Massachusetts Institute of Technology) in Zusammenarbeit mit dem CERN (European Organization for Nuclear Research) gegründet wurde. 2 Während die Spezifikation von SGML weit über hundert Seiten umfasst, begnügt sich die XML Spezifikation mit 30 Seiten. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -5- © Prof. J. Goll - 2. Entstehung von XML Das W3C hat zum Ziel, Protokolle zu entwickeln, die das WWW weiter verbessern sollen. Dabei wird besonderer Wert darauf gelegt, dass alle Spezifikationen offengelegt sind, dass der neueste Stand der Technologie berücksichtigt wird und immer lauffähiger Code und Beispiele zur Verfügung gestellt werden. Bis eine Spezifikation vom W3C verabschiedet wird, muss sie mehrere Stadien durchlaufen: I. Note II. Working Draft III. Candidate Recommendation IV. Proposed Recommendation V. Recommendation Über 20 Spezifikationen haben in der Zwischenzeit das Recommendation-Stadium erreicht. Unter anderem zählen dazu: • HTML 3.2, 4.0 und 4.01 • PNG (Portable Network Graphics) • CSS1 und CSS2 (Cascading Style Sheets) • XML 1.0 • DOM (Document Object Model) • Namespaces in XML • XSLT 1.0 (XSL Transformations) Der Einfluss des W3C – also auch die Durchsetzungskraft der verabschiedeten Spezifikationen – ist sehr groß, was sich vor allem durch die immense Anzahl wichtiger Mitglieder im Konsortium begründet. Zu den inzwischen weit über 400 Mitgliedern zählen Technologiehersteller (u.a. Sun, IBM, Intel, Microsoft), Anbieter von (Web) Inhalten, Regierungen, Benutzerorganisationen und Forschungseinrichtungen. Die XML Spezifikation hat im Februar 1998 das Recommendation-Stadium erreicht. Die zugehörige Spezifikation von XML Namespaces folgte im Januar 1999. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -6- © Prof. J. Goll - 2. Entstehung von XML - 2.3 Der XML Standard Wie bereits erwähnt, ist XML lediglich eine Untermenge von SGML. Das bedeutet, dass es auch in XML keine vordefinierten Tags gibt. Genau wie in SGML muss ein Dokumententyp zuerst durch eine DTD definiert werden, bevor dazugehörige XML Files erstellt werden können. Abbildung 2-2: Beziehung zwischen SGML/XML und Anwendungen STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -7- © Prof. J. Goll - 2. Entstehung von XML - 2.3.1 Die XML Grammatik Die Syntax von XML entspricht einer vereinfachten SGML Syntax. Das W3C bezeichnet XML als "regulärer". Die Folgen für Dokumente erkennt man an einem Vergleich von XML und HTML am besten. HTML XML Es gibt Tags ohne oder mit optionalem Ende-Tag: <P> Jedes Tag muss durch ein Ende-Tag beendet werden: <P> ... </P> Attributwerte müssen nicht in Anführungszeichen stehen: <TD ALIGN=LEFT> Attributwerte müssen immer in Anführungszeichen stehen: <TD ALIGN="LEFT"> Es gibt Attribute ohne Wert: <TABLE BORDER> Jedes Attribut hat einen Wert HTML ist nicht case-sensitive XML ist case-sensitive Tabelle 2-2: Unterschiede zwischen XML und HTML Dokumenten Anfangs- und Ende-Tags, die keinen Text einschließen, können zur Vereinfachung zusammengezogen werden: <P/>. Ein solches Tag kann Attribute enthalten und kann somit außer der Struktur auch noch Bedeutung tragen. 2.3.2 Document Type Definition Wie bereits angedeutet, ermöglicht es eine Document Type Definition (DTD), eine eigene Markup-Sprache zu definieren, in der dann die eigentlichen Dokumente verfasst werden können. Die Möglichkeiten einer DTD zur Definition von Sprachelementen werden später ausführlich erläutert. Zum Grundverständnis ist es wichtig zu wissen, dass es eine DTD erlaubt, mit einer Art erweiterter Backus-Naur-Form die Struktur eines XML Dokumentes zu beschreiben. Damit liegen 2 Grammatiken vor, anhand derer die Korrektheit von XML Dokumenten überprüft werden kann: die allgemeine Grammatik für XML und die für eine spezielle XML-basierte Sprache entworfene DTD. Ein XML Dokument, das den Regeln einer bestimmten DTD genügt, ist dann ein Dokument der entsprechenden XML-basierten Sprache. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -8- © Prof. J. Goll - 2. Entstehung von XML - 2.3.3 Korrektheit von XML Dokumenten Die Tatsache, dass es möglicherweise 2 Grammatiken gibt, die bei der Prüfung der syntaktischen Korrektheit von XML Dokumenten konsultiert werden müssen, hat weitreichende Konsequenzen. Soll etwa die syntaktische Korrektheit von XML Dokumenten beurteilt werden, so wird konsequenterweise auch zwischen zwei Stufen unterschieden: Well-formed (wohlgeformt) ist ein Dokument, das: der XML Syntax genügt, genau ein Wurzelelement hat, korrekt geschachtelt ist. Die Entscheidung, ob ein Dokument well-formed ist, kann also ohne die DTD getroffen werden, wichtig sind nur die allgemeinen syntaktischen Regeln von XML selbst. Valid (gültig) ist ein Dokument, das: well-formed ist, über eine DTD verfügt, dieser DTD entspricht. Um über die Gültigkeit eines Dokumentes entscheiden zu können, muss daher eine DTD verfügbar sein. Ein gültiges Dokument muss also den zwei syntaktischen Regelwerken genügen: den allgemeinen Regeln von XML selbst und den in der DTD festgehaltenen Regeln. 2.4 XML-basierte Sprachen Die folgende unvollständige Liste zeigt, welche Bedeutung XML inzwischen bereits erreicht hat. XML-basierte Sprachen wurden praktisch in allen Anwendungsgebieten definiert, wo es um einen portablen Datenaustausch in einer heterogenen Landschaft geht. • XML Umfeld XSL (XML Stylesheet Language) XSD (XML Schema Definition) • GUI Umfeld XSL-FO (XSL Formatting Objects) XHTML (XML based HTML) SVG (Scalable Vector Graphics) SMIL (Synchronized Multimedia Integration Language) STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML -9- © Prof. J. Goll - 2. Entstehung von XML • Java Umfeld J2EE Deployment Descriptor • Web Services WSDL (Web Service Description Language) UDDI (Universal Description, Discovery and Integration) SOAP (Simple Object Access Protocol) ebXML (electronic business XML) • Financial Services FSML (Financial Services Markup Language) BIPS (Bank Internet Payment System) SDML (Signed Document Markup Language) • Divers MathML (Mathematical Markup Language) HDML (Handheld Device Markup Language) WML (Wireless Markup Language) PICS (Platform for Internet Content Selection) Von den hier aufgelisteten Sprachen spielen die meisten im Folgenden keine Rolle mehr. Nur die im XML Umfeld selbst benutzten Sprachen: XSL und XSD un die Web Service Technologien werden später in diesem Manuskript vorgestellt. Die Liste erhebt keinen Anspruch auf Vollständigkeit und soll nur die inzwischen weite Verbreitung von XML dokumentieren. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 10 - © Prof. J. Goll - 3. XML Dokumente - 3 XML Dokumente 3.1 Das Sprachkonzept XML ist eine textbasierte Meta-Auszeichnungssprache, die die Beschreibung, den Austausch, die Darstellung und die Manipulation von strukturierten Daten erlaubt, so dass diese von einer Vielzahl von Anwendungen genutzt werden können. Abbildung 3-1: Das Sprachkonzept von XML XML basiert genau wie SGML auf der Idee des strukturierten Auszeichnens von Daten. Das Grundkonzept von XML ist die Trennung von Inhalt, Struktur und Layout. XML Dokumente unterscheiden sich auf den ersten Blick nicht wesentlich von HTML Dokumenten. Auch XML Dokumente bestehen aus durch Tags ausgezeichneten Inhalten. Während die Anzahl und Benennung der Tags für HTML aber vorgegeben sind, können für XML Dokumente beliebig viele und frei ("semantisch") benannte Tags verwendet werden. Somit besteht der wesentliche Unterschied darin, dass die Tags Informationen über den Inhalt enthalten können und die Verschachtelung der Tags ineinander die Struktur der Daten abbilden kann. Die Layout-Information für die Präsentation wird aus den eigentlichen XML Dokumenten herausgezogen und in sogenannten Stylesheets definiert. Diese werden später in einem eigenen Kapitel vorgestellt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 11 - © Prof. J. Goll - 3. XML Dokumente XML unterscheidet sich in den folgenden drei Punkten grundsätzlich von HTML [Bosa97]: • • • Tags und Attribute können individuellen Anforderungen entsprechend definiert und benannt werden. Dokumentenstrukturen können in beliebiger Komplexität abgebildet werden. XML Dokumente können – müssen aber nicht – eine formale Beschreibung ihrer Grammatik enthalten. Die rechte Teil der Tabelle 2-1 beschreibt ein vollständiges XML Dokument. Die Bedeutung des Inhaltes der Tags ergibt sich aus der semantischen Auszeichnung, die Verschachtelung gibt die Struktur der Daten wieder, im Beispiel hat der Artikel einen Titel und einen Autor. Während HTML Dokumente in erster Linie beschreiben, wie der Inhalt der Tags darzustellen ist, kann ein XML Dokument Aussagen über die Bedeutung des Inhaltes enthalten. Die logische Struktur wird also von der Anordnung der Tags im Dokument bestimmt. Die in einem XML Dokument verwendeten Tags werden sozusagen als benannte Klammer verwendet, um den Inhalt der Elemente zu gliedern. Ein XML Dokument kann unabhängig von der logischen Struktur in beliebig viele physische Einheiten zerlegt werden. Allerdings müssen alle in einer physischen Einheit geöffneten Tags auch in dieser wieder geschlossen werden. Hiermit besteht die Möglichkeit, im Netzwerk verteilte XML Daten in einem XML Dokument zusammenzutragen. Der nächste Abschnitt geht nun auf die Einzelheiten des Aufbaus von XML Dokumenten ein. 3.2 Aufbau von XML Dokumenten XML Dokumente sind in zwei Bereiche gegliedert: den Prolog und den Dokumentkörper (document body). Der Prolog enthält für den Leser (im Wesentlichen ein XML Prozessor) notwendige Informationen über das Dokument. Das eigentliche Dokument befindet sich im Dokumentkörper, der also die tatsächlichen Daten enthält. Theoretisch kann am Ende auch ein Epilog folgen, der jedoch praktisch nie benutzt wird. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 12 - © Prof. J. Goll - 3. XML Dokumente - 3.2.1 Der Prolog Das erste, das man in einem XML Dokument zu lesen bekommt, ist die XML Deklaration. Diese beinhaltet die Information über die verwendete XML Version (es gibt bis jetzt nur 1.0) und den verwendeten Zeichencode. Beginnt ein Dokument mit: <?xml version="1.0" encoding="UTF-16"?> so bedeutet dies, dass es sich um ein XML Dokument der Version 1.0 handelt, das in der Unicode-Codierung UTF-16 geschrieben wurde. XML verlangt, dass alle Parser Unicode beherrschen, d.h. bei den üblichen Unicode-Codierungen (UTF-8 oder UTF-16) darf es keine Probleme geben. Die Benutzung anderer Zeichencodes ist abhängig vom gewählten Parser. Auf die Deklaration folgt die Zuordnung zum Dokumententyp: <!DOCTYPE HTML SYSTEM "XHTML.DTD"> Bei diesem Dokument handelt es sich um ein XHTML Dokument und die DTD findet sich im File XHTML.DTD. Die DTD kann an dieser Stelle auch direkt angegeben werden, allerdings ist es üblich, sie in ein *.DTD File auszulagern. Auf den Aufbau und den Inhalt einer DTD wird später eingegangen. Ein Dokument muss nicht unbedingt einer DTD zugeordnet sein, d.h. die DOCTYPE-Instruktion kann auch fehlen. Nun können noch sogenannte Processing-Instructions (in <? ... ?> eingeschlossen) folgen, die speziellen Applikationen Hinweise darüber geben können, wie das Dokument zu verarbeiten ist. Um beispielsweise ein Stylesheet einem XML Dokument zuzuordnen, kann folgende Processing-Instruction verwendet werden: <?xml-stylesheet href="mystyle.xsl" type="text/xsl" ?> Die Attribute sind vom Ziel der Processing-Instruction abhängig, das in diesem Fall xml-stylesheet bildet. Auf den Aufbau und den Inhalt von XSL Stylesheets sowie auf die Bedeutung dieser Instruktion wird später eingegangen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 13 - © Prof. J. Goll - 3. XML Dokumente - 3.2.2 Der Dokumentkörper Der Dokumentkörper besteht lediglich aus Markup und dem Text. Der Text darf enthalten: • Beliebige Zeichen aus dem Code • Entity-Referenzen wie z.B. < • Andere Zeichen mit Hilfe von Escape-Sequenzen, z.B.:   als dezimale Codierung für Leerzeichen   als hexadezimale Codierung ebenfalls für das Leerzeichen Außerdem besteht mit CDATA (character data) die Möglichkeit "uninterpretierte" Textsegmente in das Dokument zu integrieren: <![CDATA[ Alles was hier steht ist Text. Selbst >, &, <, " und ' sind hier nur Text. ]]> Die einzige verbotene Zeichenfolge in CDATA-Abschnitten ist ]]>. Mit dieser Sequenz wird der CDATA-Abschnitt beendet. Für das Markup gelten folgende Regeln: Jedes Tag muss geschlossen werden: <TAG>Text</TAG> • Attribute stehen im Anfangs-Tag und ihre Werte werden in Anführungszeichen eingeschlossen: <kapitel titel="Analyse">text</kapitel> • Auch leere Elemente haben einen Anfangs- und einen Ende-Tag, allerdings können diese zusammengeschrieben (ohne Raum für Text) werden: <IMG SRC="bild.jpg"/> Das Ende-Tag wird hier durch /> dargestellt. • Das Dokument darf lediglich ein Wurzelelement enthalten (z.B. Adressbuch im folgenden Beispiel). • Die Elemente müssen alle korrekt ineinander verschachtelt sein, es dürfen also keine Überlappungsbereiche vorhanden sein. Überall, wo im Dokument Text stehen darf, dürfen auch Kommentare stehen. Diese müssen in <!-- ... --> eingeschlossen sein und dürfen die Zeichenfolge -nicht enthalten. Beispiel: <!-- Ja, ich bin ein Kommentar --> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 14 - © Prof. J. Goll - 3. XML Dokumente - 3.2.3 Beispiel: Das Adressbuch Dokument Als Beispiel für ein XML Dokument betrachten wir ein Adressbuch-Dokument (Datei ab.xml), das etwa folgendermaßen aussehen kann: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Adressbuch SYSTEM "ab.dtd"> <?xml-stylesheet href="ab.xsl" type="text/xsl"?> <Adressbuch> <Adresse> <Name> <Anrede>Herr</Anrede> <Vorname>Max</Vorname> <Nachname>Maier</Nachname> </Name> <Telefon> <Nummer Anschluss="festnetz">0711654321</Nummer> <Nummer Anschluss="mobil">017287654321</Nummer> </Telefon> </Adresse> <Adresse> <Name> <Vorname>John</Vorname> <Nachname>Dough</Nachname> </Name> <Telefon> <Nummer Anschluss="festnetz">0711123456</Nummer> </Telefon> <Email> <Emailadresse>[email protected]</Emailadresse> <Emailadresse>[email protected]</Emailadresse> </Email> </Adresse> </Adressbuch> Der (überflüssige) Whitespace vor den Tags soll helfen, die hierarchische Struktur des Dokuments zu verdeutlichen. Da jede hierarchische Struktur als Baumstruktur dargestellt werden kann, wird durch die Einrückung auch diese Baumstruktur deutlich. Hier kann man sich nun fragen, woher denn nun die Tag-Namen kommen und welche Struktur die einzelnen Elemente haben müssen. Damit diese Fragen STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 15 - © Prof. J. Goll - 3. XML Dokumente beantwortet werden können, gibt es die sogenannte Document Type Definition (DTD). Diese kann direkt in einem XML Dokument erscheinen oder in eine Datei ausgelagert werden. Die Zuornung zu einer DTD erfolgt in einer DOCTYPE-Definition im Prolog eines Dokumentes. Im Beispiel wird definiert, dass die zugehörige DTD in der Datei ab.dtd zu finden ist und das Wurzelelement den Namen Adressbuch hat. 3.3 Document Type Definition Wie bereits angedeutet, ermöglicht es eine DTD, eine eigene Markup-Sprache zu definieren, in der dann wiederum XML Dokumente verfasst werden können. In einer DTD werden mit Hilfe einer erweiterten Backus-Naur-Form beschrieben, wie der Dokumentkörper eines XML Dokumentes aufgebaut sein muss, also welche TagNamen erlaubt sind, welche Elemente wie geschachtelt sein dürfen, welche Elemente welche Attribute haben dürfen, etc. Im Folgenden werden nun die Möglichkeiten zur Definition von XML Dokumenten erläutert. 3.3.1 Elemente Das entscheidende Strukturprinzip in XML bilden die Elemente. Ein Element wird über seinen Namen identifiziert und hat einen definierten Inhalt: <!ELEMENT Name Inhalt> Der Inhalt eines Elements kann aus einer Kombinationen von anderen Elementen und/oder Text bestehen oder leer sein. Es existieren mehrere Möglichkeiten der Kombination: • Sequenz <!ELEMENT Nachricht (Absender, Empfänger, Nachrichtentext)> Eine Nachricht ist zusammengesetzt aus Absenderinformation Empfängerinformation gefolgt vom Nachrichtentext. • gefolgt von Option <!ELEMENT Nachrichtentext (Betreff?, Textkörper)> Das Element Nachrichtentext kann ein Betreff-Element vor dem Textkörper aufnehmen. • Alternative <!ELEMENT Block (PARA | TABLE | IMG)> Ein Block besteht entweder aus einem Absatz oder einer Tabelle oder einem Bild. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 16 - © Prof. J. Goll - 3. XML Dokumente • Iteration <!ELEMENT Liste (Name, Item+)> Eine Liste hat einen Namen und enthält mindestens ein Item. <!ELEMENT Bus (Fahrgast*)> Ein Bus kann beliebig viele (also auch keine) Fahrgäste aufnehmen. • Text-Inhalt <!ELEMENT Name (#PCDATA)> Das Element Name enthält lediglich Text (PCDATA steht für parsable character data). • gemischter Inhalt <!ELEMENT PARA (#PCDATA | I | B | A)*> Ein Abschnitt kann in beliebiger Reihenfolge Text, kursiv-markierten Text1, fettmarkierten Text2 oder Links3 enthalten. • beliebiger Inhalt <!ELEMENT Divers ANY> • leere Elemente <!ELEMENT BR EMPTY> Die Tag-Namen (Element-Namen) können frei gewählt werden, um die semantische Bedeutung (des Inhalts) eines Elementes dem Leser zu verdeutlichen. Es gibt nur wenige Regeln, die die Bildung von Namen einschränken: - Namen müssen mit Buchstaben oder mit dem Zeichen "_" beginnen. - Danach können Buchstaben, Ziffern oder die Zeichen "_", "-" und "." kommen. - Leerzeichen und Doppelpunkt sind in Namen nicht erlaubt. - Namen dürfen nicht mit der Zeichenfolge "xml" beginnen, auch nicht in Großbuchstaben oder gemischt geschrieben. Diesen Regeln müssen alle Namen, die in einem XML Dokument möglich sind, genügen, also nicht nur Tag-Namen sondern beispielsweise auch Attribut-, Entityund Namespace-Namen. Groß- und Kleinschreibung wird bei XML unterschieden, sodass tag und Tag unterschiedliche Namen für ein Element darstellen. Wenn aber beispielsweise diese beiden Schreibweisen durch eine DTD ermöglicht würden, würde sicher bei 1 <I> steht in HTML für italic. <B> steht in HTML für bold. 3 Mit <A> werden in HTML Web-Links markiert. 2 STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 17 - © Prof. J. Goll - 3. XML Dokumente menschlichen Lesern eines entsprechenden Instanzdokumentes Konfusion entstehen. Bei der Wahl der Namen sollte man also immer davon ausgehen, dass es sowohl maschinelle Leser (Applikationen) aber auch menschliche Leser von XML Dokumenten geben kann. 3.3.2 Attribute Elemente in XML können jedoch nicht nur einen Inhalt haben: zusätzlich besteht die Möglichkeit, sie mit Attributen zu versehen. In der DTD wird dies dadurch definiert, dass einem Element Attributlisten zugewiesen werden. <!ATTLIST Bus Fahrzeugtyp Kennzeichen CDATA CDATA #IMPLIED #REQUIRED> ATTLIST steht hier als Abkürzung für Attributliste. Ein Bus hat also das Attribut Fahrzeugtyp, welches in einem XML Dokument angegeben werden kann (IMPLIED), und das Attribut Kennzeichen, das angegeben werden muss (REQUIRED). Beide Attribute können beliebige Strings (CDATA steht für character data) als Wert annehmen. <!ATTLIST Fahrgast id ID #REQUIRED stammkunde (ja|nein) "nein"> Das Attribut vom Typ ID hat in XML eine besondere Bedeutung: keine ID eines Fahrgast-Elements darf den gleichen Wert haben wie die ID irgend eines anderen Fahrgast-Elements. Diese Eigenschaft wird auch vom Parser überprüft. Ein solches Attribut spielt damit die Rolle eines eindeutigen Schlüssels (vergleichbar mit einem Primärschlüssel) und kann beim Suchen und Navigieren entsprechend ausgenutzt werden. Für IDs gelten die gleichen Regeln für den Aufbau wie bei Namen, siehe 3.3.1. Das Attribut Stammkunde ist ein Aufzählungstyp und kann die Werte "ja" oder "nein" annehmen. Wird dieses Attribut bei einem Fahrgast-Element nicht explizit angegeben, so ist sein Wert als "nein" anzusehen. Bei Attribut-Deklarationen wird CDATA (character data) angegeben im Gegensatz zu PCDATA bei Element-Deklarationen. PCDATA steht für parsable character data. Im Gegensatz zu PCDATA wird CDATA nicht mehr vom Parser analysiert. Dadurch werden innerhalb von CDATA keine Markup-Zeichen wie spitze Klammern erkannt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 18 - © Prof. J. Goll - 3. XML Dokumente - 3.3.3 Beispiel: Die Adressbuch DTD Das folgende Beispiel soll die Struktur eines Adressbuches beschreiben. Ein Beispieldokument war in 3.2.3 bereits zu sehen. Die Adressen innerhalb des Adressbuches sollen ein Namens-, ein Telefon- und optional ein Emailsegment haben. Mit der Information aus dem vorherigen Abschnitt sollte die DTD eigentlich leicht zu verstehen sein. Die DTD für das Adressbuch (zu finden in der Datei ab.dtd): <!ELEMENT Adressbuch (Adresse)*> <!ELEMENT Adresse (Name, Telefon, (Email)?)> <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT Name ((Anrede)?, (Vorname)?, Nachname)> Anrede (#PCDATA)> Vorname (#PCDATA)> Nachname (#PCDATA)> <!ELEMENT Telefon (Nummer)+> <!ELEMENT Nummer (#PCDATA)> <!ATTLIST Nummer Anschluss (mobil|festnetz) #REQUIRED> <!ELEMENT Email (Emailadresse)+> <!ELEMENT Emailadresse (#PCDATA)> 3.3.4 Entities Entities können in der DTD definiert und dann in einem XML Dokument über &Entityname; referenziert werden. Beim Parsen des XML Dokumentes wird diese Referenz durch den in der DTD angegebenen Text ersetzt. Eine Entity-Definition in der DTD sieht aus wie folgt: <!ENTITY SW "Softwaretechnik"> Diese Entity kann dann im XML Dokument z.B. so verwendet werden: <PERSON>Hans Müller, Studiengang: &SW;</PERSON> Der Begriff Entity wird in XML in einer etwas untypischen Art verwendet und sollte nicht mit anderen bekannten Bedeutungen aus der Informatik (beispielsweise dem E/R-Modell) assoziiert werden. Entities in XML entsprechen eher dem #define in C oder anderen sogenannten Makromechanismen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 19 - © Prof. J. Goll - 3. XML Dokumente - Es gibt eine Reihe von Standard-Entities, die immer verfügbar sind, also nicht definiert werden müssen: • < < (less than) • > > (greater than) • & & (ampersand) • ' ' (apostrophe) • " " (quotation mark) Diese Entities (built-in entities) werden häufig gebraucht, da die entsprechenden Zeichen in der XML Syntax eine besondere Rolle spielen. Will man ein Zeichen in ein Dokument einfügen, das schwierig zu schreiben ist, kann man dies ebenfalls über den Entity-Mechanismus tun: © bedeutet, dass das Zeichen mit der Nummer 169 aus dem im Prolog angegebenen Code – im Unicode wäre das also © – eingefügt wird (character entity). Die oben bereits vorgestellten allgemeinen Entities (general entities) können prinzipiell beliebig groß sein und können insbesondere auch XML Fragmente enthalten. Es gelten allerdings ein paar Bedingungen: der String muss wohlgeformt sein und darf keinen Bezug auf sich selbst beinhalten. Um große Strings, die durch ein Entity repräsentiert werden sollen, auch außerhalb des Dokumentes unterzubringen, gibt es noch die sogenannten externen Entities (external entities): Sie verweisen auf Dateien im System (SYSTEM mit Dateinamen) oder im Web (PUBLIC mit Dateinamen und URI). Das folgende Beispiel zeigt den ersten Fall, die Entity adressen steht für das komplette Adressbuch: <ENTITY adressen SYSTEM "ab.xml"> Auch hier gilt natürlich die Forderung, dass der Inhalt der Datei wohlgeformt sein muss. Ein validierender Parser wird das prüfen, und den Inhalt der Datei an der Stelle einfügen, wo die Entity (im Beispiel durch &adressen;) referenziert wird. Nicht-validierende Parser brauchen das nicht zu tun, sie müssen externe Entities noch nicht einmal ersetzen! Soll der Inhalt eines externen Entities nicht geprüft werden, weil beispielsweise eine Binärdatei, etwa ein Bild, eingefügt werden soll, dann kann das durch den Zusatz NDATA (Notation Data) gekennzeichnet werden. Ein Parser wird dann die externe Entity nicht prüfen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 20 - © Prof. J. Goll - 3. XML Dokumente - Weiterhin gibt es noch Parameter-Entities, die in der DTD selbst referenziert werden können. Die bisherigen Entities waren ja als Abkürzungen für Texte gedacht, die im eigentlichen XML Dokument stehen sollen. Parameter-Entities und ihre Verwendung müssen bei Bedarf nachgeschlagen werden. 3.3.5 Document Type Deklaration Im Adressbuchbeispiel war die Document Type Deklaration zu sehen. Hier wurde die DTD in einer externen Datei gehalten. Sie hatte die Form: <!DOCTYPE Adressbuch SYSTEM "ab.dtd"> Es wird dabei das Wurzelelement angegeben und hinter SYSTEM steht eine URL, die es erlaubt auf die DTD zuzugreifen. In diesem Falle war es eine lokale Datei. In manchen Fällen kann es sinnvoll sein, die DTD direkt in das XML Dokument mit einzuschließen, beispielsweise wenn Dokumente verschickt werden, um den zusätzlichen Zugriff auf die DTD zu vermeiden. Hier hat dann die DOCTYPE Deklaration die Form: <!DOCTYPE Adressbuch [...]> und zwischen den eckigen Klammern stehen die Element- und Attributdefinitionen usw., also die gesamte DTD. Eine weitere Möglichkeit bietet sich für "öffentliche" DTDs: <!DOCTYPE Adressbuch PUBLIC "W3C//DTD XHTML 1.0 Strict//EN"> Hinter PUBLIC steht ein sogenannter Formal Public Identfier (FPI), der die DTD identifizieren muss. Da hierbei keine Möglichkeit besteht auf die DTD zuzugreifen, muss ein validierender Parser diese DTD kennen, d.h. sie muss in seinem Code bereits vorhanden sein. 3.4 Die Baumstruktur Ein XML Dokument besitzt immer eine baumartige Struktur, die bei einem eindeutigen Wurzelelement beginnt. Diese Struktur wurde beim Adressbuch-Beispiel im vorangegangenen Abschnitt durch Einrückungen hervorgehoben. Diese Struktur, die im Wesentlichen durch die Schachtelung der Tags gegeben ist, kann auch graphisch als Baumstruktur gezeichnet oder im Speicher aufgebaut werden (DOM Baum, siehe Kapitel 4). Der eigentliche Text sowie die Attribute eines Elementes werden ebenfalls als Knoten in diesen Baum aufgenommen und mit dem entsprechenden Element als Vaterknoten verknüpft. Text- und Attributknoten sind STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 21 - © Prof. J. Goll - 3. XML Dokumente immer Blätter in dieser Baumstruktur. Sie werden von den Elementknoten im folgenden Bild durch Form, bzw. Farbe unterschieden. Das folgende Bild zeigt das Adressbuch-Beispiel in dieser Baumdarstellung. Abbildung 3-2: Das XML Dokument als Baum STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 22 - © Prof. J. Goll - 3. XML Dokumente - 3.5 Namespaces Die Flexibilität von XML kann allerdings Probleme mit sich bringen: Will man mehrere Tag-Sets in einem Dokument verwenden, so kann es zu Kollisionen zwischen den Element- und Attributnamen der verwendeten Sprachen kommen. Beispielsweise werden in XSL Transformationen (siehe Kapitel 5) 3 verschiedene Tag-Sets (oder Vokabulare) benutzt: das Quell- und das Zielvokabular, sowie das Vokabular von XSL. Dieses Problem wurde früh erkannt und am 14. Januar 1999 verabschiedete das W3C die Recommendation Namespaces in XML. Mit dem Namespace-Konzept wird es möglich, entweder einzelne Tags oder ganze Segmente in einem Dokument einem Namensraum zuzuordnen. Die Wahl des Namensraumes wird mit dem Attribut xmlns (Abkürzung für XML NameSpace) getroffen. Der Namensraum an sich wird in Form eines URI (Uniform Resource Identifier) angegeben. Die Wahl gilt für das Element, dem das Attribut zugeordnet ist, und alle untergeordneten Tags. Damit können auch Teile eines Dokumentes unterschiedlichen Namensräumen zugeordnet werden. D.h. ein durch ein xmlnsAttribut eingeführter Namensraum, kann schon bei dem Element selbst, bei dem das Attribut steht, und in dem kompletten dazugehörigen Unterbaum benutzt werden. Man unterscheidet zwei verschiedene Formen, je nachdem ob man einen Präfix einführt, der den Namensraum kennzeichnet, oder ob generell alle Namen einem Default-Namensraum zugeordnet werden. Allerdings hat die Benutzung von Namespaces auch Probleme, die am Ende dieses Kapitels angesprochen werden. 3.5.1 Default-Namensraum Werden Element- oder Attributnamen ohne Zusatz benutzt (wie es in allen bisherigen Beispielen der Fall war), dann gehören diese Namen zum Default-Namensraum. Ohne weitere Angabe ist das der lokale Namensraum, der beispielsweise durch die DTD gegeben ist. Dieser Default-Namensraum kann aber auch für einzelne Teile eines XML Dokumentes geändert werden. Es folgt ein Beispiel für Namespace Defaulting, d.h. es wird ein Namensraum gewählt (hier der von HTML), dem alle untergeordneten Tags per Default zugeordnet werden. Die Verwendung von Tags wie beispielsweise <head> oder <title> wird damit zulässig. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 23 - © Prof. J. Goll - 3. XML Dokumente - <?xml version="1.0"?> <html xmlns="http://www.w3.org/TR/REC-html40"> <head> <title>XML Namespaces></title> </head> <body> XML Namespaces Recommendation, siehe <a href="http://www.w3.org/TR/2006/REC-xml-names-20060816"> hier. </a> </body> </html> 3.5.2 Namensräume mit Präfix Alternativ besteht auch die Möglichkeit bestimmte Namensräume einem Präfix zuzuordnen, das dann bei Tags in der Form <präfix:tagname> eingesetzt werden kann. Das wird in folgendem Beispiel gezeigt: <?xml version="1.0"?> <buch xmlns:isbn="urn:ISBN:0-395-36341-6"> <titel>Es ist schön</titel> <autor>Hans Dampf</autor> <isbn:number>1234567890</isbn:number> <preis>20.-</preis> </buch> Während die Tags ohne Präfix hier aus dem Default-Namensraum stammen, ist number dem isbn-Namensraum entnommen. Da der Default-Namensraum nicht festgelegt wurde, sind die Tags ohne Präfix dem lokalen Namensraum entnommen. Das Attribut xmlns kann auch mehrfach bei einem Element auftreten. So können dann über verschiedene Präfixe auch mehrere Namensräume parallel verwendet werden. 3.5.3 Problematik von Namensräumen Ein Namensraum wird nur durch eine URI bestimmt. Was sich dahinter verbirgt, ist jedoch nicht weiter festgelegt. Es kann sich dort eine DTD, eine einfache Tag- und Attributsnamensliste oder ein Textdokument mit einer verbalen Beschreibung befinden, es kann aber auch gar nichts dort sein. Ein Parser ist deswegen nicht in der Lage, Informationen über den Namespace zu beziehen, da gar nicht geklärt ist, welche Art von Information einen Namespace STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 24 - © Prof. J. Goll - 3. XML Dokumente beschreibt. Selbst wenn dies klar wäre, bräuchte man beim Parsen eine offene Internetverbindung, um auf die Information zuzugreifen. Wenn man also mit Namensräumen arbeitet, kann die Gültigkeit eines Dokumentes nur noch eingeschränkt geprüft werden. Die meisten Parser bieten Schalter an, mit denen eingestellt werden kann, ob überhaupt Namensräume beachtet werden oder nicht. Betrachtet man Namensräume, die vom W3C selbst definiert wurden, dann kann man diese Problematik beispielhaft studieren. Die Beispiele werden im Verlauf dieses Manuskripts noch auftauchen: Das W3C hat Namensräume im Zusammenhang mit XSL und XML Schema definiert. Die entsprechenden URIs sind: http://www.w3.org/1999/XSL/Transform bzw. http://www.w3.org/2001/XMLSchema. Gibt man diese URIs in einem Browser an, erhält man einen kleinen Text angezeigt mit Links auf wichtige Informationen im Zusammenhang mit XSLT, bzw. mit XML Schema. Das Auftreten dieser Namespaces veranlaßt einen Parser nun keineswegs auf diese URI zuzugreifen. Wenn er auf Schema-Validierung eingestellt ist, prüft er diese URI und die Versionsangabe, ob diese Informationen mit seinem Code zur Behandlung von Schema-Definitionen übereinstimmen. Ähnlich für XSL Prozessoren: sie enthalten bereits den Code zur Interpretation der XSL Anweisungen. In beiden Fällen erlauben die Präfixe jeweils ein schnelles Finden der für die jeweiligen Prozessoren vorgesehenen Tags. 3.5.4 Definition eigener Namensräume Die Recommendation für die XML Namenspaces wurde nach der XML Spezifikation, in der auch die DTDs spezifiziert werden, verabschiedet. DTDs sind daher mit Namespaces inkompatibel. Erst mit Schema-Definitionen, die in einem eigenen Kapitel später noch behandelt werden, wird es möglich, eigene Namensräume zu definieren und sich in Instanzdokumenten darauf zu beziehen. Hinweise dazu sind in dem entsprechenden Kapitel zu finden. 3.6 Aufteilung in physische Einheiten ToDo STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 25 - © Prof. J. Goll - 4. XML Parser - 4 XML Parser und Schnittstellen Soll sich XML als Standard durchsetzen, so müssen natürlich möglichst viele Applikationen XML verstehen und XML nutzen, um Dokumente zu speichern. XML Dokumente zu verstehen bedeutet, die Struktur eines XML Dokumentes zu erkennen und den Inhalt zu lesen. Das Erkennen einer Struktur erledigt in der Regel ein sogenannter Parser, wie er beispielsweise auch in Compilern für Programmiersprachen enthalten ist. Damit nicht jeder Entwickler einen eigenen XML Parser schreiben muss, hat man sich entschlossen, Standard-Schnittstellen, also Application Programming Interfaces (APIs), zu XML Parsern zu definieren. Das W3C hat hier das Document Object Model (DOM) geschaffen, was allerdings für einfache Applikationen ein zu komplexes Interface darstellen kann. Aus diesem Grund wurde in der XML-dev-Mailing-Liste [XMLdev] ein alternativer Standard entwickelt, der zwar vom W3C unabhängig ist, sich aber trotzdem als de-facto Standard durchgesetzt hat. Um die Einfachheit dieses API hervorzuheben wurde sie Simple API for XML (SAX) getauft. Von beiden APIs gibt es in der Zwischenzeit Version 2, auf die sich die folgenden Ausführungen beziehen. Generell gilt, dass diese APIs Programmiersprachen-unabhängig definiert wurden. Die Benutzung der APIs in einer bestimmten Programmiersprache wird durch sogenannte Bindings geregelt. In diesem Skript wird Java als Programmiersprache gewählt. Das ist nicht zufällig, sondern Java und XML bilden ein Tandem, was die Programmierung im Internet betrifft: Java sorgt für den portablen Code und XML für die Portabilität von Daten. Nach der Übersicht über die Parsingmechanismen wird daher Java API for XML Processing (JAXP) vorgestellt, das heute am häufigsten benutzte Paket mit XML Schnittstellen für Java, das zuerst nur in der J2EE Plattform verfügbar war, seit Version 1.4 aber zur Standardprogrammierumgebung von Java, dem JDK (Java Development Kit), gehört. 4.1 Übersicht Ein XML Parser ist ein XML Prozessor, der einen XML Stream, beispielsweise eine XML Datei, lesen kann und eine geeignete Repräsentation dieser Daten für andere Anwendungen erzeugen kann. Die Anwendung erhält Zugriff auf die XML Daten über definierte Schnittstellen, sogenannte APIs (Application Programming Interfaces). STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 26 - © Prof. J. Goll - 4. XML Parser - XML Applikation XML Parser API XML Dokument Abbildung 4-1: Lesen von XML Dokumenten 4.1.1 Wohlgeformt vs. Gültig Generell muss man bei allen Parsern noch unterscheiden, auf Grund welcher Syntax sie entscheiden, ob ein Dokument korrekt ist oder nicht. Es wurde ja bereits erwähnt, dass es im Allgemeinen zwei Grammatiken gibt, die für ein XML Dokument gelten können: die Grammatik für XML selbst und die DTD für eine bestimmte XML-basierte Sprache. Hier wurden schon die Begriffe wohlgeformt (well-formed) und gültig (valid) eingeführt. Daran anlehnend spricht man im Bereich der XML Parser von einem validierenden Parser, wenn er neben der XML Grammatik auch noch die Gültigkeit eines Dokumentes bezüglich seiner DTD überprüft. Ein nicht-validierender Parser prüft nur die Wohlgeformtheit des Dokumentes, also nur die XML Grammatik. XML Dokumente, die nicht wohlgeformt sind, können in der Regel nicht verarbeitet werden. Wenn statt DTDs zukünftig XML Schema Definitionen, die später noch erläutert werden, zur Spezifikation von XML Dokumenten benutzt werden, dann können Parser prüfen, ob ein gegebenes XML Dokument mit dem Schema übereinstimmt (Schema Validation). Bei den meisten Parsern kann der Level der Prüfungen eingestellt werden. 4.1.2 Nicht-validierende Parser Die Benutzung eines nicht-validierenden Parsers, bzw. das Ausschalten der Validierung, kann einige wichtige Konsequenzen nach sich ziehen. Zum Beispiel braucht ein solcher Parser die sogenannten externen Entities (siehe 3.3.1) nicht zu lesen, er muss nur der Anwendung mitteilen, dass er welche gesehen hat. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 27 - © Prof. J. Goll - 4. XML Parser Informationen, die in der externen Entity spezifiziert werden, sind damit nicht für die Anwendung zugreifbar. Der Grund für dieses Verhalten ist, dass ein XML Browser Entity Referenzen nutzen kann, um symbolhaft die Existenz einer externen Entity anzuzeigen, aber nicht die external entity selbst anzeigen muss. Man denke hier einfach an einen Link als externe Entity. Validierende und nicht-validierende Parser unterscheiden sich natürlich auch deutlich in der Performanz. Die heutigen in der Praxis eingesetzten Parser erlauben daher, die Validierung gemäß einer DTD über einen Schalter an- bzw. abzuschalten. Damit kann die Anwendung entscheiden, ob das Dokument validiert werden muss, oder ob dieser Vorgang überflüssig ist, wenn beispielsweise das Dokument von einer vertrauenswürdigen Quelle stammt. Vertrauenswürdig heißt in diesem Falle, dass sichergestellt ist, dass die Quelle nur gültige Dokumente erstellt. 4.2 Programmierung in Java In der Regel stellen alle Parser-Hersteller Java-APIs zur Verfügung. Im Bereich von DOM und SAX sind diese APIs standardisiert, was in den folgenden Kapiteln dargestellt wird. Die Benutzung und Konfiguration der Parser war jedoch häufig unterschiedlich. SUN hat mit dem Java API for XML Processing (JAXP) einen Standard innerhalb der Java Plattform geschaffen. Seit der Version 1.4 ist JAXP Bestandteil des JDK. Unter http://java.sun.com/xml/jaxp ist die Spezifikation und auch ein Tutorial verfügbar, mit dessen Hilfe die Benutzung der API klar wird. JAXP stellt einen Plugging-Layer zur Verfügung, der es erlaubt, SAX und DOM Parser, sowie XSLT Prozessoren zu integrieren. Daneben gibt es die Standard-APIs zum Zugriff auf den DOM Baum und die SAX Events. JAXP bietet einen Factory-Mechanismus an, um eine entsprechende Parser-Instanz zu erzeugen, die dann im weiteren Verlauf einer Applikation genutzt werden kann. Neben JAXP gehören noch weitere APIs zum JDK, die das Arbeiten mit XML Daten erleichtern, wie etwa JAXB, dem Java API for XML Binding, das später noch vorgestellt wird, JAXR, dem Java API for XML Registries, das im Zusammenhang mit Webservices beispielsweise gebraucht wird, sowie JAXM (Java API for XML Messaging) und JAX-RPC (Java API for XML-based RPC), die im Zusammenhang mit der XML-basierten Kommunikation zum Einsatz kommen können. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 28 - © Prof. J. Goll - 4. XML Parser - 4.3 Das Document Object Model Beim Document Object Model (DOM) handelt es sich nicht nur um ein ParserInterface sondern um eine komplette Schnittstelle für den Umgang mit XML Dokumenten. Bei DOM werden XML Dokumente in einer Baumstruktur (DOM Baum) repräsentiert. Diese Repräsentation ist aber nicht direkt verfügbar, sondern es gibt ein Application Programming Interface (API) mit den Schnittstellen um auf die Baumstruktur zuzugreifen. Das DOM API (Level 2) ermöglicht: Navigation in XML Dokumenten Ändern von Knoten Erzeugen von neuen Knoten Einfügen von Knoten Löschen von Knoten Die Knoten des DOM Baums werden als Objekte, die ein spezifisches Verhalten und eine Identität haben, dargestellt. DOM spezifiziert wie XML Dokumente als Objekte modelliert werden, welche Objekte es gibt, und welche Methoden für den Zugriff auf diese Objekte zur Verfügung stehen. Da die Spezifikation von DOM Plattform- und Programmiersprachen-unabhängig sein sollte, wählte man die Interface Definition Language (IDL) der Object Management Group (OMG), die auch vom Thema CORBA her bekannt sein dürfte. DOM Level 3 wird noch mehr Funktionalität bieten. Allerdings haben noch nicht alle Teile den Recommendation Status erreicht. DOM Level 3 Core hat seit April 2004 den Status einer W3C Recommendation. Die Recommendation für das Load-andSave Modul wurde im April 2007 verabschiedet. Damit stehen nun auch standardisierte Methoden bereit, die das Serialisieren (Speichern) von DOM Bäumen in Form von XML Dokumenten unterstützen und umgekehrt. 4.3.1 Das DOM Programmiermodell Die folgende Abbildung zeigt das Verhältnis der beteiligten Komponenten beim Arbeiten mit dem DOM. In dem zugrunde liegenden Programmiermodell liest ein DOM Parser das ganze XML Dokument ein und stellt es intern als Baumstruktur dar. Die Applikation erhält Zugriff auf die Wurzel des Dokumentes und kann dann über die Methoden des API mit dem Dokument arbeiten. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 29 - © Prof. J. Goll - 4. XML Parser - Abbildung 4-2: Zusammenspiel Parser/DOM/Applikation Mit den Methoden kann auch das Dokument verändert werden, bzw. ein ganz neues XML Dokument kann von einer Applikation im Arbeitsspeicher erzeugt werden. Dies erfordert, dass am Ende die Baumdarstellung wiederum in eine Textform gewandelt und in einer Datei, bzw. einem Stream, gespeichert werden muss. Man spricht auch vom Serialisieren eines Dokumentes. Diese Aufgabe ist eng mit dem Parsen verwandt, die entsprechende Komponente heißt im Englischen Renderer. Häufig STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 30 - © Prof. J. Goll - 4. XML Parser werden Parser und Renderer nicht unterschieden und man redet, wie auch im Bild zu sehen, von einem DOM Parser, der beide Aufgaben zu bewältigen hat. 4.3.2 DOM in Java Die für die Verwendung von DOM notwendigen Interfaces befinden sich in dem Java Package org.w3c.dom. Um eine Parserinstanz anlegen zu können, müssen zusätzliche Klassen aus dem JAXP Package importiert werden (javax.xml.parsers). In dem zugrunde liegenden Programmiermodell liest ein DOM Parser das ganze Dokument ein und gibt dann ein Objekt vom Typ Document zurück, an dem der komplette DOM Baum hängt. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); Document mydoc = parser.parse(args[0]); Document ist wie die meisten Interfaces in DOM von Node (=Knoten) abgeleitet. Die verknüpften Nodes bilden den DOM Baum. Das Node-Interface bietet z.B. folgende Methoden an: o java.lang.String getNodeName() gibt den Element-Namen zurück. o short getNodeType() gibt den Typ eines Knotens zurück, z.B.: ATTRIBUTE_NODE, COMMENT_NODE, ELEMENT_NODE, TEXT_NODE. o java.lang.String getPrefix() gibt das Namespace-Präfix zurück, null wenn keines angegeben wurde. o boolean hasChildNodes() prüft auf Vorhandensein von Kind-Knoten. o NodeList getChildNotes() gibt eine Liste mit den Kind-Knoten zurück. o boolean hasAttributes() prüft auf Vorhandensein von Attribut-Knoten. o NamedNodeMap getAttributes() gibt eine Liste (auf deren Elemente über Strings zugegriffen werden kann) mit den Attribut-Knoten zurück. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 31 - © Prof. J. Goll - 4. XML Parser - o java.lang.String getNodeValue() gibt den Wert eines Knotens zurück, hängt vom Knoten-Typ ab, z.B. wird bei TEXT_NODE der Text zurückgeliefert. Zusätzlich zu Node kennt DOM auch (von Node abgeleitete) Interfaces entsprechend den XML Sprachelementen (z.B. Element, Document, Entity, ProcessingInstruction, etc.). Diese bieten zusätzliche Methoden, die eben nur für den jeweiligen Knotentyp zulässig sind. Um diese erweiterten Interfaces zu nutzen, muss man das Node-Objekt in die entsprechende Klasse "casten", nachdem man z.B. mit getNodeType() geprüft hat, dass es sich um den entsprechenden Typ handelt. Mit der bis jetzt erläuterten Funktionalität kann man den ganzen DOM Baum durchlaufen und evaluieren. Zusätzlich gibt es viele Möglichkeiten, einen DOM Baum zu verändern und zu erweitern. Folgende Methodenliste (wieder Methoden des Node-Interface) gibt einen Überblick über die Einsatzmöglichkeiten: o Node appendChild(Node newChild) fügt einen neuen Kind-Knoten zum betreffenden Knoten hinzu. o Node insertBefore(Node newChild, Node refChild) fügt den neuen Knoten an der Position vor dem Referenz-Knoten ein. o Node removeChild(Node oldChild) entfernt einen Kind-Knoten. o void setNodeValue(java.lang.String nodeValue) ermöglicht es den Wert (=Text) eines Knotens zu ändern. o void setPrefix(java.lang.String prefix) setzt den Namespace für den Knoten. 4.3.3 Parsen des Adressbuches mit DOM Das folgende DOM Beispiel ist direkt auf die in der Adressbuch-DTD spezifizierten Dokumenten-Struktur zugeschnitten. Der abgedruckte Code bildet lediglich den DOM-relevanten Teil der Applikation. Die Klassen Adressbuch, Adresse, Telefon und Email entsprechen den XML Elementen der DTD. Es gibt keine Klasse Name, da Anrede, Vorname und Nachname als Member-Variablen von Adresse modelliert wurden. Ein Adressbuch enthält eine Liste von Adressen. Eine Adresse wiederum enthält eine Liste von Telefonnummern und Emailadressen. Die Elemente dieser Listen lassen sich jeweils über die Methoden addAdresse(), addTelefon() und addEmail() zur entsprechenden Liste hinzufügen. Alle Klassen verfügen jeweils über eine Methode print(), die die relevanten Informationen zu den Objekten ausgibt und die print()-Methode der tiefergelegenen Objekte triggert. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 32 - © Prof. J. Goll - 4. XML Parser Der folgende Code startet in der main()-Methode den Parser und "baut" dann ein Applikations-spezifisches Objekt-Modell mit den oben angegebenen Klassen nach, während er (depth-first) mit den DOM-Methoden durch den vom Parser erzeugten Baum (mydoc) wandert. import org.w3c.dom.*; import javax.xml.parsers.* public class AbDOM{ public static Email analyzeEmail(Node node) { Email email = new Email(); email.setAdr(node.getFirstChild().getNodeValue()); return email; } public static Telefon analyzeTelefon(Node node) { Telefon tel = new Telefon(); tel.setNummer(node.getFirstChild().getNodeValue()); return tel; } public static Adresse analyzeAdresse(Node node) { Adresse adr = new Adresse(); for (int i=0; i<node.getChildNodes().getLength(); i++) { Node child=node.getChildNodes().item(i); if (child.getNodeType()==Node.ELEMENT_NODE) { if (child.getNodeName().equals("Name")) { for (int t=0; t<child.getChildNodes().getLength(); t++) { Node subchild=child.getChildNodes().item(t); STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 33 - © Prof. J. Goll - 4. XML Parser if (subchild.getNodeName().equals("Anrede")) adr.setAnrede(subchild.getFirstChild().getNodeValue()); if (subchild.getNodeName().equals("Nachname")) adr.setName(subchild.getFirstChild().getNodeValue()); if (subchild.getNodeName().equals("Vorname")) adr.setVorname(subchild.getFirstChild().getNodeValue()); } } if (child.getNodeName().equals("Email")) { for (int t=0; t<child.getChildNodes().getLength(); t++) { Node subchild=child.getChildNodes().item(t); if (subchild.getNodeType()==Node.ELEMENT_NODE) { adr.addEmail(analyzeEmail(subchild)); } } } if (child.getNodeName().equals("Telefon")) { for (int t=0; t<child.getChildNodes().getLength(); t++) { Node subchild=child.getChildNodes().item(t); if (subchild.getNodeType()==Node.ELEMENT_NODE) { adr.addTelefon(analyzeTelefon(subchild)); } } } } } return adr; } STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 34 - © Prof. J. Goll - 4. XML Parser public static Adressbuch analyzeAdressbuch(Node node) { Adressbuch adrbuch = new Adressbuch(); for (int i=0; i<node.getChildNodes().getLength(); i++) { Node child=node.getChildNodes().item(i); if (child.getNodeType()==Node.ELEMENT_NODE) adrbuch.addAdresse(analyzeAdresse(child)); } return adrbuch; } public static void analyzeDocument(Document doc) { Adressbuch myAdr; for (int i=0; i<doc.getChildNodes().getLength(); i++) { Node child=doc.getChildNodes().item(i); if (child.getNodeType()==Node.ELEMENT_NODE) { myAdr=analyzeAdressbuch(child); System.out.println("Adressbuch:"); myAdr.print(); } } } public static void main(String args[]) throws Exception { /* Parser instanzieren */ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); /* File parsen - Baum-Aufbau */ Document mydoc = parser.parse(args[0]); /* Applikations-spezifische Routine aufrufen analyzeDocument(mydoc); } } STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 35 - © Prof. J. Goll - 4. XML Parser - Die Ausgabe des Programms bietet nicht viel Aufklärung, da die print()-Methoden hier nicht abgedruckt sind (die Java-Quellen sind im Verzeichnis mit den Adressbuch-Beispielen komplett enthalten). Trotzdem sei sie der Vollständigkeit wegen und um das erfolgreiche Parsen bzw. Wandern durch den Baum zu demonstrieren aufgeführt: Adressbuch: Adresse Nr.0 Anrede: Herr, Name: Maier, Vorname: Max Telefon: 0711654321 Telefon: 017287654321 Adresse Nr.1 Anrede: null, Name: Dough, Vorname: John Telefon: 0711123456 Email: [email protected] Email: [email protected] 4.4 Simple API for XML Die Simple API for XML (SAX) ist wie der Name sagt eine einfache API zur Verarbeitung von XML Dokumenten. Sie hebt sich von dem Modell DOM in sofern ab, als dass sie lediglich ein eventbasiertes Framework zum Einlesen und Verarbeiten von XML Dokumenten darstellt. SAX stellt eine API zur Verfügung, mit deren Hilfe eine Applikation auf Ereignisse, die der Parser beim Parse-Vorgang ausgibt, reagieren kann. Solche Ereignisse können beispielsweise sein: • • • • • • • Öffnendes Tag wurde gefunden. Schließendes Tag wurde gefunden. PCDATA (Parsable Character Data) wurde gefunden. CDATA (Character Data) wurde gefunden. Processing Instruction wurde gefunden. Kommentar wurde gefunden. Entity Deklaration wurde gefunden. SAX bietet keine Möglichkeit zum Navigieren in einem XML Dokument oder zu dessen Modifikation. Daher ist dieses Programmiermodell nur beschränkt einsetzbar. Die Vorteile von SAX liegen in seiner Einfachheit. Es ist einfach zu programmieren und verbraucht sehr wenig Speicher und ist daher speziell zum Einlesen und Validieren von großen Dokumenten geeignet, da es nicht wie DOM einen Baum des XML Dokuments im Speicher aufbaut. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 36 - © Prof. J. Goll - 4. XML Parser - 4.4.1 Das Programmiermodell von SAX Die Simple API for XML (SAX) arbeitet Event-basiert, d.h. während der Parser das File analysiert, benachrichtigt er die Applikation durch Ereignisse über gefundene Tags, Text, etc. Abbildung 4-3: Funktionsweise eines SAX Parsers 4.4.2 SAX in Java Die für die Verwendung eines SAX Parsers notwendigen Klassen importiert man über die Standardpackages: import org.xml.sax.*; import org.xml.sax.helpers.*; Die SAX Events werden in Java selbstverständlich über Methodenaufrufe an die Applikation übermittelt. Um dies zu ermöglichen, muss die Applikation einen eigenen Handler anbieten, der von org.xml.sax.helpers.DefaultHandler abgeleitet wird. Diese Klasse bietet z.B. die folgenden Methoden an, die von der Handlerklasse der Applikation überschrieben werden können, wenn die Applikation auf die entsprechenden Ereignisse reagieren möchte. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 37 - © Prof. J. Goll - 4. XML Parser Die wichtigsten Methoden von DefaultHandler sind: o void startDocument() wird vom Parser zum Beginn des Lesens aufgerufen. o void endDocument() signalisiert, dass das Ende des Dokuments erreicht wurde. o void startElement(java.lang.String uri, java.lang.String localName, java.lang.String qName, Attributes attributes) signalisiert das Start-Tag eines Elements. Der Parser übergibt über die Parameter folgende Informationen an die Anwendung: Namespace (uri), Tag-Name ohne (localName) und mit Präfix (qName) sowie die Attributliste. o void endElement( java.lang.String uri, java.lang.String localName, java.lang.String qName) signalisiert das End-Tag eines Elements. Die Parameter haben die gleiche Bedeutung wie bei startElement(). o void characters(char[] ch, int start, int length) wird beim Auftreten von Text im Dokument vom Parser aufgerufen. Der Text wird im Array ch an der Stelle start mit der Länge length übergeben. Der eigentliche Parser ist eine Instanz von org.xml.sax.XMLReader. Bei dieser Klasse handelt es sich natürlich nur um ein Interface, die Klasse des ParserHerstellers befindet sich also in einem anderen Package. Um den Applikations-Code von Parser-spezifischem Code freizuhalten, wurde die Parser-Factory eingeführt, mit der es möglich wird, den gewünschten Parser als String anzugeben. XMLReader Parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); Dem so instanzierten Parser muss nun über setContentHandler() eine Referenz auf eine Instanz des Applikations-spezifischen Handlers gegeben werden. Danach kann der Parser über die Methode parse() entweder auf einen Stream oder eine Ressource (über deren URI) angesetzt werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 38 - © Prof. J. Goll - 4. XML Parser - 4.4.3 Parsen des Adressbuches mit SAX Es folgt nun ein kleines, aber vollständiges SAX Beispiel. Die Tag-Namen werden hier nicht berücksichtigt, weshalb es sich hier also nicht um eine Adressbuchspezifische Anwendung handelt. Als erstes soll die Handlerklasse betrachtet werden. Der Handler gibt für Start- und End-Tags sowie für dazwischen stehenden Text Informationen auf der Konsole aus. Zusätzlich werden die Tags entsprechend der Dokumenten-Struktur eingerückt, hierzu dient die zusätzliche Methode recalcOutBuffer(). /* File: AbSAXHandler.java */ import java.lang.*; import org.xml.sax.*; import org.xml.sax.helpers.*; public class AbSAXHandler extends DefaultHandler { String space = new String(" int indent = 0; String outBuffer = new String(""); "); private void recalcOutBuffer() { if (indent>0) { outBuffer= new String(space.substring(0, indent*3)); } else outBuffer = new String(""); } public void startElement(java.lang.String uri, java.lang.String localName, java.lang.String qName, Attributes attributes) { System.out.println(outBuffer + "[TAG-BEGIN] "+ qName); indent++; recalcOutBuffer(); } public void endElement(java.lang.String uri, java.lang.String localName, java.lang.String qName) { indent--; recalcOutBuffer(); System.out.println(outBuffer + "[ TAG-END ] "+ qName); } STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 39 - © Prof. J. Goll - 4. XML Parser public void characters(char[] ch, int start, int length) { String data = new String(ch, start, length); data=data.trim(); if (data.length()>0) System.out.println(outBuffer + "[ DATA ] "+ data); } } Die eigentliche Applikation entspricht in ihrer Struktur einer typischen SAX Anwendung: /* File: AbSAXApp.java */ import org.xml.sax.*; import org.xml.sax.helpers.*; public class AbSAXApp { public static void main(String args[]) throws Exception { /* Parser instanzieren */ XMLReader Parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); /* Handler instanzieren */ AbSAXHandler Handler = new AbSAXHandler(); /* Handler dem Parser als ContentHandler bekannt machen. */ Parser.setContentHandler(Handler); /* Parsen starten. */ Parser.parse("file:" + args[0]); } } Wird diese Applikation nun gestartet mit: java AbSAXApp ab.xml und verarbeitet in diesem Fall das File ab.xml aus Kapitel 3, so erhalten wir folgende Ausgabe: STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 40 - © Prof. J. Goll - 4. XML Parser [TAG-BEGIN] Adressbuch [TAG-BEGIN] Adresse [TAG-BEGIN] Name [TAG-BEGIN] Anrede [ DATA ] Herr [ TAG-END ] Anrede [TAG-BEGIN] Vorname [ DATA ] Max [ TAG-END ] Vorname [TAG-BEGIN] Nachname [ DATA ] Maier [ TAG-END ] Nachname [ TAG-END ] Name [TAG-BEGIN] Telefon [TAG-BEGIN] Nummer [ DATA ] 0711654321 [ TAG-END ] Nummer [TAG-BEGIN] Nummer [ DATA ] 017287654321 [ TAG-END ] Nummer [ TAG-END ] Telefon [ TAG-END ] Adresse [TAG-BEGIN] Adresse [TAG-BEGIN] Name [TAG-BEGIN] Vorname [ DATA ] John [ TAG-END ] Vorname [TAG-BEGIN] Nachname [ DATA ] Dough [ TAG-END ] Nachname [ TAG-END ] Name [TAG-BEGIN] Telefon [TAG-BEGIN] Nummer [ DATA ] 0711123456 [ TAG-END ] Nummer [ TAG-END ] Telefon [TAG-BEGIN] Email [TAG-BEGIN] Emailadresse [ DATA ] [email protected] [ TAG-END ] Emailadresse [TAG-BEGIN] Emailadresse [ DATA ] [email protected] [ TAG-END ] Emailadresse [ TAG-END ] Email [ TAG-END ] Adresse [ TAG-END ] Adressbuch STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 41 - © Prof. J. Goll - 4. XML Parser - 4.5 Vergleich von DOM und SAX Interessiert man sich für die Struktur von Dokumenten oder möchte man diese gar verändern, so erweist sich SAX als extrem umständlich. Für Applikationen, die jedoch relativ einfach strukturierte XML Dokumente verarbeiten sollen, bringt SAX auch Vorteile: • Da der Parse-Baum nicht aufgebaut wird, wird auch kaum Speicher verbraucht. • SAX kann daher auch sehr große Dokumente parsen. • Durch das Event-Modell und das Speicher-Handling ist das Parsen von XML Streams möglich. • Wie der Name sagt, ist die Schnittstelle bei SAX sehr einfach und darum leicht anzuwenden. DOM ist offensichtlich deutlich mächtiger als SAX: diese Schnittstelle unterstützt Navigieren, Verarbeiten und Aufbau von XML Bäumen. Der Umgang mit DOM erfordert darum auch mehr Aufwand als ein einfacher SAX Handler. Es hängt also von der Problemstellung ab, welcher Parser zum Einsatz kommen sollte. Anmerkung: Die DOM Parser selbst verwenden meistens einen SAX Parser zur Erstellung des DOM Baums. 4.6 Weiterführende Entwicklungen 4.6.1 SAX + DOM = SAXDOMIX SAXDOMIX ist ein neu ins Leben gerufenes Open-Source Framework, das die beiden API’s von SAX und DOM kombiniert anwendet. Es vereint sozusagen die Vorteile der objektorientierten Verarbeitung von DOM und der schnellen, ereignisgesteuerten Verarbeitung von SAX. Das SAXDOMIX Framework enthält spezielle Klassen und Packages, die beide API’s sinnvoll kombinieren. Das Ziel dieses Projektes ist es, die Verarbeitung von XML-Dokumenten weiter zu vereinfachen und flexibler zu gestalten. Das Prinzip von SAXDOMIX ist am besten an Hand eines kleinen Beispiels zu erklären. Es soll eine große Menge an Datensätzen in einem XML Dokument sortiert verarbeitet und gezählt werden. Für das Zählen wäre in unserem Beispiel SAX prädestiniert, für das Sortieren hingegen DOM. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 42 - © Prof. J. Goll - 4. XML Parser SAXDOMIX geht nun folgendermaßen vor: Mit Hilfe von SAX wird ein minimaler DOM Baum aufgebaut, der genau soviele Informationen enthält, wie für das Sortieren notwendig ist. Dies stellt nur einen kleinen Teil des tatsächlichen Dokumentes dar, lässt sich daher schnell verarbeiten und benötigt nur wenig Speicher. Ein weiterer Vorteil dabei ist, dass SAXDOMIX während des Parsens auf weitere Informationen zugreifen kann, wie zum Beispiel das Elternelement, was SAX alleine nicht könnte. Der Vorteil besteht nun darin, dass anhand des Elternelements die Elementinformationen geholt werden können und mit Hilfe dieser Zusatzinformationen entschieden werden kann, ob weitere Teile des Dokumentes geholt werden müssen. Diese können dann temporär für eine spätere Verwendung im Speicher abgelegt werden. Wenn die zusätzlichen gespeicherten Informationen im weiteren Verlauf nicht mehr benötigt wird, kann das Objekt wieder aus dem Speicher gelöscht und somit Ressourcen freigegeben werden. Eine Verarbeitung auf diese Weise ist in diesem Anwendungsfall bedeutend schneller, wie die Verwendung von nur einer Parse-Methode. Durch die neue Verarbeitungsmethode von SAXDOMIX besteht die Möglichkeit komplexe XML Dokumente effizient und schnell verarbeiten zu können. Durch das Zusammenlegen der API’s kann genauer implementiert werden, was Ressourcen und Verarbeitungszeit schont. Weiter Informationen und die Implementation zu SAXDOMIX sind unter der WebAdresse: http://www.devsphere.com/xml/saxdomix/ zu finden. Ein Performancevergleich zwischen SAX, DOM und SAXDOMIX ist unter der WebAdresse: http://www.devsphere.com/xml/benchmark/ zu finden. 4.6.2 Die JDOM Bibliothek Die Autoren des JDOM Projektes waren der Ansicht, dass es noch keine Java nahe, bzw. auf Java optimierte API zur XML Bearbeitung gibt, die zugleich einfach und doch leistungsfähig ist. JDOM ist keine Erweiterung oder eine weitere Abstraktionsebene für SAX und DOM, auch wenn es diese selbstverständlich unterstützt. Das JDOM Projekt will eine einfache, aber doch leistungsfähige Bibliothek zur Verfügung stellen, um XML zu verarbeiten und zu erzeugen. Dieses Ziel scheint recht gut erreicht zu sein, wie man der steigenden Verbreitung, der wachsenden Artikelanzahl zu dem Produkt und den Kommentaren auf der Homepage des Projektes entnehmen kann. Die Webadresse dieser Homepage ist: http://www.jdom.org/ STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 43 - © Prof. J. Goll - 4. XML Parser - 4.6.3 Deferred Parsing Deferred Parsing bezeichnet das verzögerte (aufgeschobene) Parsen des XML Dokuments. Dabei wird vom XML Dokument ein Baum aufgebaut, jedoch wird nur der jeweils benötigte Teil geparst. Es ist praktisch identisch mit der Vorgehensweise bei SAXDOMIX. Das Ziel dieser Ansätze ist eine universellere Baumschnittstelle zu schaffen, die ein einfaches Bearbeiten auch größerer XML Dokumente ermöglicht. Beim Xerces Parser wird es bei der nächsten Version möglich sein DOM in einem "deferred" Modus zu betreiben. Dabei wird der Baum nicht vollständig aufgebaut, sondern die entsprechenden Teile erst bei Bedarf geparst. Jedoch ist dies noch in der Entwicklung und wenig dokumentiert. Weitere Informationen zu Xerces sind zu finden unter der Webadresse von Apache: http://xml.apache.org/xerces2-j/. 4.6.4 Pull Parsing Vom Ziel her ist das sogenannte Pull Parsing vergleichbar mit dem Deferred Parsing: es soll nur das geparst werden, was wirklich notwendig ist. Der Begriff Pull Parsing rührt daher, dass der Parser "gezogen" (pull) werden muss, um etwas zu tun. Bei SAX startet man den Parser, der dann mit einem Event sagt, was er geparst hat. Man könnte auch sagen, man "push"t den Parser, der die komplette Kontrolle erhält und sich bei der Applikation über ein Event meldet. Im Gegensatz dazu sagt man dem Pull Parser, was man als nächstes gern haben möchte. Der Zwischenbereich kann dann vom Parser übersprungen werden. Während man mit einem SAX Parser zwar den Rest eines Dokumentes ungeparst lassen kann, wenn man sein Ergebnis gefunden hat, kann man mit einem Pull Parser auch Teilbäume zwischendrin überspringen, wenn man weiß, dass darin das gesuchte Ergebnis garantiert nicht zu finden ist. Beim Pull Parser XPP gibt es die Möglichkeit einen Baum des XML Dokumentes aufzubauen. Dabei wird ein spezielle Schnittstelle des XPP verwendet, die nicht zu DOM kompatibel ist. Anstatt der Verwendung von newNode() bei der XmlPullParserFactory wird newPullNode() verwendet. Dadurch wird der Aufbau des Baumes verzögert und erfolgt erst bei Bedarf. Weitere Informationen zu XPP und dem Pull-Parsing sind zu finden unter der Webadresse: http://www.extreme.indiana.edu/xgws/xsoap/xpp/. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 44 - © Prof. J. Goll - 4. XML Parser - 4.7 Zusammenfassung Im Rahmen einer Studienarbeit [BäLa02] wurde ein Performancevergleich verschiedener Parsemethoden für XML durchgeführt. Um dieses Ziel zu erreichen wurden verschiedene, typische Aufgabenstellungen (Applikationsszenarien) definiert und mit Hilfe der Parsemethoden DOM und SAX sowie der neuen Methode des Pull Parsens mit XPP iimplementiert. Anhand dessen wurde der Performancevergleich durchgeführt um die verschiedenen Parser zu vergleichen und die neue Pull Methode einzuordnen. Nach der Auswertung der Testresultate wurde deutlich, dass der Pull Parser seine Vorteile klar bei der Verarbeitung kleiner Dokumente hat. Wegen seiner geringen Bibliotheksgröße ist er daher besonders gut für Handys und Kleingeräte (Palm) geeignet. Werden dagegen sehr große Dokumente verarbeitet, ist SAX derzeit die beste Lösung. Muss mit einem XML Dokument gearbeitet (Einfügen, Löschen, Ändern) werden, ist DOM die am besten geeignete Methode. Die wohl effizienteste Verarbeitung wäre ein Mittelweg aus den dargestellten Methoden. In der Studienarbeit wurde auch festgestellt, dass die freie Wahl einer Parserimplementation nicht immer gegeben ist. Denn es gibt starke Unterschiede darin, was einzelne Parser vom XML Standard unterstützen. Daher kann nicht immer auf den performantesten Parser zurückgegriffen werden, wenn beispielsweise bei komplexen Dokumenten die Konformität zum Standard wichtiger ist. Derzeit sind viele Ansätze für einen Mittelweg zwischen DOM und SAX in der Entwicklung. Denn die Industrie hat klar erkannt, dass dieser Schritt notwendig ist um XML weitere Einsatzgebiete zu eröffnen. Beispielprojekte hierfür sind das erwähnte SAXDOMIX, aber auch Xerces deferred und XPP XMLPullNode. Es wird interessant sein zu beobachten, welcher der Ansätze sich in Zukunft durchsetzen wird. Ein weiterer Ansatz, der in eine ganz andere Richtung geht, sind die sogenannten XML Bindings, die in einem späteren Kapitel ausführlicher vorgestellt werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 45 - © Prof. J. Goll - 5. Stylesheets - 5 Stylesheets Wer mit XML Dokumenten arbeitet, steht häufig vor dem Problem, die in dem Dokument enthaltenen Daten zu visualisieren, oder sie in ein anderes Format zu transformieren. Speziell für diesen Prozess der Transformation bzw. Formatierung wurde das Stylesheet Konzept entwickelt. Dieses Konzept sieht vor, spezielle Formatierungs- bzw. Transformationsregeln für Elemente eines XML Dokuments in einem Stylesheet vorzuhalten. Ein Stylesheet Prozessor kann dann mit Hilfe dieses Stylesheets das XML Dokument in eine andere Form umwandeln (z.B. HTML). Abbildung 5-1: Das Stylesheet Konzept Mit XSL der eXtensible Stylesheet Language hat das W3C einen einheitlichen Standard für XML Stylesheets vorgelegt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 46 - © Prof. J. Goll - 5. Stylesheets - 5.1 Die Vorfahren von XSL Wie XML selbst, so hat auch XSL seine Vorgänger: die Cascading Stylesheets (CSS) und die Document Style Semantics and Specification Language (DSSSL). 5.1.1 Cascading Stylesheets Die Cascading Stylesheets (CSS) waren eine Reaktion des W3C auf die zunehmende Aufweichung des HTML Standards. Ursprünglich wurden sie für HTML entwickelt, und sollten Webdesignern ermöglichen, wieder semantisch korrekte HTML Dokumente zu schreiben und sie über CSS trotzdem "hübsch" darzustellen. Die Möglichkeiten von CSS1/2 sind jedoch sehr eingeschränkt: • Es handelt sich um eine reine Layout-Sprache. • Ein Element wird auf genau ein Layout-Objekt abgebildet. • Löschen, Umgruppieren, Sortieren von Elementen ist nicht möglich. • Es basiert auf einem simplen kasten-orientierten Formatierungs-Modell. Es ist zu erwarten, dass mit dem Ende von HTML auch die Cascading Stylesheets an Bedeutung verlieren, obwohl sie auch für XML anwendbar sind. Der Umstieg auf XSL dürfte sich allerdings einfach gestalten: CSS sind leicht in XSL Stylesheets übersetzbar (auch automatisch). 5.1.2 Document Style Semantics and Specification Language Die Document Style Semantics and Specification Language (DSSSL) wurde als Layout-Sprache für SGML Dokumente entwickelt. Wie SGML selbst, so wurde auch DSSSL zu einem ISO-Standard. Da DSSSL für SGML entwickelt wurde, ist es natürlich (aufgrund der Untermengen-Beziehung) auch XML-fähig. DSSSL ist sehr mächtig, basiert allerdings auf Scheme1 und ist darum wie Scheme selbst sehr kompliziert. 5.1.3 Anwendbarkeit von Stylesheets Die folgende Abbildung zeigt beispielhaft, welche Art von Stylesheets auf welche Art von Dokumenten anwendbar ist. 1 Scheme ist ein Nachfahre von LISP, einer funktionalen Programmiersprache, die Anfang der 60er Jahre am MIT entwickelt wurde. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 47 - © Prof. J. Goll - 5. Stylesheets - Abbildung 5-2. Die Anwendbarkeit von Stylesheets auf Dokumente D.h. auf XML als Untermenge von SGML sind alle oben genannten Arten von Stylesheets anwendbar. Wie bereits erwähnt haben Cascading Stylesheets in der Praxis immer noch eine Bedeutung, da sie im HTML Umfeld eingesetzt werden und daher einem breiten Personenkreis bekannt sind. Im Folgenden wird aber nur noch auf die XML Stylesheet Language eingegangen. 5.2 Die eXtensible Stylesheet Language Die eXtensible Stylesheet Language (XSL) wurde speziell für XML entwickelt, sogar die Stylesheets selbst sind XML Dokumente. Die Transformation wird über Template-Regeln, die im Stylesheet formuliert werden, bewerkstelligt. Mögliche Ausgabeformate einer XSL Transformation sind z.B. XML selbst, also eine andere XML-basierte Sprache, HTML aber auch RTF oder TeX – im Prinzip kann es auch beliebiger Text sein. Der Gewinn durch die Trennung von Inhalt und Layout-Information ist die Möglichkeit, über verschiedene Stylesheets dasselbe XML Dokument auf unterschiedliche Ausgabevarianten abzubilden, wie im folgenden Bild zu sehen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 48 - © Prof. J. Goll - 5. Stylesheets - Abbildung 5-3. Mehrere Abbildungen eines Dokumentes Es ist also nicht nötig die Information redundant in mehreren Dokumenten vorzuhalten, nur das XML Dokument muss gewartet werden. XSL hat gegenüber CSS den Vorteil, dass es transformieren kann, d.h. Elemente mehrmals an verschiedenen Positionen verwenden kann, Reihenfolgen vertauschen kann, oder auch Verzeichnisse erstellen kann. XSL ist eine Sprache zum Erstellen von Stylesheets. XSL besteht aus drei Komponenten: STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 49 - © Prof. J. Goll - 5. Stylesheets • XSL Transformations (XSLT), einer Sprache mit der Transformationen von XML Dokumenten beschrieben werden, • XML Path Language (XPath), einer Sprache zur Formulierung von Ausdrücken, die es gestatten auf Elemente in XML Dokumenten Bezug zu nehmen, bzw. diese Elemente zu adressieren, • XSL Formatting Objects (XSL-FO), ein Vokabular zur Spezifikation von Layout. XSLT und XPath wurden in eigenen Spezifikationen definiert, da ihre Anwendungsmöglichkeiten über XSL, also die Definition von Stylesheets hinausgehen. Die Formatting Objects werden in der XSL Spezifikation mit definiert. Ein XSL Stylesheet ist ein XML Dokument, das spezifiziert, wie eine Klasse von XML Dokumenten dargestellt werden soll, indem beschrieben wird, wie ein XML Dokument dieser Klasse transformiert wird in ein anderes XML Dokument, das nun aber das Formatierungs-Vokabular benutzt. XSL ist vergleichbar mit CSS2, die Syntax aber ist unterschiedlich. Das XSL-FO Vokabular wurde entworfen im Hinblick darauf, dass XML Dokumente auf einer Vielzahl von Medien (Bildschirm, Papier, Sprache ...) dargestellt werden können. Um die vielfältigen Möglichkeiten von XSL-FO zu nutzen, muss ein Formatter (z.B. ein Browser für XML Dokumente oder ein Übersetzer nach PDF) dieses Vokabular natürlich kennen. Im Folgenden wird zuerst XPath vorgestellt und dann XSLT, das auf XPath basiert. Anschließend wird auf XSL-FO eingegangen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 50 - © Prof. J. Goll - 5. Stylesheets - 5.3 XPath Beim Design der Working-Drafts von XPointer und XSL stellte man fest, dass man für beide Spezifikationen eine Möglichkeit zur Adressierung von Lokationen in XML Dokumenten brauchen würde. Um hier zu einem einheitlichen Standard zu kommen, wurde XPath, die XML Path Language, am 16. November 1999 in einer gesonderten W3C-Recommendation manifestiert. XPath wird nun in XSLT, XPointer und XQL (einer Anfragesprache für XML Dokumente) eingesetzt. Mit XPath kann man Lokationen in XML Dokumenten beschreiben und den XML Baum mit Pfadausdrücken traversieren. Diese Pfadausdrücke können zwar sehr umfangreichen werden, im Normalfall aber ist es möglich das Gewünschte sehr kurz zu formulieren. XPath bezieht sich auf XML Dokumente in ihrer Baumstruktur. Dabei existieren wie im DOM Modell folgende Knotentypen: • Wurzelknoten • Elementknoten • Textknoten • Attributknoten • Namespace-Knoten • Processing-Instruction-Knoten • Kommentarknoten Außerdem kennt XPath einen Kontext: der aktuelle Knoten stellt den Kontext für relative Pfadausdrücke dar. 5.3.1 Pfadausdrücke Man unterscheidet zwei Arten von Pfadausdrücken: absolute und relative. Ein Vergleich mit Dateinamen in Filesystemen, beispielsweise dem von UNIX, kann dabei sehr hilfreich sein. Absolute Pfadausdrücke können • mit / beginnen, d.h. an der Wurzel des Baumes beginnen, • oder über id("123") einen Knoten mit einer bestimmten ID im Dokument auswählen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 51 - © Prof. J. Goll - 5. Stylesheets - Relative Pfadausdrücke können z.B. • Elemente über elementname • Attribute über @attributname • den aktuellen Knoten über . • den Elternknoten über .. • sonstige Knoten über (ToDo: prüfen) text() comment() node() processing-instruction() in Relation zum aktuellen Knoten, also dem Kontext, referenzieren. Pfadausdrücke können (ähnlich wie Pfade in Filesystemen) auch zusammengesetzt werden: /Adressbuch/Adresse/Name/@Nachname ../title Erweiterte Pfadausdrücke ermöglichen es Zwischenebenen zu vernachlässigen, d.h. beliebig viele Ebenen zu überspringen: //Vorname book//author Adressbuch//Nummer Mit Hilfe dieser Pfadausdrücke ist es möglich eine Menge von Knoten (keinen, einen oder mehrere) in einem XML Dokument zu bestimmen. Pfadausdrücke können über | (oder) verbunden werden, was bedeutet, dass die jeweiligen Knotenmengen der Einzelausdrücke vereinigt werden. book | journal Das sind also Elementknoten mit den Namen book oder journal. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 52 - © Prof. J. Goll - 5. Stylesheets - 5.3.2 Filter XPath unterstützt auch verschiedene Filter, um die Menge der selektierten Knoten zu reduzieren. Filter können • auf das Vorhandensein eines Attributes prüfen: article[@version] article[@*] • auf das Vorhandensein eines Elementes prüfen: book[editor] book[*] • Vergleiche evaluieren: article[@language='en'] article[author='Hans Dampf'] book[@year>=2000] • mehrere Filter kombinieren: article[author='Hans Dampf'][@year='2000'] • Funktionsaufrufe evaluieren: (ToDo: prüfen) //Adresse/Email/Emailadresse[position()!=last()] //book//para[contains(text(), 'alles') and not(contains(text(), 'gut'))] Zu beachten ist die Schreibweise mit dem einfachen Apostroph ('). Er muss deswegen benutzt werden, da die XPath Ausdrücke häufig als Attributwerte stehen, die ja dann mit dem Doppelapostroph (") gekennzeichnet sind. 5.3.3 Achsen Bei der Auswertung von XPath Ausdrücken spielen die Achsen eine wichtige Rolle. Sie wurden in den bisherigen Beispielen auch schon – allerdings in einer einfachen Schreibweise – benutzt. Damit waren die oben gezeigten Formulierungen sehr eingängig und vergleichbar mit UNIX Dateinamen. Die Schreibweise von XPath Ausdrücken wird allerdings ein wenig komplexer, wenn man verschiedene Achsen explizit selbst auswählen will. Es folgt nun die Auflistung aller Achsen, die XPath kennt. • self (der Kontextknoten selbst) • child (alle direkten Kinder – direkte Nachkommen – des Kontextknotens) • parent (der Vaterknoten des Kontextknotens) • ancestor (die Vorfahren des Kontextknotens, rekursiv) STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 53 - © Prof. J. Goll - 5. Stylesheets • ancestor-or-self (wie ancestor, sowie der Kontextknoten selbst) • descendant (alle Nachkommen des Kontextknotens, rekursiv) • descendant-or-self (wie descendant, sowie der Kontextknoten selbst) • following (die auf das Ende-Tag des Kontextknotens folgenden Knoten) • following-sibling Geschwisterknoten) • preceding (die vor dem Beginn-Tag des Kontextknotens stehenden Knoten) • preceding-sibling Geschwisterknoten) • attribute (die Attributknoten des Kontextknotens) • namespace (alle Namensräume, die am Kontextknoten verfügbar sind) (die (die dem vor dem Kontextknoten Kontextknoten folgenden stehenden Eine dieser Achsen kann als Präfix vor dem Knotennamen im Pfadausdruck angegeben werden: achse::elementname. Auch bei den vorher angegebenen Beispielen spielen die Achsen eine Rolle, sie wurden lediglich in ihrer vereinfachten Form angegeben. • Die child-Achse ist die default-Achse, d.h. der Ausdruck Adresse/Name ist nur eine abgekürzte Schreibweise für child::Adresse/child::Name • Die attribute-Achse wird durch @ abgekürzt, d.h. der Ausdruck book[@year='2000'] entspricht child::book[attribute::year='2000'] • Die self-Achse wird durch . abgekürzt. • Die parent-Achse wird durch .. abgekürzt • Die descendant-or-self-Achse wird durch // abgekürzt. Will man eine Achse auswählen, die keine Abkürzung hat wie etwa die followingAchse, muss man die Präfixschreibweise verwenden: following::. Die descendant-or-self-Achse – also // – ist mit Vorsicht zu benutzen: sie verursacht eine Durchsuchung des kompletten Unterbaums des aktuellen Kontextknotens. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 54 - © Prof. J. Goll - 5. Stylesheets Das Zeichen * fungiert als "Wildcard": damit werden alle Knoten der entsprechenden Achse ausgewählt. Das war auch schon in den obigen Beispielen zu sehen: @* etwa selektiert alle Attributknoten. 5.3.4 Funktionen XPath unterstützt auch Funktionen. Einige davon sind vordefiniert, es können aber auch eigene Funktionen definiert werden. Einige werden auch vom Kontext (z.B. XSLT oder XPointer) bereitgestellt. Bei der Nutzung selbstdefinierter Funktionen ist Vorsicht geboten, da dieses Feature nicht von allen XSLT Prozessoren unterstützt wird. Die von XPath definierten Funktionen liefern Knoten und Knotenmengen, die über normale Eltern-Kind- oder Element-Attribut-Beziehungen nicht zu berechnen sind. Außerdem ermöglichen sie den Umgang mit Strings und Zahlen, was sowohl zum Suchen in einem Dokument, als auch zur Ausgabe genutzt werden kann. Zu den vordefinierten Funktionen zählen beispielsweise: • number last(), number position() number number(object), number count(nodeSet) • string string(object), boolean contains(string, string), string name() • boolean boolean(object), boolean not(boolean), boolean true() Die letzte Gruppe erlaubt das Arbeiten mit boolschen Werten, sodass damit auch Entscheidungen möglich werden. Die Funktion count liefert als Ergebnis die Anzahl der Knoten in der als Parameter übergebenen Knotenmenge, im folgenden Beispiel die Anzahl der Kind-Elemente des Kontextknotens, die ein Attribut name haben. count (child::*[@name]) Die Bedeutung der übrigen Funktionen und deren Parameter müssen bei Bedarf nachgeschlagen werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 55 - © Prof. J. Goll - 5. Stylesheets - 5.4 XSL Transformations Auch die XSL Transformations (XSLT) wurden in einer W3C-Recommendation manifestiert. Bei XSLT wird das Eingabe- und das Ausgabe-Dokument als Baum angesehen, d.h. der Source-Tree wird in einen Result-Tree überführt. Die typische Anwendung von XSLT ist die Transformation eines XML Dokumentes in ein anderes XML Dokument, mit einem anderen Vokabular. Die heutigen Browser haben beispielsweise alle ein Stylesheet, mit dem sie ein XML Dokument in ein HTML Dokument transformieren, das sie dann wiederum darstellen können. 5.4.1 Definition der Transformationen Die eigentliche Abbildung wird über sogenannte Template-Regeln realisiert. Die möglichen Tags und Attribute wurden einem Namensraum des W3C zugeordnet. Dieser muss am Anfang eines Stylesheet erwähnt werden. Das Präfix kann normalerweise frei gewählt werden, aber xsl ist üblich. Diese Templates bestehen aus einem Pattern und einem Aktionsteil. Sie werden in einem XSL Stylesheet so formuliert: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="..."> ... </xsl:template> <xsl:template match="..."> ... </xsl:template> </xsl:stylesheet> Hier wird deutlich, dass es sich bei einem XSL Stylesheet auch um ein XML Dokument handelt. Der Pattern-Teil einer Template-Regel wird bei der Anwendung des Stylesheets mit dem Source-Tree verglichen. Diese Patterns werden in einer erweiterten Form von XPath angegeben. Will man nun eine Regel für ein Element Fahrgast angeben, so sieht die zugehörige Regel so aus: <xsl:template match="Fahrgast"> ... </xsl:template> Im Aktionsteil einer Regel (hier durch ... dargestellt) wird die Ausgabe beschrieben, die erzeugt werden soll, wenn das Muster zutrifft. Im Wesentlichen wird der Inhalt STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 56 - © Prof. J. Goll - 5. Stylesheets des template-Elementes in die Ausgabe (Result-Tree) kopiert, wobei durch weitere XSL Elemente die Ausgabe dynamisch gestaltet werden kann. Soll zum Beispiel der Text des Elementes em im HTML Dokument kursiv dargestellt werden, so lässt sich das mit folgender Regel bewerkstelligen: <xsl:template match="em"> <I> <xsl:value-of select="." /> </I> </xsl:template> Das Element xsl:value-of dient dazu, Information zu einem Knoten aus dem Source-Tree zu holen und in den Result-Tree einzufügen. Es wird daher häufig gebraucht. Im obigen Beispiel wird also der Text (PCDATA) des aktuellen Knotens (select=".") genommen und an Stelle des Elementes xsl:value-of in den Result-Tree eingebaut, d.h. der Text wird in Italic-Schrift (<I>) ausgegeben. Will man auch die Templates für tiefer gelegene Elemente zur Ausführung bringen, so kann man diese Aktion mit <xsl:apply-templates/> auslösen. Im folgenden Beispiel sollen die Telefonnummern einer Adresse in einem Absatz einfach aufgezählt werden (Telefon: Nummer1, Nummer2, Nummer3...): <xsl:template match="Telefon"> <P> Telefon: <xsl:apply-templates/> </P> </xsl:template> <xsl:template match="Nummer"> <I> <xsl:value-of select="."/>, </I> </xsl:template> Die Ausgabe der Templates der tiefer gelegenen Elemente, wird an der Aufrufstelle eingesetzt, so dass der gewünschte Effekt entsteht. Wenn mehrere Templates auf ein und denselben Knoten zutreffen, wird ein Template nach bestimmten Prioritätsregeln ausgewählt und ausgeführt. Generell gilt, dass die am spezifischste Regel die höchste Priorität hat gegenüber den allgemeineren. Es ist auch möglich die Priorität einer Regel festzulegen. Die Details dieser Prioritätsregeln müssen bei Bedarf nachgeschlagen werden. 5.4.2 Default Transformationen XSLT hat einige Default-Regeln, die das Arbeiten erleichtern: • Jeder Knoten des Baumes wird besucht. • Auch die Kinder jedes Knotens werden abgearbeitet: <xsl:template match="*|/"> <xsl:apply-templates/> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 57 - © Prof. J. Goll - 5. Stylesheets </xsl:template> • Text wird in den Result-Tree kopiert: <xsl:template match="text()"> <xsl:value-of select="."/> </xsl:template> Diese Default-Regeln können allerdings vom Stylesheet überschrieben werden. D.h. sie werden nur für die Knoten angewandt, für die keine spezielle Regel definiert wurde. Die Default-Regeln haben sozusagen die niedrigste Priorität. Der Effekt dieser Default-Regeln ist der, dass aus dem Source-Dokument der reine Inhalt (also ohne Tags und Attribute) herausgezogen wird und in das ResultDokument kopiert wird. 5.4.3 Beispiel: Transformation des Adressbuch-Dokumentes Nun folgt als komplettes Beispiel ein Stylesheet (ab.xsl) für AdressbuchDokumente entsprechend der Adressbuch-DTD in Kapitel 3. Das Ziel der Transformation ist HTML und die Darstellung der einzelnen Adressen soll in einer Tabelle erfolgen. <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="Adressbuch"> <HTML> <TITLE>Adressbuch</TITLE> <BODY> <TABLE border="5" width="100%" align="center"> <THEAD> <TH>Name</TH> <TH>Telefon</TH> <TH>eMail</TH> </THEAD> <xsl:apply-templates/> </TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="Adresse"> <TR> <xsl:apply-templates/> </TR> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 58 - © Prof. J. Goll - 5. Stylesheets </xsl:template> <xsl:template match="Anrede"> </xsl:template> <xsl:template match="Name|Telefon|Email"> <TD> <CENTER> <xsl:apply-templates/> </CENTER> </TD> </xsl:template> <xsl:template match="Nummer"> <xsl:apply-templates/> <I> (<xsl:value-of select="@Anschluss"/>) </I> <BR/> </xsl:template> <xsl:template match="Emailadresse"> <A> <xsl:attribute name="HREF">mailto:<xsl:apply-templates/> </xsl:attribute> <xsl:apply-templates/> </A> <BR/> </xsl:template> </xsl:stylesheet> Wendet man dieses XSLT Stylesheet nun auf das Beispiel Adressbuch-Dokument aus Kapitel 3 an, so wird das resultierende HTML File im Browser wie folgt angezeigt. Abbildung 5-4: Anzeige des transformierten XML Dokumentes STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 59 - © Prof. J. Goll - 5. Stylesheets - 5.4.4 Zuordnung von Stylesheets zu Dokumenten In den allermeisten Fällen wird ein XML Dokument und ein XSLT Stylesheet zusammen einem XSLT Prozessor übergeben. Der Aufrufer ist für die richtige Zuordnung verantwortlich. Wie im Bild 5-3 zu sehen war, kann es auch durchaus sinnvoll sein, bei unterschiedlichen Aufrufen mit unterschiedlichen Stylesheets zu arbeiten. Die gewollte Zuordnung kann aber auch im XML Dokument spezifiziert werden. Dies ist immer dann wichtig, wenn beispielsweise ein Browser auf ein XML Dokument trifft und es darstellen möchte. Der Browser wird ja in diesem Falle nicht mit irgendwelchen Parametern aufgerufen, er muss die richtige Information im Dokument selbst finden. Diese Zuordnung von Stylesheets zu Dokumenten wurde in der W3CRecommendation festgehalten. Realisiert wird die Zuordnung über eine ProcessingInstruction im Prolog des Dokumentes. Ziel der Processing-Instruction ist xmlstylesheet mit den folgenden Attributen. • href mit der URL des Stylesheets • type mit der Sprache des Stylesheets (in MIME) • und anderen wie z.B. title, media, alternate Die Stylesheet Referenz im Prolog eines XML Dokumentes kann dann z.B. so aussehen: <?xml-stylesheet href="meinstylesheet.xsl" type="text/xsl"?> Unter href ist also der Dateiname zu finden und unter type ist angegeben, um welchen Dateityp und um welche Art von Stylesheet es sich handelt. ToDo: AB Beispiel 5.4.5 Formatierung des Output XSLT ist am besten dann einzusetzen, wenn als Output XML Dokumente erzeugt werden sollen. Soll der Output jedoch als Text formatiert werden, also mit Einrückungen und/oder Leerzeichen, dann wird das Stylesheet schnell unübersichtlich. Um die gewünschte Formatierung zu erzeugen, muss mit der Anordnung der XSLT Elemente experimentiert werden. Die Formatierung von XML Output kann – je nach Prozessor – über Schalter und/oder Attribute eingestellt werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 60 - © Prof. J. Goll - 5. Stylesheets - 5.4.6 Zusammenfassung XSLT spielt eine wichtige Rolle in der Verarbeitung von XML Dokumenten. Dies soll an zwei Beispielen erläutert werden. 1) Wenn jemand eine Website einrichtet, beispielsweise mit irgendwelchen Nachrichten, natürlich in Form von XML Dokumenten, dann möchte und sollte er sich nicht darum kümmern müssen, was die Empfänger der Nachrichten damit machen. Die einen möchten bestimmte Nachrichten selbst in ihre Webseiten einbauen, die anderen möchten zusätzliche Kommentare dazu abgeben, wieder andere wollen die Nachricht nur in ihre Datenbank aufnehmen. An alle möglichen Nutzungsmöglichkeiten kann der Publisher gar nicht denken, geschweige denn alle bei der Erstellung der XML Struktur berücksichtigen. Das ist nun auch gar nicht nötig. Er kann sich konzentrieren auf seine ureigene Arbeit und die XML Struktur so definieren, wie sie für ihn am geeignetsten ist. Jeder Empfänger der Nachricht kann auf Grund der Kenntnis dieser Struktur ein XSLT Stylesheet schreiben, das das angekommene XML Dokument prozessiert und in die gewünschte Zielform für die Weiterverarbeitung transformiert. 2. Wenn Firmen untereinander Dokumente austauschen, die elektronisch weiterverarbeitet werden sollen, dann war es bisher notwendig, dass sie sich auf ein gemeinsames "Formular" einigen. In den beteiligten Firmen ist jede Menge Software anzupassen, die einmal das neue Formular erzeugt, zum anderen solche Formulare lesen kann. Mit XML und XSLT ist das nun nicht mehr notwendig. Jeder erzeugt XML Dokumente in einer ihm geeigneten Struktur. Die Partner müssen nur ein kleines XSLT Stylesheet schreiben, das ein empfangenes Dokument an ihre Dokumentenstruktur anpasst. Viele Firmen haben das inzwischen erkannt und XML und XSLT spielen eine wichtige Rolle in der Konzeption neuer Middleware. Zum Schluss noch eine Bemerkung zu der "Programmiersprache" XSLT. Ja, XSLT ist eine Art Programmiersprache, in der formuliert wird, wie ein Source-Tree in einen Result-Tree zu transformieren ist. XSLT ist aber nicht zu vergleichen mit den "üblichen" Programmiersprachen, wie C, C++, Java,... Diese Programmiersprachen sind imperative Programmiersprachen: darin werden Befehle formuliert, die dem Computer sagen, was er tun soll. XSLT ist eine deklarative Programmiersprache. In XSLT wird nur beschrieben, wie der Result-Tree aussehen soll, der XSLT Prozessor findet selbst heraus, wie er das Ergebnis herstellen kann. Das hat zwei Konsequenzen: (1) Der Entwickler selbst braucht nicht so viel zu beschreiben, da ihm der Prozessor viel Arbeit abnimmt. (2) Es ist wichtig, auf den richtigen XSLT Prozessor zu achten, da die sich doch deutlich unterscheiden, beispielsweise was die Performanz betrifft, mit der bestimmte Konstrukte umgesetzt werden, vgl. [Brand04]. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 61 - © Prof. J. Goll - 5. Stylesheets - 5.5 Performance Aspekte Da XSL eine deklarative Sprache ist, kann in einem XSL Stylesheet auch nur angegeben werden, „was“ und „wodurch“ etwas geändert werden soll. Die eigentliche Bearbeitung, also das „wie“ unterliegt dem XSLT Prozessor, der das XSL Stylesheet zur Laufzeit analysiert und interpretiert. Dies führt in jedem Fall zu einem Flaschenhals, der die Performance einer XSL Transformation beeinträchtigt. Möchte man nun diesen Flaschenhals umgehen, der gerade bei Transformationen mehrerer XML Dokumente mit ein und dem selben XSL Stylesheet unnötig viel Zeit kostet, sollte man XSLTC (eXtensible Stylesheet Language Transformations Compiled) verwenden. Alternativ lässt sich eine Performanceverbesserung auch durch Änderungen am Stylesheet erreichen. 5.5.1 Änderungen im Stylesheet Um Änderungen an einem Stylesheet vornehmen zu können, müssen zunächst Schwachstellen im XSLT Stylesheet erkannt werden. Dazu muss das Stylesheet genau analysiert werden. Begründet liegt dies in der Eigenschaft von XSL Dokumenten, da diese den Grundsätzen der funktionalen Programmierung folgen. Das bedeutet: Variablen lassen sich zwar definieren, dürfen aber ihren Wert nicht wieder ändern. Somit werden Seiteneffekte ausgeschlossen und es dem XSLT Prozessor überlassen, in welcher Reihenfolge er die Befehle abarbeitet. Die Auswahl der Reihenfolge ist so verschieden wie die Auswahl der XSLT Prozessoren. Somit bleibt das Hauptproblem der Laufzeitoptimierung bei der Entwicklung von XSLT Stylesheets: Der Entwickler muss also die Stellen im Code ausfindig machen, die die meiste Zeit für ihre Ausführung benötigen. Und genau hierbei liegt das große Problem. Zwar lassen sich durch Tracingfunktionen relativ einfach Programmanweisungen ermitteln, die häufig ausgeführt werden. Ein genaue Aussage über deren Laufzeit ist dennoch nicht möglich. Um genaue Aussagen über die Laufzeit von Programmanweisungen treffen zu können benötigt man einen „Profiler“, der die Verweildauer eines Prozessors in jeder Anweisung ermitteln kann. CatchXSL [24] ist ein in Java geschriebener XSLT Profiler, der es ermöglicht Laufzeiten von XSL Anweisungen zu ermitteln. Dabei liefert der Profiler nicht nur eine Angabe der benötigten Zeit pro Anweisung, sondern außerdem eine Liste von Hot Spots und tiefergehende Einblicke in den Ablauf einer Transformation. Problematisch ist derzeit die noch fehlende Schnittstelle an XSLT Prozessoren, mit deren Hilfe sich solch ein Profiler einfacher ankoppeln liese. Daher bedient sich CatchXSL der von manchen Herstellern angebotenen Tracing Schnittstelle, über die verschiedene Events durch einen Listener abgefangen werden können. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 62 - © Prof. J. Goll - 5. Stylesheets Diese Events sind: • Style-Event: startet beim Aufruf von Style Elementen. • Write-Event: startet beim Generieren von Resultattext. • Select-Event: tritt ein bei der Auswahl von Nodesets. • Run- und Processing-Events: zur Kapselung von Transformationsabläufen. Die Auswertungskomponente in CatchXSL analysiert die Zeitstempel dieser Events und berechnet daraus die Laufzeiten der einzelnen Anweisungen. Desweiteren werden Zeiten für die Toplevel Elemente des Stylesheets ausgegeben, etwa für Variablendeklarationen am Anfang einer XSL Datei. Die so gewonnenen Ergebnisse lassen sich als XML oder HTML Datei ausgeben und weiterverarbeiten. Durch die, mit Hilfe des Profilers, erhaltenen Informationen lassen sich gezielt Anweisungen mit hoher Laufzeit auffinden und optimieren. Diese Optimierungen sind allerdings von Prozessor zu Prozessor verschieden und lassen sich nicht verallgemeinern. So bewirken Veränderungen am XSLT Stylesheet bei einem Prozessor eine Leistungssteigerung um ein Vielfaches, während die selbe Änderung dem anderen Prozessor eher schadet. Dies lässt sich am Besten mit Hilfe eines Beispiels aus dem iX Magazin 08/2002 [Hub02] verdeutlichen: Erste Definition: <xsl:variable name=“node-set“ select=“expression“/> <xsl:for-each select=”$node-set”> ... Gesamtanzahl <xsl:value-of select=”count($node-set)”/> </xsl:for-each> Zweite Definition: <xsl:variable name=“node-set“ select=“expression“/> <xsl:variable name=“summe“ select=“count($node-set)“/> <xsl:for-each select=”$node-set”> ... Gesamtanzahl <xsl:value-of select=”summe”/> </xsl:for-each> Beide Definitionen liefern identische Ausgabeergebnisse. Der einzige Unterschied innerhalb der beiden gezeigten Listings besteht darin, dass in der ersten Definition die Anzahl der Knoten bei jedem Schleifendurchgang neu berechnet werden muss. Diese Summe wird in der zweiten Definition schon vor der Schleife berechnet und in einer separaten Variablen gehalten. In [Brand04] wurde gezeigt, dass die Unterschiede in der Verarbeitung beider Versionen sehr groß sein können. Die Ursache dafür liegt in der internen Abarbeitung der einzelnen Anweisungen. Die Ergebnisse zeigten aber auch sehr deutlich, dass man für jeden verwendeten Prozessor anders optimieren oder entwickeln muss. Wenn auch die Unterschiede bei einzelnen Transformationen nur gering sind, so STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 63 - © Prof. J. Goll - 5. Stylesheets addieren sich diese Unterschiede Transformationen sehr schnell auf. bei vielen oder häufig durchgeführten 5.5.2 XSLTC (Translets) Bei der Verwendung eines XSLTC Prozessors (im folgenden Beispiel Xalan-J) wird das zu verwendende XSL Stylesheet in eine Stylesheet Klasse überführt. Diese Klasse nennt man im Zusammenhang mit XSL auch Translet. Soll dann dieses XSL Stylesheet auf mehrere XML Dokumente angewendet werden, wird das XSL Stylesheet nicht jedesmal neu übersetzt, sondern aus der schon übersetzten Klassendatei geholt, da hier das Stylesheet schon im Bytecode vorliegt. Abbildung 5-5: Prinzip von Translets XSLT Translets sind in die TrAX (Transformation API for XML) / JAXP (Java API for XML Processing) 1.2 API integriert. Dadurch ist es möglich direkt auf die TransformerFactory zuzugreifen und ein Transformer Objekt zu erzeugen, welches das Translet kompiliert und startet. Eine Anwendung kann XSLTC entweder durch seine native API oder durch seine Implementierung der TrAX API ausführen. Der Compiler erstellt dann ein oder mehrere Java Klassen (die Translets), welche entweder abgespeichert oder als Objekte im Speicher gehalten werden. Die XSLTC Laufzeit Bibliothek enthält die STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 64 - © Prof. J. Goll - 5. Stylesheets benötigten Klassen, die diese erstellten Translets laden und zur Transformation von XML Dokumenten verwenden können. Bei einem Performancevergleich [Brand04] wurden mit Xalan-J verschiedene Transformationen jeweils mit und ohne Translets durchgeführt. Dabei wurde jeweils eine .xml Datei 25 mal transformiert. Es zeigte sich deutlich, dass die Verwendung eines Translets in jedem Testfall enorme Zeitvorteile bringt. Die mit Translets benötigte Zeit lag hierbei lediglich zwischen 25% und 61% der benötigten Zeit ohne Translets. 5.6 Formatting Objects (XSL-FO) Die Formatierungssprache XSL-FO (XSL Formatting Objects) ist ein XML Vokabular für die Anwendung von Formatierungsangaben auf XML Dokumente. FO ist der Teil von XSL, mit dem unter Verwendung von Formatierungsobjekten Dokumente millimetergenau formatiert werden können. Mittels dieser Formatierungsobjekte ist es möglich, die physischen Bestandteile einer Dokumentation, also Seiten, Bereiche, Tabellen, Kopf- und Fußzeilen, genau festzulegen. Auf diese Weise lassen sich rechnerunabhängige Ausgabeformate definieren, die insbesondere für Printmedien geeignet sind. HTML ist ein Ausgabeformat, das speziell für den Bildschirm zugeschnitten ist. Ein HTML Dokument wird beim Ausdrucken allerdings auf unvorhersehbar viele Seiten verteilt. Für die Ausgabe auf ein Printmedium ist dieses Format daher nur bedingt geeignet, da der Inhalt weder genau platziert, noch einzelnen Seiten zugewiesen werden kann. Durch die Verwendung von Formatierungsobjekten der aktuellen XSL Spezifikation kann dieses Problem behoben werden. Da XSL-FO speziell für Druckformate entworfen wurde, orientiert es sich auch eher am klassischen Buchdruck und bietet daher beispielsweise extra Methoden zur Definition von Fußnoten, Seitenangaben, Kopf- und Fußzeilen. Für die Verarbeitung der Formatierungsanweisungen bedarf es allerdings, ebenso wie bei XSLT, eines Prozessors, der die Formatierungsobjekte interpretieren kann und ein entsprechendes Ausgabedokument erzeugen kann, wie im folgenden Bild dargestellt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 65 - © Prof. J. Goll <fo:flow> <fo:block font-size="20pt" font-family="Arial"> Diplomarbeit </fo:block> <fo:block font-size="18pt" font-style="bold"> Thema: </fo:block> </fo:flow> Thema: XSL-FO - 5. Stylesheets Prozessor XSL-FO Entwickeln eines generischen Anzeigemoduls zur Erzeugung von graphischen... PDF Datei Bild 5-6: Umwandlung von XSL-FO in PDF Für das Portable Document Format (PDF) von Adobe wurde von der Apache Software Foundation ein freier FO Prozessor (fop) entwickelt, der aus einem XSL-FO Dokument direkt eine PDF Datei erzeugen kann. Prozessoren für andere Formate, wie beispielsweise TeX sind mittlerweile ebenso verfügbar. Da die XSL-FO Spezifikation jedoch recht komplex und sehr umfangreich ist, ist derzeit noch kein Prozessor in der Lage, alle definierten (verfügbaren) Formatierungsobjekte umzusetzen. Der XSL-FO Prozessor gliedert sich hierbei noch in einen XSL Transformer, der die Anweisungen und Daten auf das gewünschte Zielformat umsetzt und einen XSL Formatter, der die eigentliche Platzierung der Inhalte im entsprechenden Zielformat vornimmt. XSL-FO wird im XML Format beschrieben und enthält im aktuellen Namensraum (http://www.w3.org/1999/XSL/Format) bisher 56 Objekte mit insgesamt über 250 Attributen. Mit diesen Formatting Objects können Dateninhalte im Dokument exakt platziert werden. Durch die entsprechenden Attribute, den Formatting Properties, können diese an eigene Bedürfnisse des Layouts und der Darstellung des Dokumentes angepasst werden. Über diese Attribute werden Einstellungen wie z.B. Schriftart, -größe, -farbe oder Abstände vorgenommen. Die Erzeugung von XSL-FO sollte jedoch nicht manuell geschehen, sondern am besten unter Verwendung von XSLT und entsprechenden Stylesheets. Dadurch wird der Inhalt und das Layout getrennt. Über die Stylesheets werden die Formatierungen bestimmt und mit dem Inhalt aus XML zu einer FO Datei transformiert. Da bei einem FO Dokument eine Unmenge an Formatierungsanweisungen anfallen kann, wird es schnell sehr lang und unübersichtlich. Daher empfiehlt es sich die Erzeugung dieser Dokumente durch Vorlagen und entsprechende Prozessoren zu realisieren. Da XSL-FO ein XML Format ist, kann es von XML Parsern verarbeitet und auch validiert werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 66 - © Prof. J. Goll - 5. Stylesheets - 5.6.1 Aufbau eines FO Dokumentes Durch das eigentliche Anwendungsgebiet geprägt, arbeitet XSL-FO generell seitenorientiert. Das Formatierungsmodell von FO basiert dabei auf sogenannten Regionen. Diese Regionen, teilweise auch Boxen genannt, sind rechteckige Bereiche, die den eigentlichen Inhalt in Form von Text, Bildern oder weiteren Formatierungsobjekten enthalten können. Ein XSL-FO Dokument beginnt wie jedes XML Dokument zunächst mit einer XMLDeklaration. Darauf folgt das Wurzelelement, in dem auch gleich der entsprechende Namensraum zugewiesen werden kann. In diesem Fall wäre das xmlns:fo="http://www.w3.org/1999/XSL/Format". Für diesen Namensraum wird üblicherweise das Namenspräfix fo, für Formatting Objects verwendet. Gemäß der Spezifikation enthält dieser Namensraum alle Elemente und Attribute, die zur Verwendung in einem XSL-FO Dokument genutzt werden können. Im weiteren Verlauf des Textes wird bei den XSL-FO Elementen der Namensraum stets mit fo bezeichnet. Nachstehend ist die Struktur eines XSL-FO Dokumentes mit den wichtigsten Elementen aufgestellt. Sie bietet eine gute Übersicht, durch welche FO Elemente sich ein Dokument formatieren lässt und wie diese zusammenhängen. fo:root fo:layout-master-set fo:declarations fo:color-profile fo:simple-page-master fo:regionbody fo:regionend fo:page-sequence fo:title fo:static-content fo:flow fo:page-sequence-master fo:regionafter fo:repeatable-page-master-reference fo:repeatable-page-master-alternatives fo:regionstart fo:regionbefore fo:simple-page-master-reference fo:conditional-page-master-reference Bild 5-7: XSL-FO Dokument als Baumstruktur Das Wurzelelement jedes XSL-FO Dokumentes bildet das <fo:root>-Element. Es umschließt die gesamten Definitionen und Inhalte des FO Dokumentes. Die STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 67 - © Prof. J. Goll - 5. Stylesheets Spezifikation legt fest, dass im root-Element zwingend die beiden Knoten <fo:layout-master-set> und <fo:page-sequence> anzugeben sind. Diese Elemente gliedern ein FO Dokument zunächst in zwei grundlegende Bereiche: Im ersten Teil werden im sogenannten <fo:layout-master-set> die Seiten formatiert und die Seitenfolge festgelegt, also somit das generelle Layout des gesamten Dokumentes bestimmt. Bei der Definition der Seiten werden die eigentliche Blattgröße und die Seitenränder angegeben, sowie die Regionen definiert, die eine grobe Einteilung der Seiten über das ganze Dokument hinweg festlegen. Die Regionen werden dann später den eigentlichen Inhalt des Dokumentes aufnehmen. Im zweiten Teil der FO Datei erfolgt dann die Angabe der darzustellenden Inhalte und wie diese auf der Seite verteilt werden sollen. Dieser Teil besteht aus einer Reihe von <fo:page-sequence> Elementen. In einem optionalen dritten Teil können noch mit <fo:declarations> Angaben zum Farbprofil gemacht oder es können globale Anweisungen festgelegt werden, die auch über den Namensraum hinaus gehen können. 5.6.2 Layoutvorlagen Zunächst soll nun das <fo:layout-master-set> mit den Seitenformatierungen betrachtet werden. Zur Definition der Seitenformatierungen besteht das <fo:layout-master-set> generell aus mindestens einem <fo:simple-pagemaster> und gegebenenfalls einem oder mehreren <fo:page-sequencemaster>. Die <fo:simple-page-master> sind dabei Vorlagen für die verwendeten Seiten. So ist beispielsweise für ein Dokument vorstellbar, drei separate Seitenlayouts zu bestimmen, wobei die Titelseite, sowie gerade und ungerade Seiten jeweils gleiche Abmessungen haben, jedoch unterschiedliche Seitenränder und verschiedene Formatierungen erhalten können. Jede Seite wird dabei durch ein <fo:simple-page-master> definiert, in dem dann die Angaben zur Seitengröße und den Seitenrändern festgelegt werden. Dabei erhält jedes <fo:simple-pagemaster> einen eindeutigen Namen als Attribut, mit dem dieses Layout dann später im Dokument einer einzelnen Seite zugewiesen werden kann. Die Angaben in einem <fo:simple-page-master> erfolgen als Attribute und als untergeordnete XSL-FO Elemente (Kindelemente). Die Maßangaben der Attribute können dabei in den Einheiten cm (Zentimeter), mm (Millimeter), in (Inches), px (Pixel), pt (Punkte: 1/72 Inch), pc (Picas: 1/6 Inch), em (Schriftgröße des Buchstaben m der verwendeten Schrift) und ex (Höhe des Zeichens x der Schrift) angegeben werden. Durch diese Vielzahl der möglichen Einheiten wird die internationale Verwendung des XSL-FO Formates ermöglicht. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 68 - © Prof. J. Goll - 5. Stylesheets - 5.6.3 Seitenstrukturierung Durch die Attribute des <fo:simple-page-master> werden die Seitenränder und die Seitengröße des Dokuments, wie im folgenden Bild dargestellt, definiert. Eine Seite besteht dabei zunächst einmal aus der content area und den umgebenden Seitenrändern. margin-top margin-left content area height margin-right margin-bottom width Bild 5-8: Definition der Seitenränder und -maße eines Blattes Durch weitere Attribute des <fo:simple-page-master> wird nun die content area in einer Seite festgelegt. Diese wird nun jedoch nochmals weiter unterteilt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 69 - © Prof. J. Goll - 5. Stylesheets Die content area gliedert sich in fünf Regionen, die mit <fo:region-body>, <fo:region-before>, <fo:region-after>, <fo:region-start> und <fo:region-end> bezeichnet werden. Diese sind XSL-FO Elemente, die als Kindelemente im <fo:simple-page-master> enthalten sein können. Die Anordnung dieser Regionen innerhalb einer Seite ist im folgenden Bild dargestellt. fo:region-body fo:region-end fo:region-start fo:region-before content-area fo:region-after Bild 5-9: Gliederung der content-area In diesen Regionen der content area kann dann der eigentliche Inhalt platziert werden. Dabei kann <fo:region-before> beispielsweise die Kopfzeile mit der Angabe zum gegenwärtigen Kapitel enthalten und in <fo:region-after> die aktuelle Seitenzahl dargestellt werden. Der laufende Text wird dann in den Bereich <fo:region-body> eingefügt. Die Zuweisung der verwendeten Region zum darzustellenden Inhalt erfolgt später in den <fo:page-sequence>-Bereichen des XSL-FO Dokuments. In den Layoutvorgaben <fo:layout-master-set> kann neben dem Element <fo:simple-page-master> noch ein <fo:page-sequence-master> definiert werden. Dieser ist notwendig, falls mehr als ein Seitenformat gewählt wird. Hier können beispielsweise verschiedene Seitenformate für gerade und ungerade Seiten zugewiesen werden. Da die Formatierung mit mehreren Seitenformaten jedoch sehr umfangreich ist, kann hier nicht näher darauf eingegangen werden. Weitere Kindelemente sind für das Element <fo:simple-page-master> nicht definiert. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 70 - © Prof. J. Goll - 5. Stylesheets - 5.6.4 Seitenfolgen Der eigentliche Inhalt des Dokumentes wird in sogenannten Seitenfolgen, den <fo:page-sequence>-Objekten angegeben. Dabei steht in einem Element vom Typ <fo:page-sequence> eine Folge von Seiten, die die gleichen Charakteristika haben. So kann z.B. ein Kapitel eines Buches in einem Element <fo:pagesequence> angegeben werden. Für den Inhalt kann Kindelemente enthalten. das Element <fo:page-sequence> verschiedene Für den eigentlichen fortlaufenden Text eines Dokumentes muss das Objekt <fo:page-sequence> genau ein <fo:flow> Element enthalten. Innerhalb dieses Elementes wird der eigentliche Inhalt eines Dokumentes angegeben. Text, der sich in diesem Element befindet, wird bei der Anzeige fortlaufend dargestellt und relativ in der Seite, bzw. der Region platziert. Dabei wird mit dem einzigen Attribut von <fo:flow>, dem flow-name, auf die Region verwiesen, in der der Inhalt eingefügt werden soll. Üblicherweise ist das der Bereich <fo:region-body>. Das Element heißt so, weil der Text in ihm "fließt" und vom anzeigenden Programm automatisch so angeordnet wird, dass er auf die Seite passt. Zur weiteren Gruppierung des Inhaltes, also zum Darstellen von Absätzen, Formatieren von Überschriften aber auch zur eigentlichen Formatierung der Schrift werden innerhalb von <fo:flow> und <fo:static-content> Kindelemente vom Typ <fo:block> verwendet. 5.6.5 Darstellung des Inhaltes Um den tatsächlichen Inhalt in das Dokument einzufügen und in einer speziellen Schriftart darzustellen, stehen weitere XSL-FO-Elemente zur Verfügung, die unterschiedliche Granularitäten aufweisen. Die wichtigsten sind <fo:block>, <fo:inline>, <fo:character>. Der eigentliche textuelle Seiteninhalt wird innerhalb von <fo:flow> zunächst mit den Objekten vom Typ <fo:block> eingeteilt. Eine weitere Gruppierung oder Umformatierung kann dann innerhalb der block-Objekte mit Elementen vom Typ <fo:inline> und <fo:character> erfolgen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 71 - © Prof. J. Goll - 5. Stylesheets - 5.6.6 Beispiel Ein einfaches XSL-FO Dokument ist demnach wie folgt aufgebaut: <?xml version="1.0" encoding="iso-8859-1"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master page-master-name="Haupt-Seite" height="29.7cm" width="21cm" margin-top="1cm" margin-bottom="1.5cm" margin-left="2cm" margin-right="2cm"> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-name="Haupt-Seite"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hallo Welt!</fo:block> </fo:flow> </fo:page-sequence> </fo:root> Dieses Beispiel definiert im layout-master-set eine Seite (Format DIN A4) mit dem Namen Haupt-Seite. Im zweiten Abschnitt page-sequence wird für diese Seite eine flow-Box im region-body eingerichtet, die einen Block beinhaltet. In diesem Block wird der Text Hallo Welt! ausgegeben. 5.6.7 Verfügbare XSL-FO Prozessoren Derzeit sind schon einige Prozessoren zur Umwandlung von XSL-FO verfügbar. Es handelt sich dabei sowohl um Open-Source Implementierungen als auch um kommerzielle Produkte. Von den Prozessoren werden zum Teil unterschiedliche Zielformate unterstützt. Als Ausgabeformat steht das PDF Format an erster Stelle. Aber auch andere Dokumentenformate, wie RTF, HTML, PS oder sogar TeX können von manchen Prozessoren erzeugt werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 72 - © Prof. J. Goll - 5. Stylesheets - 5.6.8 Zusammenfassung Die wichtigsten FO Elemente zur Erstellung von einfachen XSL-FO Dokumenten wurden hier erklärt. Es gibt aber noch eine Vielzahl weiterer Formatierungselemente, mit denen sich Links, Listen, Tabellen, dynamische Effekte usw. erzeugen lassen. Hier kann aber nicht auf alle 56 Elemente eingegangen werden. Die verfügbaren Elemente mit ihren jeweiligen Attributen lassen sich in der Spezifikation nachschlagen. Da es allerdings noch keinen Prozessor gibt, der alle Elemente samt deren spezifizierten Eigenschaften unterstützt, sollte die Auswahl der verwendeten Formatierungselemente vorsichtig vorgenommen werden und dabei ebenso der zur Verfügung stehende FO Prozessor berücksichtigt werden. Das Interessante an XSL-FO ist, dass man theoretisch völlig frei vom Zielformat ist. Das heißt, es ist nur noch vom Prozessor abhängig, welches Ausgabeformat erzeugt werden soll, das eigentliche Dokument sieht aber immer gleich aus, egal ob man ein PDF Dokument erstellt, ein RTF Format, oder eine MS-Word Datei. Leider bedarf es bis dahin noch einer verbesserten Umsetzung der Spezifikation in den Prozessoren und neue Implementierungen für weitere Ausgabeformate. So ist beispielsweise derzeit noch kein FO Prozessor erhältlich, der Word-Dateien erstellen kann. Viele Aspekte von FO erinnern stark an die Font-Tags von HTML, allerdings gibt es einen entscheidenden Unterschied zwischen XSL-FO und HTML. Da XSL-FO Anweisungen im Gegensatz zu den CSS von HTML direkt im Text eingebunden werden, wird XSL-FO nur als Endprodukt einer Konvertierung verwendet. Eine Änderung der Formatierungseigenschaften durch eine externe Datei, wie es bei HTML mit CSS erfolgen kann, ist bei XSL-FO nicht möglich. Dazu ist bei XML eben auch der andere Teil von XSL, nämlich XSLT zuständig. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 73 - © Prof. J. Goll - 6. XML Schema - 6 XML Schema Da XML Dokumente gerade für den Austausch von Daten besonders gut geeignet sind, bietet sich der Einsatz von XML z.B. im Zusammenhang mit Datenbanksystemen geradezu an. Allerdings stellte sich hier früh heraus, dass die für XML üblichen DTDs einige Mängel aufweisen, die dieses Unterfangen deutlich erschweren: • • • DTDs entsprechen nicht der XML Syntax (d.h. die DTDs selbst sind keine XML Dokumente). DTDs weisen mangelhafte Kompatibilität zu den XML Namespaces auf. DTDs kennen keine Möglichkeit, Elementen oder Attributen Datentypen zuzuweisen. Gerade dieser Mangel macht den Einsatz von XML zum Austausch von Daten zwischen Datenbanksystemen sehr problematisch. Aufgrund dieser Nachteile entstanden Bestrebungen neue Wege zu finden, die Grammatik für XML Dokumente zu definieren, ohne die genannten Mängel in Kauf nehmen zu müssen. Das Ergebnis dieser Initiativen bildet die Spezifikation des XML Schema. XML Dokumente werden einer sogenannten XML Schema Definition (XSD) zugeordnet, anstelle einer DTD. 6.1 Entwicklung von XML Schema 6.1.1 Vorgänger von XML Schema Es gab diverse Ansätze, um neue Definitionssprachen zu entwickeln, welche die Mängel der DTD beheben sollten, bzw. um neue Ideen einfließen zu lassen. Im Folgenden werden einige aufgezählt, die wichtig waren und die Entwicklung von XML Schema beinflusst haben. • RELAX – REgular LAnguage Description for XML von Murata Makoto • TREX – Tree Regular Expressions for XML von James Clark • RELAX NG – TREX und RELAX Nachfolger • DDML – Document Definition Markup Language • Schematron – von Rick Jelliffe Die Definitionssprachen können in kontextfreie Grammatiken und regelbasierte Sprachen aufgeteilt werden, wobei lediglich Schematron als regelbasiert zu nennen ist. Schematron basiert auf XPath-Ausdrücken, die sogenannte Assertions (Behauptungen) aufstellen. Eine Vielzahl von Behauptungen bilden dann ein Schema. Alles was nicht explizit verboten ist, ist erlaubt. Hier lässt sich Komplexes sehr einfach darstellen (z.B. Regeleinschränkungen). Der Nachteil jedoch ist, dass einfache, aber bei XML notwendige Tätigkeiten, wie das Definieren von Strukturen STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 74 - © Prof. J. Goll - 6. XML Schema und Datentypen, sehr kompliziert und unübersichtlich wird. In dieser Hinsicht sind die kontextfreien Grammatiken wesentlich besser geeignet. Die Idee von XML Schema war, die bereits vorher bestehende, als Basis zu sehende Technologie der DTD zu verbessern und zu erweitern. Das war ein wesentlicher Punkt in dieser Konkurrenz und so erreichte XML Schema, das ursprünglich auf einem Vorschlag von Microsoft basierte, am 2. Mai 2001 den Recommendation Status durch das W3C. Dadurch, dass der Standard von offizieller Seite längerfristig anerkannt wurde und klar zu erkennen ist, wo die Vorteile liegen, verbreitet er sich immer mehr. Dort wo präzise Definitionen von Daten in Anwendungsgebieten gefragt sind, wird in aller Regel nur noch mit XML Schema gearbeitet statt mit DTDs. 6.1.2 Definition von XML Schema Das Wort Schema kommt aus dem Griechischen (σχηµα) und bedeutet Form/Figur. Dieser Bedeutung entsprechend definiert XML Schema die Gestalt einer XMLbasierten Sprache. XML Schema ist ein auf Grammatiken basiertes Regelwerk. Die Regeln definieren sowohl Struktur als auch Inhalt eines XML Dokuments. Damit können wiederum wie im Falle der DTD Gültigkeitsprüfungen durchgeführt werden. XML Schema macht einen entscheidenden Schritt von der bisherigen dokumentenorientierten Sichtweise hin zur daten-orientierten Sichtweise. Die Erweiterungen gegenüber einer DTD können im Wesentlichen in zwei Punkten zusammengefasst werden: • Darstellung des Inhaltes über Typisierung Dieser Punkt bezieht sich hauptsächlich auf die Erweiterung der Ausdrucksmöglichkeiten hinsichtlich struktureller, als auch inhaltlicher Merkmale. So halten Konzepte aus der Objektorientierung Einzug und die Zuweisung von Datentypen wird massiv ausgeweitet. Neben Zeichenketten können jetzt auch Integerwerte, Fließkommazahlenwerte, Datumswerte und viele andere Datentypen zugewiesen werden. • XML-konforme Syntax XML Schema ist im Gegensatz zur DTD in der XML Syntax selbst gehalten. Dies garantiert zum einen eine schnelle Einarbeitung für den Anwender und zum anderen ermöglicht es auch Parsern und anderen XML-verarbeitenden Applikationen, XML Schema Dokumente wie jedes andere XML Dokument zu behandeln und keine Spezialtechniken anwenden zu müssen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 75 - © Prof. J. Goll - 6. XML Schema Die Spezifikation durch das W3C besteht aus 3 Teilen: • XML Schema Part 0: Primer Dieses nicht-normative Dokument soll den einfachen Zugang zu der XML Schema Sprache auf Basis von Beispielen und einfachen Erläuterungen geben. • XML Schema Part 1: Structures Dieses Dokument bildet die vollständige normative Beschreibung der Strukturen von XML Dokumenten in XML Schema. • XML Schema Part 2: Datatypes Dieses Dokument beschreibt die Möglichkeiten zum Definieren von Datentypen, welche beim XML Schema wie auch in anderen XML Spezifikationen verwendet werden können. Da die momentane Spezifikation bereits 345 Seiten umfasst, kann hier nicht detailliert auf das Erstellen/Verwenden von XML Schema eingegangen werden. Es soll lediglich ein Überblick vermittelt werden. 6.1.3 Vergleich XML Schema – DTD In der Tabelle 6-1 ist eine ausführliche Gegenüberstellung der Unterschiede zwischen DTDs und XML Schema zu finden. Der Hauptunterschied zwischen XML Dokumenten, die über eine DTD definiert sind, und solchen, die über ein Schema definiert sind, besteht in der Typisierung der einzelnen Elemente: während eine DTD nur einen Typ kennt, nämlich String (CDATA, bzw. PCDATA) verfügt XML Schema über reichhaltige Möglichkeiten zur Typisierung, die weiter unten erläutert werden. Hier soll jedoch an Hand eines kleinen Beispiels die Problematik der fehlenden Typisierung in DTDs aufgezeigt werden. <etwas> <wert>45.76</wert> </etwas> Jede Anwendung, die dieses kleine XML Dokument verarbeitet, wird sich fragen, was das Element wert bedeutet. Die Befragung der DTD kann als Antwort nur ergeben, dass Strings (PCDATA) dort stehen dürfen. Doch welche Art von Strings und wie lange die etwa sein können, das kann aus der DTD nicht ausgelesen werden. Eine Anwendung kann nur “raten”, wenn in diesem Dokument Zahlen vorkommen, dann vielleicht auch in den anderen, die der gleichen DTD entsprechen. Aber geprüft werden kann diese Annahme nicht. Die Anwendung kann es auch nicht in der DTD spezifizieren, dass sie an der Stelle nur Zahlen möchte. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 76 - © Prof. J. Goll - 6. XML Schema - XML Schema + XML-konforme Sprache + Datentypen können besser spezifiziert werden, wie z.B. Integer, Boolean, Datum, ... DTD - Eigene, nicht XML-konforme Syntax - Vernachlässigung von Datentypen (weder semantische Bedingungen noch Wertebereiche); Versteifung auf den Datentyp string + Festlegen von Beschränkungen einfach und flexibel + Beschränkungen des Inhaltsmodells für generische Datenformate. + Komplexe Strukturen können einfach dargestellt werden -> Ausdrucksmächtigkeit + Einführung von Typen (complexType) für das Definieren von Elementen; dieser kann auf mehrere Elemente angewendet werden. + Unterstützung von Musterdefinitionen (reguläre Ausdrücke) mittels Element <pattern> (simpleType) + Vererbung ist möglich. + Konzepte aus Programmier- und Datenbanksprachen + Erweiterbar durch die Nutzung mehrerer Schemas und auch von DTDs - Deklaration von Entities nicht möglich + Hinter einem Schema steht eine DTD, die die benutzte Grammatik überprüft. - Ausdrücke, um komplexe Strukturen darzustellen sind unzureichend. Sie müssen umständlich nachempfunden werden. - Es können keine eigenen Typen (Klassen) für ein Element festgelegt werden. - Nur geringfügig erweiterbar - Nicht für große Applikationen geeignet + Deklarieren von Entities - Hinter einer DTD kann keine weitere Datei zur Überprüfung der eigenen Grammatik stehen. Tabelle 6-1: Vergleich DTD – XML Schema STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 77 - © Prof. J. Goll - 6. XML Schema - Selbst wenn man sich auf Zahlen einigt, bleibt immer noch das Problem, welche Art von Zahlen hier stehen können. Ausgehend vom obigen Beispiel gibt es folgende Möglichkeiten: - ein dezimaler Währungstyp wie in COBOL, eine Festpunktzahl, eine unendlich genaue Gleitpunktzahl wie bei java.math.BigDecimal, eine double-Zahl nach IEEE754, eine double Zahl nach Java, eine float Zahl nach IEEE754, eine Gleitpunktzahl nach VAX Fortran REAL, build 67 of version 45 of MS Word, ein regulärer Ausdruck, der auf alle Strings zutrifft, die mit der Zeichenfolge 45 beginnen, dann ein beliebiges Zeichen haben, und abgeschlossen werden mit der Zeichenfolge 67. Weitere Interpretationen sind zweifellos möglich. Diesem Problem begegnet man in XML Schema, in dem alle Elemente typisiert werden. Damit werden die möglichen Interpretationen eines Strings stark eingeschränkt. Ein Parser kann prüfen, ob ein gegebener String, der sich in einem Element befindet, dem im Schema spezifizierten Typ entspricht. Anwendungen können sich dann darauf verlassen, dass sie ohne Probleme den String gemäß dem Typ interpretieren können. Fehlerhafte Dokumente werden schon vom Parser zurückgewiesen, die Anwendung braucht sich nicht mehr darum zu kümmern. 6.2 Validierung über XML Schema Definitionen Bei XML Schema werden XML Dokumente nun nicht mehr einer DTD zugeordnet, sondern einem Schema, genauer gesagt einer XML Schema Definition (XSD). Dieses Schema selbst ist auch ein XML Dokument, also in der XML Syntax geschrieben. Das benutzte Vokabular ist in einer DTD, bzw. einer weiteren Schema Definition, die im Hintergrund eingebunden ist, definiert. Der genaue Validierungszyklus wird in der folgenden Abbildung verdeutlicht. Damit wird sichergestellt, dass die Ausdrücke für die Deklaration eines XML Dokuments einen Standard haben und dass der bestimmten Regeln (vordefinierten Strukturen und Datentypen) entsprechen muss. Fehler im Schema selbst führen zu einem Abbruch durch den Parser. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 78 - © Prof. J. Goll - 6. XML Schema - Abbildung 6-1: Validierungszyklus eines XML Dokumentes über XML Schema STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 79 - © Prof. J. Goll - 6. XML Schema - 6.2.1 Validierung der XML Schema Definition Die Validierung einer XSD Datei gegenüber der DTD (bzw. dem Schema) für XML Schema erfolgt durch die Einbindung des Schema Namespaces im Wurzelelement der Schema Definition. Dieser Namespace für Schema Definitionen hat die URI http://www.w3.org/2001/XMLSchema. Hier gilt wie vorhin, dass das Präfix beliebig gewählt werden kann. Üblich ist jedoch schon der Name xsd, wie im folgenden Beispiel zu sehen. Der Name des Wurzelelements eines Schemas ist immer schema. <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Liste" type="xsd:string"/> ... </xsd:schema> Dies ist der Inhalt der Datei liste.xsd. Damit wird ein Schema definiert: In einem Instanzdokument können Elemente mit dem Tag-Namen Liste vorkommen, deren Inhalt den Typ xsd:string hat. Die möglichen Typen einer Schema Definition werden weiter unten erläutert. 6.2.2 Einbinden einer Schema Definition in ein XML Dokument Bevor ein XML Dokument gegen ein Schema validiert werden kann, muss es, äquivalent zur DOCTYPE-Angabe bei der Nutzung einer DTD, bekannt machen, dass überhaupt ein Schema vorhanden ist. Parallel wird der Pfad definiert, in dem das Schema (*.xsd) zu finden ist. Das folgende Beispiel zeigt fragmentarisch ein XML Dokument zu dem weiter oben eingeführten Schema liste.xsd. <?xml version="1.0"?> <Liste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="liste.xsd"> Inhalt </Liste> Diese Angaben erfolgen also, indem dem Wurzelelement des XML Dokumentes eine Namespace-Definition für XML Schema Instanzen und das Attribut xsi:noNamespaceSchemaLocation hinzugefügt wird. Der Wert dieses Attributes gibt die URL des Schemas an. Der Namespace (in diesem Fall xsi) muss auf die URI http://www.w3.org/2001/XMLSchema-instance verweisen. Solange der Namespace auf diese URI verweist, darf das Präfix jeden beliebigen Namen annehmen. Mit diesen Angaben kann das XML Dokument jedem Parser übergeben werden, der den neuen Stand der Gültigkeitsprüfung über XML Schema unterstützt. Ein solcher STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 80 - © Prof. J. Goll - 6. XML Schema Parser wird auch als Schema Validator (oder als schema aware) bezeichnet. Seine Arbeit geht weit über das normale Parsen hinaus und umfasst beispielsweise Typprüfungen gemäß dem Schema. Ein XML Dokument, das einem Schema genügt, wird manchmal auch Instanzdokument des Schemas genannt. Das Attribut xsi:noNamespaceSchemaLocation hat folgende Bedeutung: das Schema ist keinem Namensraum zugeordnet (no Namespace) und der Wert dieses Attributes ist die Location (URL), unter der das Schema zu finden ist. XML Schema Definitionen sind mit Blick auf XML Namespaces entworfen worden, während die DTDs noch von SGML stammen. Im nächsten Abschnitt wird kurz erläutert, wie man eine XML Schema Definition einem eigenen Namensraum zuordnet. 6.2.3 Zuordnung zu einem Namespace Einem XML Schema kann ein bestimmter Namensraum zugewiesen werden, indem man innerhalb der Schema Definition einen „Target-Namespace“ definiert. Man kann auch definieren, ob die Elemente im Instanzdokument voll qualifiziert angegeben werden sollen, d.h. mit Namespace-Präfix, oder ob sie ohne Präfix angegeben werden können. Dies kann für Attribute und Elemente getrennt angegeben werden. Hier folgt ein Beispiel, in dem ein Target-Namespace angegeben wurde. Die Elemente im Instanzdokument müssen voll qualifiziert und die Attribute können unqualifiziert angegeben werden. Diese Einstellungen entsprechen auch dem Defaultwert der beiden Attribute. <xsd:schema targetNamespace="http://www.hs-esslingen.de/EssListe" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xsd:element name="Liste" type="xsd:string"/> ... </xsd:schema> Ein XML Dokument, das sich auf dieses Schema bezieht, muss nun den hier definierten Namespace ebenfalls benutzen. Dafür ist das Attribut SchemaLocation vorgesehen. Das entsprechende Instanzdokument sieht damit folgendermaßen aus: STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 81 - © Prof. J. Goll - 6. XML Schema <?xml version="1.0"?> <lst:Liste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lst="http://www.hs-esslingen.de/EssListe" xsi:SchemaLocation= "http://www.hs-esslingen.de/EssListe liste.xsd"> Inhalt </lst:Liste> Zuerst wird der bereits bekannte Namensraum für Instanzdokumente von XML Schemas eingeführt. Dann wird der spezielle Namensraum für Esslinger Listen (http://www.hs-esslingen.de/EssListe) eingeführt mit dem Präfix lst. Zuletzt wird über das Attribut SchemaLocation der mit dem Präfix lst eingeführte Namensraum einer Schema Definition zugeordnet, die in der Datei liste.xsd zu finden ist. D.h. der Wert des Attributes SchemaLocation ist ein Paar bestehend aus Namespace (URI) und einer Datei (XSD). 6.3 Aufbau einer Schema Definition Weiter oben war bereits ein erstes Beispiel einer Schema Definition zu sehen. Wichtig ist, dass im Wurzelelement ein Namespace vergeben wird mit der URI http://www.w3.org/2001/XMLSchema. Als Präfix wird meist xsd gewählt, der Name ist allerdings freigestellt. Der Name des Wurzelelements eines Schemas ist immer <schema>. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ... Hier die Schema Definition ... </xsd:schema> Eine Schema Definition enthält dann vordefinierte Elemente und Attribute, die wiederum die Struktur eines anderen Dokumentes beschreiben. Wie die DTD ist also auch die Schema Definition ein Meta-Dokument. 6.3.1 Definition von Elementen Eine Schema Definition startet mit der Definition der Elemente, die ein XML Dokument beinhalten kann. Dabei wird der Tag-Name definiert und der Inhalt des Elementes typisiert: <xsd:element name="Liste" type="xsd:string"/> <xsd:element name="Datum" type="xsd:date"/> Das erste Beispiel wurde oben bereits erläutert, das Element Liste enthält Strings (xsd:string). Diese Definition könnte genau so gut und so präzise in einer DTD STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 82 - © Prof. J. Goll - 6. XML Schema abgefasst werden. Das zweite Beispiel zeigt nun aber eine präzisere Typisierung: Das Element Datum kann nun nicht mehr beliebige Strings enthalten, sondern nur noch welche, die dem Typ xsd:date genügen. Der Präfix zeigt an, dass es sich um einen Typ aus XML Schema selbst handelt. Dort wird beispielsweise definiert, dass ein Datum vom Typ xsd:date in der Form yyyy-mm-dd geschrieben werden muss. xsd:date und xsd:string gehören zu den sogenannten vordefinierten Typen (built-in types), die also in XML Schema selbst definiert sind. Weiter unten ist eine Übersicht darüber zu finden. Darüber hinaus können eigene Typen in einer Schema Definition definiert werden. Bei den Typen unterscheidet man zwischen einfachen Typen (simple types) und zusammengesetzten Typen (complex types). Sämtliche vordefinierte Typen sind einfache Typen. Attribute müssen über zusammengesetzte Typen spezifiziert werden. Zusammengesetzte Typen werden auch benötigt, wenn man die Schachtelung von Elementen ausdrücken will. Auf Grund der Forderung der XML Grammatik, dass ein Dokument genau ein Wurzel-Element haben darf, sind alle anderen Elemente auf irgendeine Weise darin geschachtelt. Das führt dazu, dass eine Schema Definition auf der obersten Ebene genau ein Element einführt (das Wurzel-Element), das einen komplexen Typ hat, in dem die Schachtelung weiterer Elemente spezifiziert wird. Der allgemeine Aufbau einer Schema Definition folgt damit dem folgenden Muster: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="myRoot" type="rootType"/> <xsd:complexType name="rootType"> ... Definition der geschachtelten Elemente ... </xsd:complexType> ... gegebenfalls weitere Typdefinitionen ... </xsd:schema> ToDo: mehrere Elemente?? STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 83 - © Prof. J. Goll - 6. XML Schema - 6.3.2 Vordefinierte Typen Die folgende Abbildung zeigt die einfachen Datentypen, welche in XML Schema definiert sind (built-in) sowie deren Beziehungen untereinander. Alle komplexen Datentypen müssen selbst definiert werden, aber auch einfache Datentypen können selbst definiert werden. Abbildung 6-2: Hierarchie der Built-In Datentypen STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 84 - © Prof. J. Goll - 6. XML Schema - 6.3.3 Definition von einfachen Typen Einfache Typen entstehen in sogenannten simpleType-Definitionen. In der einfachsten Form gibt man einem bereits existierenden Typ einfach nur einen anderen Namen (wie bei einem typedef in C): <xsd:simpleType name="Test" type="xsd:string"/> Damit wird ein neuer Typ mit dem Namen Test definiert, der aber nichts anderes ist als xsd:string. Der neue Name kann selbst wieder in weiteren Typdefinitionen benutzt werden: <xsd:simpleType name="Test2" type="Test"/> Eine solche simpleType-Definition kann noch mit Einschränkungen versehen werden, die den möglichen Wertebereich des Grundtyps betreffen. Man spricht dann auch von einem abgeleiteten Typ (derived type), der Mechanismus ist durchaus vergleichbar mit der Vererbung in objekt-orientierten Sprachen. Die simpleTypeDefinition erhält dann folgende Form: <xsd:simpleType name="telefonNum"> <xsd:restriction base="xsd:string"> Art der Einschränkung über Facetten </xsd:restriction> </xsd:simpleType> Es wird also angegeben, dass man eine Einschränkung machen will und auf welchen Typ (base). Als Kind-Elemente des restriction-Elementes können dann die eigentlichen Einschränkungen (Facetten) spezifiziert werden, die allerdings vom Grundtyp (base type) abhängen. Mögliche Facetten sind: • • • • • • • • • • die Länge (length) die minimale Länge (minLength) die maximale Länge (maxLength) ein Muster (pattern) eine Aufzählung (enumeration) maximale Werte (maxInclusive, bzw. maxExclusive) minimale Werte (minInclusive, bzw. maxInclusive) Anzahl der Ziffern (totalDigits) Anzahl der Nachkommastellen (fractionDigits) Behandlung von Whitespace (whiteSpace) Einige Beispiele sollen die Möglichkeiten von Facetten zur Typdefinition aufzeigen. In folgendem Beispiel wird ein neuer Typ definiert, welcher vom Datentyp xsd:string abgeleitet ist. Der neue Typ wird über den regulären Ausdruck im Attribut value der Facette pattern eingeschränkt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 85 - © Prof. J. Goll - 6. XML Schema - <xsd:simpleType name="telefonNum"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\p{Nd}+\-\p{Nd}+"/> </xsd:restriction> </xsd:simpleType> Die regulären Ausdrücke, die hier angegeben werden können, lehnen sich an die Möglichkeiten von Perl an mit den Unicode-Erweiterungen aus Perl 5.6. Im obigen Beispiel kommen die folgenden Pattern vor: Menge der dezimalen Ziffern im Unicode ein Auftreten eines Zeichens aus der Unicode Menge A Minuszeichen Wiederholung des Ausdrucks A 1 bis n mal Nd \p{A} \A+ Weitere häufig gebrauchte Pattern erinnern auch an die Schreibweise für reguläre Ausdrücke in dem UNIX-Tool lex: A* A? [a-e] [aeiou] [^0-9] . (A|B) A{2,4} Wiederholung des Ausdrucks A 0 bis n mal Ausdruck A ist optional Menge der Zeichen a, b, c, d und e Menge der Zeichen a, e, i, o und u Komplementärmenge der Zeichen 0 bis 9 irgendein Zeichen Ausdruck A oder B Wiederholung des Ausdrucks A mindestens 2 höchstens 4 mal Eine andere Art von Facette ist die Aufzählung, hier im Beispiel die möglichen Werte eines Elementes, das einen Medien-Typ besitzt: <xsd:simpleType name="mediaType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="8mm" /> <xsd:enumeration value="vhs" /> <xsd:enumeration value="vhsc" /> <xsd:enumeration value="digital" /> <xsd:enumeration value="audio" /> </xsd:restriction> </xsd:simpleType> Ein letztes Beispiel zeigt die Einschränkung des Wertebereiches bei ganzen Zahlen auf das Intervall [1,9999]: <xsd:simpleType name="myNumber"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1" /> <xsd:maxInclusive value="9999" /> </xsd:restriction> </xsd:simpleType> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 86 - © Prof. J. Goll - 6. XML Schema Wie bereits erwähnt hängen die erlaubten Facetten vom Grundtyp ab. So macht es etwa keinen Sinn, für Strings einen Min- oder Max-Wert zu definieren, bzw. für eine ganze Zahl ein Muster anzugeben. Die so entstandenen neuen einfachen Typen können wie die built-in Typen verwendet werden. D.h. sie können zur Definition eines Elements verwendet werden: <xsd:element name="newNumber" type="myNumber"/> oder, wie im folgenden Beispiel in einer Typdefinition weiter eingeschränkt werden. <xsd:simpleType name="yourNumber"> <xsd:restriction base="myNumber"> <xsd:minInclusive value="1000" /> <xsd:maxInclusive value="1999" /> </xsd:restriction> </xsd:simpleType> Aus dem Typ myNumber wird der Typ yourNumber mit einem noch kleineren Intervall. 6.3.4 Lokale, Globale und Anonyme Typen In den bisherigen Beispielen wurden die neuen Typen immer mit einem Namen versehen. Über diesen Namen können sie dann in Element- oder Attributdeklarationen verwendet werden. <xsd:simpleType name="myNumber"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1" /> <xsd:maxInclusive value="9999" /> </xsd:restriction> </xsd:simpleType> <xsd:element name="newNumber" type="myNumber"/> Ist die Definition (hier das simpleType-Element) ein direkter Abkömmling des schema-Elementes, dann spricht man von einer globalen Deklaration und der Typname ist praktisch überall sichtbar. Globale Deklarationen wird man dann benutzen, wenn ein Typ häufig vorkommt, beispielsweise haben Attribute häufig den gleichen Typ. Im folgenden Beispiel wird der Typ nameType eingeführt und hinterher für die Elemente Name und Vorname benutzt. Die Bedeutung von komplexen Typen und vom sequence-Element wird weiter unten erläutert. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 87 - © Prof. J. Goll - 6. XML Schema <xsd:simpleType name="nameType"> <xsd:restriction base="xsd:string"> ... </xsd:restriction> </xsd:simpleType> <xsd:complexType name="VorundNachname> <xsd:sequence> <xsd:element name="Vorname" type="nameType"/> <xsd:element name="Nachname" type="nameType"/> </xsd:sequence> </xsd:complexType> Auch dieser neu entstandene komplexe Typ wäre ein globaler Typ, wenn er direkter Abkömmling des schema-Elementes wäre. Ist eine Typdefinition tiefer in der Schema-Definition eingebettet, also nicht direkter Abkömmling des schema-Elementes, dann spricht man von lokalen Definitionen. Lokale Namen sind nur auf der gleichen Ebene oder in noch tiefer liegenden Unterbäumen sichtbar. Somit kann man eine gewisse Lokalität von Namen erreichen, was sicher für umfangreiche Schema Definitionen wichtig ist. Lokale Namen spielen in dieser Einführung keine Rolle. Viele Strukturen wird es in einer Schema Definition genau einmal geben. In diesen Fällen braucht man sich keinen Namen zu überlegen und sich nicht um die Frage lokal oder global zu kümmern, sondern man kann die Typdefinition genau dort einfügen, wo sie gebraucht wird, ohne ihr einen Namen zu geben. Man spricht von anonymen Typen. Sie können dann aber natürlich auch nicht wieder verwendet werden. Das einleitende Beispiel zu diesem Abschnitt könnte mit einem anonymen Typ folgendermaßen formuliert werden: <xsd:element name="newNumber"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1" /> <xsd:maxInclusive value="9999" /> </xsd:restriction> </xsd:simpleType> <xsd:element/> Eingeschlossen in die element-Definition ist nun eine simpleType-Definition ohne Namen. Beispiele für die Verwendung solcher anonymen Typen sind im Folgenden häufig zu finden. 6.3.5 Definition komplexer Typen Eine der Restriktionen von einfachen Typen ist, dass diese Elemente keine Attribute haben können. Ebenso können Elemente von einfachen Typen keine Kind-Elemente haben. In beiden Fällen muss man komplexe Typen definieren. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 88 - © Prof. J. Goll - 6. XML Schema Die einfachste Art, um Attribute zu definieren, besteht darin, der Element-Definition noch eine complexType-Definition hinzuzufügen: <xsd:element name ="telefon"> <xsd:complexType> <xsd:attribute name="Anschluss" type="xsd:string"/> <xsd:attribute name="Netz" type="xsd:string"/> </xsd:complexType> </xsd:element> In diesem Falle wurde ein sogenannter anonymer Typ definiert, denn der komplexe Typ im Inneren der Element-Definition hat keinen Namen. Natürlich kann auch ein komplexer Typ benannt werden und damit über den Namen an anderen Stellen wieder benutzt werden: <xsd:complexType name="telefonType"> <xsd:attribute name="Anschluss" type="xsd:string"/> <xsd:attribute name="Netz" type="xsd:string"/> </xsd:complexType> Mit komplexen Typen können also Elemente definiert werden, die Struktur (also geschachtelte Elemente) und/oder Attribute besitzen. Mit einfachen Typen hingegen können nur Elemente beschrieben werden, die einen einfachen Text als Inhalt haben. Die verschiedenen Möglichkeiten von komplexen Typen werden nun in den folgenden Abschnitten beschrieben 6.3.6 Hierarchie der Elemente Wenn man eine Hierarchie von Elementen definieren will, dann geht das ebenfalls über complexType-Definitionen. Im Wesentlichen kann man dabei vier Fälle unterscheiden: Folgen von Elementen (sequence), Auswahl zwischen mehreren Möglichkeiten (choice), Wiederholungen (occurs) und Mengen (all), bei denen die Reihenfolge keine Rolle spielt. Um auszudrücken, dass ein Element ein oder mehrere Kind-Elemente haben kann, definiert man einen komplexen Typ (auch hier wieder der Einfachheit halber anonym), in dem die möglichen Elemente der Reihenfolge nach aufgezählt werden in einer sogenannten sequence-Definition: <xsd:element name="Name"> <xsd:complexType> <xsd:sequence> <xsd:element name="Anrede" type="xsd:string"/> <xsd:element name="Vorname" type="xsd:string"/> <xsd:element name="Nachname" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> Ein Element Name enthält Kind-Elemente mit den Tag-Namen Anrede, Vorname, Nachname. Sie müssen auch in dieser Reihenfolge erscheinen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 89 - © Prof. J. Goll - 6. XML Schema - Leider benötigt man schon im einfachen Fall, dass ein Element in einem anderen geschachtelt auftreten kann, eine sequence-Definition in einem komplexen Typ. Während die sequence-Definition alle möglichen Kind-Elemente aufzählt und ihre Reihenfolge festlegt, kann mit Hilfe der choice-Definition eine Auswahl unter Alternativen spezifiziert werden: <xsd:element name="Adressenteil"> <xsd:complexType> <xsd:choice> <xsd:element name="Postfach" <xsd:element name="Strasse" </xsd:choice> </xsd:complexType> </xsd:element> type="xsd:string"/> type="xsd:string"/> In einem solchen Adressenbestandteil kann entweder nur das Postfach oder die Strasse erscheinen. Oft gibt es Elemente, die optional sind oder mehrfach auftreten können, von denen die Häufigkeit des Auftretens bekannt sein kann oder nicht. Dies kann durch occurs-Zusätze bei der Element-Deklaration spezifiziert werden: <xsd:complexType name="TelefonType"> <xsd:sequence> <xsd:element name="Nummer" type="telefon" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> Das Element mit dem Namen Nummer muss mindestens einmal erscheinen, es kann beliebig oft (unbounded) erscheinen. <xsd:complexType name="AdresseType"> <xsd:sequence> <xsd:element name="Name" type="NameType" minOccurs="1" maxOccurs="1"/> <xsd:element name="Telefon" type="TelefonType" minOccurs="0" maxOccurs="1"/> <xsd:element name="Email" type="EmailType" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> Die Elemente Telefon und Email sind optional, während der Name genau einmal erscheinen muss. Letzteres kann natürlich einfacher ausgedrückt werden: wenn keine Wiederholung angegeben wird, wie in den ersten Beispielen zu sehen. Denn STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 90 - © Prof. J. Goll - 6. XML Schema die Defaultwerte für beide Attribute sind 1 und diese Kombination bedeutet ja gerade, dass das Element genau einmal vorkommen muss. Eine weitere Möglichkeit den Inhalt eines Elementes zu beschreiben, ist das allElement. Alle Elemente in der Gruppe können einmal oder gar nicht auftreten, und zwar in beliebiger Reihenfolge. Die Kind-Elemente dürfen nur einzeln auftreten, d.h. wenn maxOccurs steht, muss es den Wert 1 haben. minOccurs kann den Wert 0 haben, wenn das Element optional ist. <xsd:complexType name="AdresseType"> <xsd:all> <xsd:element name="Name" type="NameType"/> <xsd:element name="Telefon" type="TelefonType"/> <xsd:element name="Email" type="EmailType"/> </xsd:all> </xsd:complexType> 6.3.7 Geschachtelte Elemente und Attribute Wenn ein Element sowohl geschachtelte Elemente und Attribute haben kann, können in der Definition des komplexen Typs für ein solches Element neben der HierarchieDefinition auch Attribut-Definitionen stehen: <!-- Definition fuer Adresse --> <xsd:complexType name="AdresseType"> <xsd:sequence> <xsd:element name="Name" type="NameType" minOccurs="1" maxOccurs="1"/> <xsd:element name="Telefon" type="TelefonType" minOccurs="0" maxOccurs="1"/> <xsd:element name="Email" type="EmailType" minOccurs="0" maxOccurs="1"/> </xsd:sequence> <xsd:attribute name="Art" type="EintragsArt"> </xsd:complexType> Das Beispiel geht über das ursprüngliche Adressbuch hinaus und würde es erlauben, dass man die Einträge nach ihrer Art, etwa privat und beruflich, unterscheiden kann. Dazu dient das Attribut Art, das in der complexType-Definition zu finden ist. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 91 - © Prof. J. Goll - 6. XML Schema - 6.3.8 Komplexe Typen für gemischten Inhalt In den bisherigen Beispielen gab es die Einschränkung, dass ein Element entweder nur Attribute oder nur Kind-Elemente besitzt, oder beides, aber es konnte insbesondere keinen eigenen Inhalt haben. Um innerhalb eines Elements sowohl Text als auch Subelemente als Inhalt zu erlauben, wird bei der Definition des complexType das Attribut mixed auf true gesetzt. <xsd:element name="Adresse"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="Name" type="xsd:string"/> <xsd:element name="Telefon" type="xsd:string"/> <xsd:element name="Email" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> Ein Dokument kann damit wie folgt aussehen: <Adresse> Hier kann jetzt beispielsweise irgendein text stehen <Name> Manfred Mustermann </Name> oder hier <Telefon> 0815-4711 </Telefon> oder hier <Email>[email protected]</Email> oder auch noch hier. </Adresse> 6.3.9 Erweiterungen und Einschränkung von komplexen Typen Neben den einfachen Typen können auch komplexe Typen eingeschränkt, oder aber auch erweitert werden. Darauf kann in dieser Einführung nicht eingegangen werden. 6.3.10 Dokumentation eines Schemas Um die Lesbarkeit und die Verständlichkeit eines Schemas zu erhöhen, kann ein Schema-Dokument auch mit Hinweisen und Kommentaren versehen werden. XML Schema stellt dazu das xsd:annotation Element zur Verfügung. Für Erklärungen, die von Menschen gelesen werden sollen, wird das documentation-Element empfohlen. Für Hinweise, die von verarbeitenden Programmen gelesen werden sollen, wird das appinfo-Element verwendet. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 92 - © Prof. J. Goll - 6. XML Schema <xsd:annotation> <xsd:documentation> Beispiel fuer eine Dokumentation </xsd:documentation> <xsd:appinfo> use Adressbuch.xsl to transform </xsd:appinfo> </xsd:annotation> 6.4 XML Schema Beispiel Das folgende Schema ist in der Datei Adressbuch.xsd enthalten und beschreibt die gleichen Adressbuchdokumente, die bisher durch Adressbuch.dtd beschrieben wurden. <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- Globale Elementdefinition fuer die Wurzel --> <xsd:element name="Adressbuch" type="AdressbuchType"/> <!-- Definition fuer Adressbuch --> <xsd:complexType name="AdressbuchType"> <xsd:sequence> <xsd:element name="Adresse" type="AdresseType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- Definition fuer Adresse --> <xsd:complexType name="AdresseType"> <xsd:sequence> <xsd:element name="Name" type="NameType"/> <xsd:element name="Telefon" type="TelefonType/>" <xsd:element name="Email" type="EmailType" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> <!-- Definition fuer Name --> <xsd:complexType name="NameType"> <xsd:sequence> <xsd:element name="Anrede" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="Vorname" type="xsd:string"/> <xsd:element name="Nachname" type="xsd:string"/> </xsd:sequence> </xsd:complexType> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 93 - © Prof. J. Goll - 6. XML Schema <!-- Definition fuer Telefon --> <xsd:complexType name="TelefonType"> <xsd:sequence> <xsd:element name="Nummer" type="NummerType" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- Definition fuer Email --> <xsd:complexType name="EmailType"> <xsd:sequence> <xsd:element name="Emailadresse" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- Definition fuer Anschluss --> <xsd:simpleType name="AnschlussType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="privat"/> <xsd:enumeration value="mobil"/> </xsd:restriction> </xsd:simpleType> <!-- Definition fuer Nummer --> <xsd:complexType name="NummerType"> <xsd:simpleContent> <xsd:extension base="telefonNum"> <xsd:attribute name="Anschluss" use="required" type="AnschlussType"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <!-- Definition einer Telefonnummer mit regulaerem Ausdruck --> <xsd:simpleType name="telefonNum"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\p{Nd}+\-\p{Nd}+"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 94 - © Prof. J. Goll - 6. XML Schema - 6.5 XML Binding for Java JAXB (XML Binding for Java) ist eine von SUN implementierte weitere Variante zur Bearbeitung von XML Dokumenten in Java. JAXB ermöglicht es aufgrund eines XML Schemas Java-Klassen zu erstellen, die dessen Struktur nachbilden. Wurden diese Java-Klassen erstellt, können XML Dokumente, die dem zugrunde liegenden XML Schema gehorchen, in die Java-Klassen eingelesen werden und dort, im Vergleich zu DOM, sehr komfortabel und einfach bearbeitet werden. JAXB ist im Paket JAXB verfügbar und kann somit in jedem Java JDK seit 1.4 benutzt werden. 6.5.1 Arbeitsweise von JAXB Bevor eine XML-verarbeitende Applikation in JAXB erstellt werden kann, müssen zunächst die Klassen generiert werden, die das XML Dokument später repräsentieren. Für die Erstellung dieser Klassen wird zunächst ein XML Schema benötigt, dem das später zu bearbeitende XML Dokument gehorcht. D.h. für jedes Schema, also für jede XML Dokumentenklasse, gibt es einen eigenen Satz von Klassen, mit denen man Instanzdokumente bearbeiten kann. DOM ist dagegen ein allgemeines Interface, das es erlaubt, alle XML Dokumente zu verarbeiten. Das folgende Bild aus [HoUl01] zeigt die prinzipielle Arbeitsweise von JAXB: Abbildung 6-3: Arbeitsweise von JAXB Benötigt wird demnach ein Schema Compiler, der aus dem Ausgangsschema eine Menge von abhängigen Klassen generiert, sowie ein Binding Framework, auf welchem die erzeugten Klassen aufbauen. Die vom Binding Framework bereitgestellten Klassen implementieren grundlegende Operationen wie das Lesen (unmarshal) und Speichern (marshal) von XML Dokumenten, also die Abbildung von Instanzen der erzeugten Klassen auf XML Dokumente und umgekehrt, sowie das Validieren der Objekte und Dokumente. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 95 - © Prof. J. Goll - 6. XML Schema - 6.5.2 Aufbau der generierten Klassen Um den Aufbau der generierten Klassen zu zeigen, wird wieder das Beispiel des Adressbuches verwendet. In der Adressbuch-Schema-Definition werden insgesamt fünf ComplexTypes (AdressbuchType, AdresseType, NameType, TelefonType, EmailType) definiert. Aus jedem dieser ComplexTypes wird jeweils ein Interface generiert. Jedes dieser Interfaces definiert get- und setMethoden, mit denen die Unterelemente eines solchen ComplexTypes geholt oder gesetzt werden können. Auch für jedes Attribut eines ComplexTypes werden set- und get-Methoden erstellt. Hier folgt als Beispiel das generierte Interface für AdresseType: //AdresseType.java import generated.*; public interface AdresseType { generated.EmailType getEmail(); void setEmail(generated.EmailType value); generated.TelefonType getTelefon(); void setTelefon(generated.TelefonType value); generated.NameType getName(); void setName(generated.NameType value); } Hier werden die Schnittstellen definiert, mit denen der Programmierer die Möglichkeit hat ein AdresseType-Element zu bearbeiten. Bei get-Methoden wird jeweils ein Objekt des jeweiligen Subelements zurückgegeben, für die ja ebenfalls Klassen und Interfaces erzeugt wurden. Bei den set-Methoden wird jeweils ein Objekt des jeweiligen Subelements als Parameter übergeben. Ein weiteres Beispiel zeigt die Umsetzung des Wurzelelements, also das zu AdressbuchType generierte JAXB-Interface: //AdressbuchType.java import generated.*; public interface AdressbuchType { java.util.List getAdresse(); } Ein AdressbuchType-Element ist aus einer unbestimmten Anzahl an Unterelementen des Typs AdressseType aufgebaut. Das Adressbuch kann also STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 96 - © Prof. J. Goll - 6. XML Schema eine unbestimmte Anzahl an Einträgen beinhalten. In dem Interface wird nun lediglich die get-Methode getAdresse() definiert, die ein List-Objekt als Rückgabewert besitzt. Über diese Methode kann sich der Programmierer die Liste aller bereits in das Adressbuch eingetragenen Adressen holen um diese auszulesen oder zu bearbeiten. Diese Liste beinhaltet Objekte der Klasse AdresseType, die jeweils eine einzelne Adresse darstellen. Um eine neue Adresse anzuhängen muss lediglich mit den in Java bekannten List-Methoden ein AdresseType-Objekt in die Liste eingefügt werden. Die generierten Interface-Klassen der restlichen ComplexType-Elemente sind nach demselben Muster mit set- und get-Methoden aufgebaut. Diese Methoden sind die einzigen Methoden, die ein Programmierer zur Bearbeitung eines XML Dokuments benötigt. Dies macht die Programmierung recht einfach, da fast ausschließlich klassische Java-Kenntnisse über die Arbeit mit Klassen und deren set- und getMethoden sowie die Arbeit mit Listen benötigt werden. Spezifische JAXB-Klassen und Methoden kommen nur recht selten zum Einsatz und sind zudem nicht sehr komplex. Im Folgenden werden die wichtigsten Klassen erläutert. 6.5.3 JAXB-API Die JAXB-API stellt das eigentliche Binding Framework dar. Die wichtigsten Klassen und Interfaces der JAXB-API befinden sich im Paket javax.xml.bind.*. Im Einzelnen sind dies: • Interface Unmarshaller: In diesem Interface werden alle für den UnmarshallerVorgang notwendigen Methoden definiert. Unter diesem Vorgang versteht man das Einlesen von XML-Daten in die von JAXB erstellten Klassen. • Interface Marshaller: In diesem Interface werden alle für den MarshallerVorgang notwendigen Methoden definiert. Unter diesem Vorgang versteht man die Ausgabe der XML-Daten aus den von JAXB erstellten Klassen. • Interface Validator: Im Gegensatz zur Validierung beim Einlesen der XML-Daten gibt es in JAXB auch die Möglichkeit der sogenannten. On-Demand Validation. Dabei können während der Laufzeit der JAXB-Applikation, die in den JAXBKlassen befindlichen Daten gegen die Schema-Defnition validiert werden. Für diese Zwecke benötigt man eine Instanz des Interfaces Validator. • Die abstrakte Klasse JAXBContext: Mit dieser Klasse lassen sich Instanzen der Interfaces Marshaller, Unmarshaller und Validator erstellen. Sie bildet daher die Basis einer jeden JAXB-Applikation. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 97 - © Prof. J. Goll - 6. XML Schema - 6.5.4 Bewertung Einer der Vorteile von JAXB ist, dass der Programmierer, nachdem die XML Daten in die Java-Klassen eingelesen wurden, fast ausschließlich die recht einfach zu durchschauenden Methoden der erstellten Klassen benutzen kann um sein XML Dokument zu bearbeiten. Die JAXB eigenen Methoden aus der JAXB-API müssen nur recht selten verwendet werden. Somit muss der Programmierer sich nicht erst langwierig in eine neue API und Vorgehensweise einarbeiten, sondern kann auf seine bekannten Programmierkenntnisse zurückgreifen. Außerdem muss der Programmierer über keine großen XML Kenntnisse verfügen. Beispielapplikationen mit dem Adressbuch wurden im Rahmen einer Studienarbeit [Tri03] entworfen und mit dem Vorgehen in DOM und SAX verglichen. Ein weiterer Vorteil von JAXB liegt in der Validierung der Daten. Es ist jederzeit möglich die im Speicher befindlichen Daten zu validieren, also nicht nur beim Einlesen, wie bei DOM und SAX. Bei DOM Level 3 ist das inzwischen allerdings auch möglich. Ein Nachteil von JAXB ist, dass die JAXB-Klassen lediglich aufgrund von SchemaDefinitionen erstellt werden können. Es ist also nicht möglich mit den etwas einfacheren DTDs zu arbeiten. Ansätze für XML Bindings basierend auf DTDs sind allerdings auf dem Markt verfügbar [HoUl01]. 6.6 Zusammenfassung XML Schema bringt unter anderem folgende Features, die die Einschränkungen von DTDs überwinden: • • • • • Datentypen Mächtigere Strukturierungsmöglichkeiten mit abstrakten Typen Bedingte Teilstrukturen Minimale/Maximale Vorkommen für Elemente Kardinalität Leider führen diese neuen Möglichkeiten auch dazu, dass Definitionen mit XML Schema deutlich komplexer ausfallen als DTDs. Die Komplexität und die neuen Möglichkeiten haben auch Auswirkungen auf die Performance beim Arbeiten mit XML Dokumenten. In einer Studienarbeit [Book02] wurde ein Performance-Vergleich durchgeführt, um die zeitlichen Auswirkungen bei einer Validierung von XML Dokumenten gegen XML Schema Definitionen statt gegen Document Type Definitions zu untersuchen. Dieser Performance-Test erbrachte folgende Erkenntnisse: Bei der Validierung ergeben sich gravierend verlängerte Parse-Zeiten, wenn eine Validierung gegen eine XML Schema Definition erfolgen soll. Der Faktor, um den sich die Parse-Zeit eines Dokumentes gegenüber einer Validierung gegen eine DTD vergrößert, liegt zwischen 2 und 3 (in Abhängigkeit von der Größe des jeweils geparsten XML Dokumentes). STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 98 - © Prof. J. Goll - 6. XML Schema Auf Grund der gegenüber DTDs erweiterten Sprachmittel der XSDs ist der Validierungsaufwand bei XSDs von Natur aus höher. Bei dem genannten Faktor lohnt sich allerdings eine Überlegung, ob unbedingt gegen eine XML Schema Definition validiert werden muss oder ob eine Validierung gegen eine DTD nicht doch ausreichend ist. Unter diesem Hintergrund werden Schema Definitionen auf Grund ihrer Präzision und ihrer Möglichkeiten häufig nur für eine genaue Beschreibung benutzt, quasi als Schnittstellen-Dokumentation, während für die Validierung eine DTD bereitgestellt wird. Bei verlässlichen Quellen (z.B. aus getesteten Software-Systemen) kann man sich sogar auf eine reine well-formed-Prüfung ohne DTD beschränken. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 99 - © Prof. J. Goll - 7. Linking in XML - 7 Linking in XML 7.1 Übersicht XML unterstützt ein wesentlich weitergehendes Linking, als es von HTML bekannt ist. Das W3C entwickelte ein Linking-Modell für XML, das aus XML Linking Language (XLink) und XML Pointer Language (XPointer) besteht. Das Modell soll neben unidirektionalen Links (wie sie heute in HTML verwendet werden) auch multidirektionale Links, die auf mehrere Ressourcen gleichzeitig verweisen, und bidirektionale Links, die in beide Richtungen referenzieren, unterstützen. XLink spezifiziert neben den aus HTML bekannten einfachen, unidirektionalen Links auch erweiterte Links. Diese erweiterten Links eröffnen die Möglichkeit, gleichzeitig auf mehrere andere Dokumente oder Dateien zu verweisen. Die referenzierten Dokumente öffnen sich dann z.B. bei einem Webbrowser wahlweise alle in einem Browserfenster oder in getrennten Fenstern. Daneben sind in der XLink-Spezifikation auch bidirektionale Links vorgesehen, die in beide Richtungen referenzieren können. Hinzu kommt noch die Möglichkeit, Links außerhalb des Dokumentes, zu dem sie gehören, verwalten zu können. XPointer stellen daneben ein weiteres mächtiges Modell für das Linking in XML Dokumenten dar. Mit XPointer ist es möglich, auf bestimmte Elemente einer XML Instanz zu verweisen und zuzugreifen. Es wird ermöglicht, direkt auf der Baumstruktur eines XML Dokumentes zu navigieren. Mit XPointer hat man somit auch die Möglichkeit, ähnlich wie mit SQL, Abfragen aus Datenbeständen vorzunehmen. Abbildung 7-1: Linking in XML Ein XML Dokument kann unabhängig von seiner logischen Struktur aus beliebig vielen physischen Einheiten bestehen. Dies ermöglicht es – im Zusammenspiel von XLink und XPointer – in einem Netzwerk verteilte Daten zu einem einzigen XML Dokument zusammenzufügen. Die Möglichkeiten dieser Linking-Modelle sind noch STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 100 - © Prof. J. Goll - 7. Linking in XML weit vielfältiger, allerdings zeigen bereits diese Ausführungen die Mächtigkeit der Linking-Möglichkeiten in XML. Die W3C-Recommendations zu XPointer und XLink detailliert zu beleuchten würde zu weit führen, darum sollen hier lediglich die Grundfunktion der Spezifikationen und die bedeutendsten Features aufgezeigt werden. 7.2 XLink Xlink stellt eine Menge von Attributen zur Verfügung, die bei allen Elementen stehen können, um einen Link zu beschreiben. Der Namespace für diese Attribute ist http://www.w3.org/1999/xlink. Meist wird als Präfix xlink verwendet, was aber wie bereits bekannt nicht zwingend ist. Hier nun eine Übersicht über diese Attribute: type gibt den Typ des XLink-Elementes an. href gibt die URI an, unter der die Ressource gefunden werden kann. role spezifiziert die Funktion des Links in einer maschinen-lesbaren Form. title spezifiziert die Funktion des Links in einer menschen-lesbaren Form. show gibt an, wie die Ressource angezeigt wird, wenn sie gefunden ist. actuate gibt an, wann die Ressource gesucht werden soll. from, to spezifizieren die Link-Richtung, da die Xlinks nicht notwendigerweise unidirektional sind. Welches Attribut überhaupt benutzt werden kann, hängt vom type ab, den man gewählt hat. Es gibt insgesamt 6 Typen von Links: simple, extended, locator, arc, resource und title. Simple Links und Extended Links definieren die eigentlichen Links, während die anderen benutzt werden im Kontext eines Extended Links, um zusätzliche Information über den Link zur Verfügung zu stellen. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 101 - © Prof. J. Goll - 7. Linking in XML Die einfachste Art eines XLinks ist somit gar nicht sehr verschieden von einem HTML Link: <Adresse> ... <picture xlink:type="simple" xlink:href="picture.jpg" xlink:actuate="onRequest" xlink:show="embed" xlink:title="Click to see picture!"> Click here to see a picture! </picture> </Adresse> Auf diese Art könnte man in das Adressbuch auch Links auf Bilder der Leute einbauen. In diesem Beispiel erscheint das Bild allerdings nur, wenn auf den Text des Elementes picture, nämlich Click here to see picture! geclickt wird. Der Text wird dann durch das Bild ersetzt. Dieses Verhalten wird durch die entsprechenden Attributwerte von actuate und show herbeigeführt. Die insgesamt möglichen Attributwerte sowie die komplexen Extended Links müssen bei Bedarf nachgeschlagen werden. 7.3 XPointer Mit XLinks kann man auf beliebige Dokumente, nicht nur auf XML Dokumente, verweisen. Manchmal möchte man jedoch auf ein ganz bestimmtes Teil, bespielsweise ein Kapitel oder eine Textstelle in einem anderen Dokument verweisen. Dazu dient XPointer, allerdings mit der Einschränkung, dass XPointer nur auf Teile eines XML Dokumentes verweisen kann. XPointer definiert sogenannte XPointer Ausdrücke, die an einen URI angehängt werden können, sodass sie damit im Kontext von Links (href) benutzt werden können. Anstatt auf das Adressbuch in ab.xml zu verweisen, ist es mit XPointer möglich auf das Name-Element in dieser Datei zu verweisen, bei dem der Vorname gleich "Max" ist. Diese Ausdrücke basieren auf XPath. Alle Knoten, die über XPath Ausdrücke erreichbar sind, können auch in XPointer adressiert werden. Dazu kommen aber noch einzelne Punkte und ganze Bereiche in einem XML Dokument. Die Syntax von XPointer wird an folgendem Beispiel ersichtlich: http://www.hs-esslingen.de/ab.xml#xpointer(//Vorname) Der URI zeigt auf die Datei ab.xml, daran angehängt ist nun ein XPointer Ausdruck in den Klammern, in diesem Fall ein einfacher XPath Ausdruck //Vorname. Eine STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 102 - © Prof. J. Goll - 7. Linking in XML Xpointer-Applikation ist dann nur noch mit Vorname-Elementen aus dem Adressbuch beschäftigt. Diese Konstruktion kann in Zusammenhang mit einem Link benutzt werden: <AlleVornamen xlink:type="simple" xlink:href= "http://www.hs-esslingen.de/ab.xml#xpointer(//Vorname)" xlink:actuate="onLoad" xlink:show="embed" xmlns:xlink="http://www.w3.org/1999/xlink"/> In diesem Fall würde beim Laden alle Vorname-Elemente aus der Datei ab.xml in das AlleVornamen-Element eingefügt. Im Unterschied zu HTML braucht man aber hier das XML Dokument ab.xml nicht zu verändern. In HTML müsste man in ab.xml einen Anker mit <a> einbauen, auf den man sich in einer URL beziehen kann. Das ist aber eine ganz wichtige Eigenschaft, dass man das Dokument, auf das man sich beziehen möchte, nicht ändern braucht. Oft kann man es ja auch gar nicht ändern, weil es einem gar nicht gehört. XPointer dient zur Lokalisation von Sub-Ressourcen in XML Dokumenten und ermöglicht Links in XML Dokumente hinein, auch in das eigene. Es kann im XML Baum suchen, kann Knoten des Baumes adressieren, kann Teile von Elementen adressieren und kann Abschnitte im Text addressieren. Es geht weit über das URL#nnn-Konzept von HTML hinaus. Auch hier wird für Einzelheiten auf Fachliteratur verwiesen. ToDo: Zusammenfassung STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 103 - © Prof. J. Goll - 8. Web Services - 8 Web Services Hinter Web Services steht die Idee, bereits vorhandene, offene Technologien zusammenzufassen und für die Kommunikation zwischen Anwendungen und Anwendungsteilen zu nutzen. Bereits bestehende Anwendungen sollen mit geringem Aufwand integriert werden können. Es existieren eine Reihe von anderen Technologien wie etwa CORBA oder DCOM, die ebenfalls für die Integration von Anwendungen entwickelt wurden. Diese Technologien sind jedoch häufig auf bestimmte Plattformen beschränkt, oder kompliziert zu implementieren. Mit Web Services können Service-orientierte Architekturen verwirklicht werden, d.h. es stehen nicht mehr Anwendungen im Vordergrund, sondern Dienste. Diese Dienste lassen sich sowohl innerhalb eines Unternehmens, als auch zwischen Unternehmen anbieten und verwenden. Web Services stellen solche Dienste dar. Sie sind zudem auf den Einsatz im Web optimiert. Als weiteres Merkmal werden Web Services nur durch ihre Schnittstelle beschrieben, die Implementierung bleibt dem Nutzer verborgen. Zu diesem Zweck existiert eine eigene Beschreibungssprache, WSDL (Web Service Description Language). Diese Beschreibungssprache basiert auf XML. Da XML leicht zu parsen ist, kann aus WSDL Dokumenten leicht automatisch Programmcode erzeugt werden, um den Entwicklungsprozess zu beschleunigen und Fehler zu vermeiden. Web Services verwenden häufig SOAP (Simple Object Access Protocol) als Protokoll für den Datenaustausch, auch SOAP basiert auf XML. Da für nahezu alle Plattformen SOAP Implementierungen vorhanden sind oder entwickelt werden können, ist damit die Plattform-Unabhängigkeit gewährleistet. Sogar für mobile Geräte wie zum Beispiel Handys gibt es SOAP Implementierungen. Das Transportprotokoll für SOAP ist nicht festgelegt, doch meistens wird für Web Services HTTP verwendet. Um sowohl eigene als auch von anderen Unternehmen angebotene Web Services leicht finden zu können, ist UDDI (Universal Description, Discovery and Integration) entwickelt worden. UDDI sind die gelben Seiten der Web Service Welt, hier kann ein Unternehmen die von ihm angebotenen Services publizieren, die andere dann nutzen können. UDDI basiert ebenfalls auf XML. Beispielsweise bietet der Suchdienst Google [GOO] seine Suchfunktion auch als Web Service an. Dieser Dienst kann von Entwicklern genutzt werden, die InternetSuchfunktionen in ihre Programme integrieren wollen. Ein weiteres Beispiel für einen Web Service bietet die Nasdaq (Ein US Aktienmarktplatz). Dort können aktuelle Börsenkurse per Web Service abgefragt werden. Dieser Service lässt sich beispielsweise in einem Programm zur Depotverwaltung integrieren. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 104 - © Prof. J. Goll - 8. Web Services Web Services haben also die folgenden Eigenschaften: • • • Selbstbeschreibend (mit WSDL) Plattform-unabhängig (durch SOAP als Datenprotokoll) Lokalisierbar (mit UDDI) Auf diese 3 Technologien wird nun im Folgenden eingegangen. Eine gute Übersicht über Web Services mit praktischen Anwendungen ist in [Schu2003] zu finden. Die folgenden Auschnitte und insbesondere die Beispiele sind daraus entnommen. 8.1 Web Service Description Language – WSDL Ein wichtiges Prinzip in der Softwareentwicklung, speziell bei verteilten Anwendungen, ist der Interface-getriebene Entwurf. Dabei werden Schnittstellen vereinbart, gegen die implementiert wird. Um diese Schnittstellen zu beschreiben, wird bei Web Services eine auf XML basierende Sprache eingeführt – WSDL. Bei anderen Technologien gibt es ähnliche Ansätze, etwa IDL bei CORBA. Die WSDL Spezifikation ist erreichbar im Internet [WSDL]. WSDL kann automatisch ausgewertet werden, damit können zum einen Überprüfungen durchgeführt werden, zum anderen kann Code generiert werden. Dies geschieht in der Regel zur Entwicklungszeit eines Web Services oder eines Web Services Clienten, es gibt aber auch Ansätze für sog. dynamische oder stubless Web Services, bei denen WSDL zur Laufzeit ausgewertet wird. Das WSIF (Web Service Invocation Framework) Toolkit bietet zum Beispiel die Möglichkeit Web Services Clients zu entwickeln, die dynamisch auf Schnittstellenänderungen reagieren. Weitere Informationen zu WSIF gibt es unter [WSIF]. 8.1.1 Aufbau eines WSDL Dokuments Ein WSDL Dokument enthält die folgenden Elemente: • • • • • • • Typen Nachrichten Operationen Port Typen Bindings Ports Services Diese Elemente referenzieren sich gegenseitig. Ein Service kann z.B. auf Basis mehrerer Binding-Elemente definiert werden. Komplexe Datentypen können geschachtelt werden, dabei wird auf den inneren Typ verwiesen, ohne dass dieser nochmals beschrieben wird. Die einzelnen Elemente werden nachfolgend an einem Beispiel beschrieben. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 105 - © Prof. J. Goll - 8. Web Services - 8.1.2 WSDL Beispiel Das folgende Beispiel zeigt das WSDL Dokument für einen Service, der komplexe Datentypen enthält. Ein WSDL Dokument baut auf XML auf, und muss deshalb die entsprechenden Angaben zur Version und Kodierung machen. Außerdem werden am Anfang des Dokuments Namespaces festgelegt, um mehrdeutige Elementnamen zu vermeiden. <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace= "http://localhost:8080/AxisWorkshopServer/services/ComplexTypeService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl= "http://localhost:8080/AxisWorkshopServer/services/ComplexTypeService" xmlns:intf= "http://localhost:8080/AxisWorkshopServer/services/ComplexTypeService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="local" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> Im folgenden Abschnitt werden die Typen definiert. Der hier beschriebene Service verwendet zwei komplexe Typen, die geschachtelt sind (Der Typ ”outerCplx” enthält den Typ ”innerCplx”). Elementare Datentypen (String, Int,...) werden als solche beschrieben. Da für die Datenübertragung die Reihenfolge der Elemente entscheidend ist, wird diese durch das XML Schema Sprachmittel ”sequence” festgelegt. Das Attribut ”nillable” legt fest, ob das Element weggelassen werden darf. <wsdl:types> <schema targetNamespace="local" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="outerCplx"> <sequence> <element name="cplx2" nillable="true" type="tns1:innerCplx"/> <element name="id" type="xsd:int"/> <element name="name" nillable="true" type="xsd:string"/> </sequence> </complexType> <complexType name="innerCplx"> <sequence> <element name="id" type="xsd:int"/> <element name="name" nillable="true" type="xsd:string"/> </sequence> </complexType> <element name="outerCplx" nillable="true" type="tns1:outerCplx"/> </schema> </wsdl:types> Das Message Element fasst die Typen zu abstrakten Nachrichten zusammen. Abstrakt bedeutet, dass keine Angaben über das verwendete Nachrichtenformat STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 106 - © Prof. J. Goll - 8. Web Services gemacht werden. Damit ist WSDL nicht auf SOAP beschränkt, und für zukünftige Formate offen. Der hier beschriebene Web Service bietet eine Methode an, somit sind zwei Nachrichten notwendig, eine für die Anfrage, eine für die Antwort (Request und Response). <wsdl:message name="getComplexTypeRequest"> </wsdl:message> <wsdl:message name="getComplexTypeResponse"> <wsdl:part name="getComplexTypeReturn" type="tns1:outerCplx"/> </wsdl:message> Die Nachrichten werden zu abstrakten Ports zusammengefasst. Ein Port ist später unter einer bestimmten URL zu erreichen (bei HTTP als Transportprotokoll), oder entspricht einer Message Queue (bei JMS). Bei den abstrakten Port Types wird noch keine Angabe über das Protokoll gemacht. Innerhalb eines Port Types werden die Operationen (eine Operation entspricht einer Methode des Web Services) festgelegt. <wsdl:portType name="ComplexTypeService"> <wsdl:operation name="getComplexType"> <wsdl:input message="impl:getComplexTypeRequest" name="getComplexTypeRequest"/> <wsdl:output message="impl:getComplexTypeResponse" name="getComplexTypeResponse"/> </wsdl:operation> </wsdl:portType> Das Binding Element legt das verwendete Protokoll fest (hier SOAP über HTTP). Zu einem Port Type können mehrere Bindings existieren, falls der Service über mehrere Protokolle angeboten wird. <wsdl:binding name="ComplexTypeServiceSoapBinding" type="impl:ComplexTypeService"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getComplexType"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getComplexTypeRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace= "http://localhost:8080/AxisWorkshopServer/services/ComplexTypeService" use="encoded"/> </wsdl:input> <wsdl:output name="getComplexTypeResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace= "http://localhost:8080/AxisWorkshopServer/services/ComplexTypeService" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> Nachdem die Bindings festgelegt sind, werden diese mit einer konkreten Adresse verbunden. Damit entsteht der eigentliche Service. Die Adresse kann für die verschiedenen Protokolle sehr unterschiedlich aussehen, bei JMS würde z.B. der Name einer Queue angegeben, sowie die IP Adresse des JNDI Managers. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 107 - © Prof. J. Goll - 8. Web Services <wsdl:service name="ComplexTypeServiceService"> <wsdl:port binding="impl:ComplexTypeServiceSoapBinding" name="ComplexTypeService"> <wsdlsoap:address location= "http://localhost:8080/AxisWorkshopServer/services/ComplexTypeService"/> </wsdl:port> </wsdl:service> </wsdl:definitions> 8.1.3 WSDL für den Echo-Service Nachfolgend ist ein komplettes WSDL Dokument abgedruckt. Es beschreibt den Echo-Service, der weiter unten im Text benutzt wird. <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace= "http://localhost:8080/AxisWorkshopServer/services/EchoService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl= "http://localhost:8080/AxisWorkshopServer/services/EchoService" xmlns:intf= "http://localhost:8080/AxisWorkshopServer/services/EchoService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><wsdl:types/> <wsdl:message name="echoRequest"> <wsdl:part name="in" type="xsd:string"/> </wsdl:message> <wsdl:message name="echoResponse"> <wsdl:part name="echoReturn" type="xsd:string"/> </wsdl:message> <wsdl:portType name="EchoService"> <wsdl:operation name="echo" parameterOrder="in"> <wsdl:input message="intf:echoRequest" name="echoRequest"/> <wsdl:output message="intf:echoResponse" name="echoResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="EchoServiceSoapBinding" type="intf:EchoService"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="echo"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="echoRequest"> <wsdlsoap:body encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 108 - © Prof. J. Goll - 8. Web Services namespace= "http://localhost:8080/AxisWorkshopServer/services/EchoService" use="encoded"/> </wsdl:input> <wsdl:output name="echoResponse"> <wsdlsoap:body encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace= "http://localhost:8080/AxisWorkshopServer/services/EchoService" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="EchoServiceService"> <wsdl:port binding="intf:EchoServiceSoapBinding" name="EchoService"> <wsdlsoap:address location= "http://localhost:8080/AxisWorkshopServer/services/EchoService" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 8.2 Simple Object Access Protocol – SOAP SOAP verwendet XML, um Methoden entfernter Objekte aufzurufen. Dadurch ist die Kommunikation leicht nachzuvollziehen. In den folgenden Abschnitten wird SOAP anhand von Beispielen erklärt. Die vollständige SOAP Spezifikation kann im Internet unter [SOAP] erreicht werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 109 - © Prof. J. Goll - 8. Web Services - 8.2.1 Aufbau einer SOAP Nachricht Abbildung 1 zeigt den Aufbau einer SOAP Nachricht und deren Position in einem HTTP Request. Abbildung 1: Aufbau einer SOAP Nachricht Ein Umschlag (Envelope) enthält einen Kopf (Header) und den eigentlichen Körper (Body), in dem der Methodenaufruf zu finden ist. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 110 - © Prof. J. Goll - 8. Web Services - 8.2.2 Beispiele für SOAP Nachrichten Ein Beispiel für eine Anfrage an den Echo Service sieht so aus: Die SOAP Nachricht wird über HTTP übertragen, deshalb startet das Beispiel mit dem HTTP Header. Als Content Type wird text/xml angegeben, da SOAP auf XML aufbaut. Um auch lange Nachrichten versenden zu können, wird die HTTP POST Methode verwendet. Um Probleme mit Proxy Servern zu vermeiden, wird das Cache-Control Feld auf ”nocache” gesetzt. POST /AxisWorkshopServer/services/EchoService HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.0 Host: localhost Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 474 Wie oben erwähnt, stellt eine SOAP Nachricht ein XML Dokument dar, deshalb werden die entsprechenden Informationen über XML Version und Kodierung angegeben. Danach beginnt das ”soapenv:Envelope” Element, das als Klammer für die gesamte Nachricht dient. Dieses Element macht auch Angaben über XML Schemata, die zur Validierung von SOAP Nachrichten verwendet werden können. <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> Das ”soapenv:Body” Element enthält den Methodenaufruf, in diesem Fall die echo Methode des Services. Diese Methode hat nur einen Parameter, einen String. Der Parameter wird im Element ”in” übergeben, dort wird auch der Typ des Parameters spezifiziert. Dies ist notwendig, um überladene Methoden unterscheiden zu können. Der Wert des Parameters ist ”Hallo”. <soapenv:Body> <ns1:echo soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1= "http://localhost:8080/AxisWorkshopServer/services/EchoService"> <in xsi:type="xsd:string">Hallo</in> </ns1:echo> </soapenv:Body> </soapenv:Envelope> STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 111 - © Prof. J. Goll - 8. Web Services Die Antwort vom Echo Service hat dann etwa folgendes Aussehen: Die Antwort auf den vorhergegangenen Request startet mit einem HTTP Protokoll-Header. Dort werden eventuelle Fehlermeldungen des Servers (nicht des Services selbst!) eingetragen, wenn alles funktioniert hat, ist der Code ”200 OK”. HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Date: Thu, 01 May 2003 20:30:40 GMT Server: Apache Tomcat/4.0.6 (HTTP/1.1 Connector) Connection: close Das ”soapenv:Envelope” Element ist wie bei der Anfrage an den Service eine Klammer um die SOAP Nachricht. <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> Im Body ist die Antwort des Web Service enthalten. Der Rückgabewert wird im ”echo-Response” Element zurückgeliefert. <soapenv:Body> <ns1:echoResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1= "http://localhost:8080/AxisWorkshopServer/services/EchoService"> <echoReturn xsi:type="xsd:string">Hallo</echoReturn> </ns1:echoResponse> </soapenv:Body> </soapenv:Envelope> Wie hier zu sehen ist, werden die Parameter einer Methode nicht wieder zurückgegeben, es kann also kein call-by-reference erfolgen. Sollen mehrere Informationen zurückgegeben werden, muss als Returntyp ein komplexer Typ verwendet werden, wie es das Beispiel in 8.1.2 zeigt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 112 - © Prof. J. Goll - 8. Web Services - 8.3 Universal Description Discovery and Integration – UDDI Die Aufgabe von UDDI ist es, Web Services leicht auffindbar zu machen. Zu diesem Zweck definiert UDDI eine Reihe von Strukturen, in denen Informationen zu Web Services gespeichert werden können, sowie Schnittstellen, über die eine UDDI Registry kommunizieren kann. Diese Schnittstellen sind ihrerseits als Web Services implementiert. 8.3.1 UDDI Strukturen und Sichten Die wichtigsten UDDI Strukturen sind: • businessEntity Enthält Informationen über das Unternehmen, das den Service anbietet. • businessService Nicht-technische Informationen über den Service, z.B. Geschäftsmodell, Kosten etc. • bindingTemplate Technische Informationen über den Service, z.B. wo der Service zu erreichen ist und Informationen zu den Methoden. • tModel Technische Spezifikationen, hier wird auch das WSDL Dokument zum Service hinterlegt. Es gibt noch einige weitere Strukturen, die die oben angegebenen verfeinern oder verknüpfen. Diese Strukturen sind in der UDDI Spezifikation [UDDI] erklärt. Mit Hilfe dieser Strukturen bietet UDDI für verschiedene Anwender verschiedene Sichten auf die gespeicherten Daten. Diese Sichten werden Pages genannt und nach verschiedenen Farben unterschieden. • White Pages Diese Sicht liefert Daten für nicht-technische Benutzer, etwa die Informationen über das Unternehmen und Kontaktadressen. • Yellow Pages Diese Sicht konzentriert sich auf die Services, nicht auf die Unternehmen. Die Informationen sind ebenfalls nicht-technischer Natur. • Green Pages Diese Seiten liefern technische Informationen zu den Services. Abbildung 2 zeigt die Zusammenhänge zwischen den Datenstrukturen und den Sichten. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 113 - © Prof. J. Goll - 8. Web Services - Abbildung 2: UDDI Pages und Strukturen 8.3.2 UDDI Registries Die Unternehmen, die an der Entwicklung von Web Services maßgeblich beteiligt sind, betreiben auch gemeinsam eine weltweite UDDI Registry, in der jedes Unternehmen seine Web Services publizieren und nach anderen Web Services suchen kann. Physikalisch besteht diese weltweite Registry aus mehreren Knoten, die ihre Informationen regelmäßig replizieren. Auch dieser Datenaustausch innerhalb von UDDI erfolgt über Web Services. Ein Knoten ist beispielsweise erreichbar unter: https://uddi.ibm.com/ubr/registry.html. Innerhalb von Unternehmen macht auch eine eigene private UDDI Registry Sinn. Ein Entwickler, der einen speziellen Service benötigt, hat so einen zentralen Punkt, an dem er Services suchen kann. 8.3.3 Zugriff auf UDDI Wie schon weiter oben erwähnt, kann auf jede UDDI Registry mit Web Services Clients zugegriffen werden. Es existieren auch Toolkits, die diese Funktionalität kapseln. Ein Beispiel dafür ist UDDI4J, das den Zugriff auf UDDI aus Java Programmen heraus ermöglicht. Weitere Informationen zu UDDI4J gibt es unter [UDDI4J]. Viele private UDDI Registries bringen auch eine Web Oberfläche mit, zum Beispiel die Registry von IBM oder Systinet. Auch manche Entwicklungsumgebungen (z.B. WebSphere Application Developer) bringen einen UDDI Explorer mit. 8.4 Web Services Tools STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 114 - © Prof. J. Goll - 8. Web Services - 8.4.1 Allgemeine Übersicht Axis ist ein Open Source Projekt der Apache Software Foundation. Axis wird von einigen führenden Herstellern von Application Servern eingesetzt und unterstützt. Da der Quellcode verfügbar ist, können alle Details der Kommunikation zwischen Web Service und Client nachvollzogen werden. Axis wird weiter unten detailliert vorgestellt. Zu Axis gibt es einige Alternativen, sowohl Open Source als auch kommerzielle. Microsoft hat Web Services als festen Bestandteil der Architektur in die .NET Umgebung integriert, und liefert die entsprechende Entwicklungsumgebung mit Tools für die Erstellung von Web Services aus. Diese Tools umfassen auch Codegeneratoren ähnlich den WSDL Tools von Axis. Als Sprache zur Implementierung von Web Services auf der .NET Plattform wird C# empfohlen, es kann aber jede Sprache verwendet werden, die vom .NET Framework unterstützt wird. Für die Java Plattform existieren eine Reihe von kommerziellen Toolkits (IBM Web Services Toolkit, SUN Web Services Development Kit, ...). Oft wird in diesen Kits intern eine speziell an die Produkte der Hersteller angepasste Version von Axis verwendet. Dadurch werden Versionskonflikte bei von Axis und der Laufzeitumgebung des Herstellers gemeinsam genutzten Bibliotheken vermieden. (Ein häufiges Problem bei der Verwendung von Axis ist der XML Parser, der meist in der Laufzeitumgebung schon vorhanden ist, aber nicht in einer passenden Version. Der Austausch dieses Parsers kann einige Probleme bereiten). Aktuelle Application Server bringen solche Toolkits meist mit und auch in vielen Entwicklungsumgebungen (IBMWebSphere Studio, Together, ...) sind sie bereits integriert. 8.4.2 Übersicht über Axis Das Axis System ist sehr modular aufgebaut, die einzelnen Komponenten kommunizieren über definierte Schnittstellen. Es ist auch möglich, Axis an verschiedenen Stellen durch eigene Module zu erweitern. Diese Module sind im wesentlichen Klassen, die ein bestimmtes Interface implementieren müssen, und deren Namen in der Konfiguration von Axis angegeben werden. Der Kern des Systems lädt die Klassen dann mit Hilfe des Java Classloader. Abbildung 3 zeigt die einzelnen Komponenten von Axis. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 115 - © Prof. J. Goll - 8. Web Services - Abbildung 3: Axis Sub Systeme Die Komponenten haben dabei die folgenden Aufgaben: • admin Die Adminkomponente von Axis ist für das Deployment der verschiedenen Services auf dem Server zuständig. Diese Komponente liest den Web Service Deployment Descriptor aus, und steuert das Routing der Nachrichten zu dem zugeordneten Service. • service Normale Web Services verwenden SOAP, um die entfernten Methodenaufrufe zu realisieren. Axis erweitert dieses Modell um weitere Möglichkeiten, entfernte Methoden aufzurufen. Damit leidet jedoch die Interoperabilität mit anderen Toolkits, deshalb wird hier nicht weiter auf diese Möglichkeiten eingegangen. • provider Der eigentliche Service kann auf verschiedene Arten implementiert werden, etwa als normale Java Klasse, Enterprise Java Bean (EJB) oder als Message Driven Bean (MDB). Je nach Implementierung des Services wird ein spezieller Provider verwendet, der den Service aufruft, und die Daten aus dem SOAP Aufruf übergibt. • transport In der Architektur von Web Services ist das Transportprotokoll nicht festgelegt. Um flexibel zu bleiben, ist der protokollabhängige Teil von Axis in dieses Modul ausgelagert. Module für eigene Transportprotokolle können eingebunden werden. • encoding Bevor die Daten eines Services übertragen werden können, müssen sie in ein einheitliches Format gebracht werden. Dazu ist auch eine Umsetzung der sprachspezifischen (bei Axis: Java-spezifischen) Datentypen in SOAP Datentypen notwendig. Diese Aufgabe erledigt der encoding Teil der Axis Architektur. Dieser Teil kann durch eigene Module erweitert werden, die Serializer und Deserializer. • message model STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 116 - © Prof. J. Goll - 8. Web Services Nachrichten, die im Axis System verarbeitet werden, werden in ein Message Objekt ”verpackt”. Dadurch können einer Nachricht innerhalb des Axis Systems weitere Informationen mitgegeben werden (Zeitstempel etc). Das Message Modell spielt eine wichtige Rolle bei der Entwicklung eigener Handler. • WSDL Tools Axis stellt Tools zur Verfügung, um aus WSDL Java Code zu generieren, und aus Java Klassen WSDL Dateien. Diese Dienste sind in den WSDL Tools zusammengefasst: Mit WSDL2Java können aus einem WSDL Dokument verschiedene Java Klassen, bzw. Rahmen erzeugt werden. Mit dem Java2WSDL Tool kann aus bestehenden Klassen eine WSDL Datei erzeugt werden. In dieser WSDL Datei werden dann die Methoden der Klasse als Web Service beschrieben. Der Einsatz dieser Tools beim Entwickeln eigener Web Services wird im Folgenden erläutert. Axis benötigt weitere Komponenten, um funktionsfähig zu sein: Einen JAXP konformen XML Parser, z.B. Apache Xerces. Bei der Verwendung von HTTP als Transportprotokoll wird eine Servlet Engine wie Apache Tomcat benötigt. 8.5 Entwickeln eigener Web Services In diesem Abschnitt wird das Vorgehen bei der Entwicklung eigener Web Services mit Axis erklärt. Generell kann bei der Entwicklung in zwei Richtungen vorgegangen werden: • Bottom-Up Entwicklung: Bei diesem Vorgehen existiert schon eine Anwendung, diese soll ganz oder teilweise als Web Service zur Verfügung gestellt werden. • Top-Down Entwicklung: Hier wird Interface getrieben vorgegangen, d.h. zuerst wird die Schnittstelle des Web Services spezifiziert, dann wird die Anwendung entsprechend implementiert. Die dritte noch zu untersuchende Vorgehensweise ist: • Entwicklung eines Clients auf Grund einer in einer UDDI Registry gefundenen WSDL Beschreibung, um den entsprechenden Web Service aufzurufen. Axis unterstützt diese Vorgehensweisen mit den bereits erwähnten Tools WSDL2Java und Java2WSDL. Das wird nun im Folgenden beschrieben. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 117 - © Prof. J. Goll - 8. Web Services - 8.5.1 Vorgehen bei der Bottom-Up Entwicklung 1. Festlegen, welche Methoden als Web Service zur Verfügung gestellt werden. 2. Sammeln dieser Methoden in einer Fassade-Klasse (Anwendung des Fassade Entwurfsmusters) 3. Analyse der zu übertragenden Datentypen: Ist die Umsetzung in JavaBean-konforme Klasse möglich? Ist die Entwicklung von eigenen Serializern / Deserializern notwendig? 4. Implementieren der Fassade-Klasse, bei Umsetzung der Datentypen in Beans wird dies auch in der Fassade-Klasse erledigt. 5. Deployment des Services mit Axis, Generierung des WSDL Dokuments durch den Aufruf des Services mit angehängtem ?wsdl. 6. Publizieren des Services in einer UDDI Registry. 8.5.2 Vorgehen bei der Top-Down Entwicklung 1. Festlegen der Methoden, die der Web Service anbieten soll. Dazu gehört auch das Design der Datentypen, die übertragen werden sollen. 2. Erstellen eines WSDL Dokuments, das den Service beschreibt. 3. Generieren von Skelettklasse mit WSDL2Java. Diese Klasse enthält leere Methodenrümpfe. 4. Implementieren der Servicelogik in der Skelettklasse. 5. Deployment des Services mit Axis. 6. Publizieren des Services in einer UDDI Registry. 8.5.3 Vorgehen bei der Entwicklung des Clients 1. Generieren der Client Stubs mit WSDL2Java. 2. Implementieren des Clients unter Verwendung der Stub-Klassen. 8.6 Transportprotokolle Um SOAP Nachrichten zu transportieren, kann jedes Protokoll eingesetzt werden, das den Austausch von XML Daten gestattet. Zurzeit verwenden die meisten Web Services HTTP, das eine Reihe von Vorteilen bietet: • Einfacher Aufbau HTTP ist ein relativ einfach aufgebautes Protokoll. Es wird nur ein Port verwendet, was die Firewallkonfiguration vereinfacht. • Vorhandene Infrastruktur Eine Infrastruktur für HTTP ist meist schon vorhanden (Webserver, DNS, Proxies, Firewall). • Unterstützung durch Servlet Engines STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 118 - © Prof. J. Goll - 8. Web Services HTTP wird von allen Servlet Engines unterstützt, so dass die Kommunikation nicht selbst implementiert werden muss. Den oben aufgeführten Vorteilen steht als größter Nachteil entgegen, dass HTTP ein verbindungsloses Protokoll ist. Eine Anfrage kann daher nicht ohne weiteres einem Benutzer zugeordnet werden. Um dieses Problem zu lösen, gibt es verschiedene Ansätze. Möglich ist z.B. Sessionhandling durch Cookies, oder auf SOAP Ebene. Ein weiterer Nachteil von HTTP ist die fehlende Verlässlichkeit, d.h. es kann nicht garantiert werden, dass eine Nachricht den Empfänger erreicht. Verlässlichere Protokolle sind auf dem Vormarsch, Beispiele sind der Java Messaging Service (JMS) und HTTP Reliable (HTTPR, siehe dazu [HTTPR]). Der Java Messaging Sevice (JMS) ist eine Spezifikation für eine Schnittstelle in Java, mit der zuverlässig Nachrichten ausgetauscht werden können. Diese Nachrichten können jede Art von Objekten enthalten, wenn diese serialisiert werden können. Der Vorteil bei der Verwendung von JMS liegt in der Zuverlässigkeit, es kann im Gegensatz zu HTTP sichergestellt werden, dass Nachrichten den Empfänger erreichen oder eine entsprechende Fehlerbenachrichtigung erfolgt. 8.7 Zusammenfassung 8.7.1 Einschränkungen bei Web Services Manche Anforderungen von Anwendungen sind nicht mit ”reinen” Web Services zu realisieren. Das soll heißen, dass nur Technologien verwendet werden, die abschließend standardisiert worden sind, und damit von allen Toolkits angeboten werden. Werden andere Technologien verwendet (z.B. spezielle Axis Features), wird dadurch die Interoperabilität eingeschränkt. Die wichtigsten Einschränkungen sind: • Session Handling Es gibt noch keinen Standard für Web Services, mit dem Sessions abgebildet werden können. • Sicherheit auf XML Ebene Es gibt bereits Ansätze, Sicherheit auf XML Ebene zu realisieren, allerdings existiert noch kein abschließender Standard. • Übertragung großer binärer Objekte (Bilder, Sound) SOAP mit Attachements ist eine Möglichkeit, diese Anforderung zu realisieren, jedoch ist im Web Services Umfeld noch nicht klar, ob sich dies als Standard durchsetzt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 119 - © Prof. J. Goll - 8. Web Services • Andere Übertragungsprotokolle als HTTP Das Problem hierbei ist die Spezifizierung der Serviceadresse in WSDL. IBM hat ein Format dafür eingeführt, das aber nicht von anderen Unternehmen unterstützt wird. • Transaktionsunterstützung Web Services unterstützen keine Transaktionen. Axis beispielsweise bietet Möglichkeiten, mit deren Hilfe die Einschränkungen umgangen werden können. Dabei muss aber immer bedacht werden, dass der Einsatz dieser Features eine Festlegung auf Axis bedeutet, da andere Toolkits nicht die selben Möglichkeiten bieten. 8.7.2 Bewertung von Web Services allgemein Web Services ermöglichen in vielen Fällen eine einfache und schnelle Integration von Anwendungen. Ihre Entwicklung kann in hohem Grad toolgestützt erfolgen, was die Entwicklungszeit erheblich verkürzt. Dass Web Services Kommunikation über Plattformgrenzen hinweg ermöglichen, erhöht die Investitionssicherheit, da keine Festlegung auf eine einzelne Plattform oder Middleware besteht. Auch Anwendungen in einem heterogenen IT Umfeld können integriert werden. Diese Flexibilität wird mit einer gegenüber anderen Technologien (CORBA, DCOM) schlechteren Performance und einem eingeschränkten Funktionsumfang erkauft. 8.7.3 Ausblick Die Standards im Web Services Umfeld sind in Bewegung. Bei SOAP sind Sessions und die Übertragung von großen, binären Datenmengen (etwa Bild Dateien) wichtige Themen, an deren Standardisierung gearbeitet wird. Ein weiteres Thema ist die Sicherheit von Web Services. Einige Hersteller (IBM, Microsoft, Verisign und andere) arbeiten daran, Sicherheitsfunktionen zu standardisieren. Der kommende Standard heißt WS-Security. Weitere Informationen dazu gibt es unter [WSS]. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 120 - © Prof. J. Goll - 9. Semantic Web - 9 Semantic Web 9.1 Resource Description Framework – RDF Das RDF (Resource Description Framework) soll eine Infrastruktur zur Nutzung von Metadaten zwischen verschiedenen Web-Anwendungen bieten und somit die Interoperabilität zwischen unabhängig entwickelten Webservern und -clients verbessern. RDF vereinigt verschiedene webbasierte Metadaten-Initiativen und nutzt XML als Austausch-Syntax. Metadaten, also Daten zur Beschreibung von Daten, sind notwendig, da über das Web ausgetauschte Daten zwar maschinenlesbar, aber zunächst nicht unbedingt maschinenverständlich sind, was einer gewünschten Automatisierung entgegensteht. Als Metadaten im Rahmen der RDF-Initiative werden sämtliche Daten bezeichnet, die Web-Ressourcen beschreiben. RDF wird unter dem Dach der W3C entwickelt. RDF hat seit Februar 2004 den Status einer Recommendation. Das RDF wird Grundlage für eine Vielzahl von Anwendungen sein können. Das W3C nennt etwa verbesserte Suchmaschinen durch die Verfügbarkeit von mehr bzw. besserer Information, Austausch und gemeinsame Verwendung von Wissen durch intelligente Softwareagenten, allgemein die Verbindung von Metadaten mit Inhalten im Internet (content rating; Beispiel: PICS, Platform for Internet Content Selection, ebenfalls vom W3C definiert, hilft beispielsweise Eltern zu kontrollieren, zu welchen Inhalten im Internet ihre Kinder Zugriff haben) oder die Beschreibung von Urheberrechten und Sicherheitsrichtlinien einer Webseite. Im Zusammenhang mit digitalen Signaturen soll das RDF ein "key to building the Web of Trust" sein. Das RDF basiert auf einem graphenbasierten Datenmodell, das aus Knoten und zugehörigen Attributen/Wertepaaren besteht. Die Knoten stellen beliebige WebRessourcen dar (Seiten, Server etc., letztlich alles, das durch eine URI, wie die bekannten URLs, ansprechbar ist). Im Gegensatz zu vielen bisherigen Versuchen der Metadaten-Standardisierung verlangt das RDF durch die Verwendung von URIs nicht unbedingt ein zentrales Register aller Attribute. 9.2 Web Ontology Language – OWL Inzwischen gibt es noch eine weitere Entwicklung des W3C: OWL, die Web Ontology Language. Auch hier steht die Verarbeitung von Information durch Computer im Vordergrund und nicht das Verstehen der Information durch Menschen. OWL ist selbst wieder eine XML-basierte Sprache. In dieser Sprache kann die Bedeutung von Begriffen in Form einer Ontologie festgehalten werden. Eine solche Ontologie besteht aus einem Vokabular für die Begriffe und Beziehungen zwischen diesen Begriffen. Damit bietet OWL wesentlich mehr Möglichkeiten, um Bedeutung und Semantik zu definieren als mit reinem XML oder mit RDF. OWL ist seit Februar 2004 im Status einer Recommendation. Es bietet derzeit die mächtigsten Möglichkeiten, um Inhalte im Web in maschinenlesbarer Form zu definieren. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 121 - © Prof. J. Goll - 10. Zusammenfassung - 10 Zusammenfassung 10.1 Vorteile von XML XML ist durch das W3C entwickelt worden mit dem Ziel, ein offenes Datenformat für über das Web nutzbare Dokumente zu bieten. Dabei, so zwei der Designziele, solle es sich im Internet auf einfache Weise nutzen lassen und ein breites Spektrum von Anwendungen unterstützen. Diese durch XML angestrebten Ziele sind sicherlich unbestreitbar wünschenswert; allerdings ist XML nicht die einzige Möglichkeit, diese Ziele zu unterstützen. So sind möglicherweise Remote Procedure Calls (RPC) oder IIOP (Internet Inter-ORB Protocol) effizienter bzgl. Bandbreite oder Verarbeitungsgeschwindigkeit als HTTP in Verbindung mit XML. Doch die Vorteile der Verwendung von XML können erheblich sein. Nachfolgend werden die wesentlichen Gründe vorgestellt, die XML zu einer breiten Verwendung und damit zum zukünftigen Internetstandard verhelfen könnten. 10.1.1 XML harmoniert mit HTML, HTTP und Webbrowsern Ein Vorteil der XML Konzeption beruht auf der enormen Verbreitung des WWW. Viele Millionen Web-Autoren beherrschen HTML und warten auf Möglichkeiten, dessen Beschränkungen zu überwinden. Diese Millionen sind mit dem Auszeichnen von Daten vertraut und werden wenig Probleme haben, die XML Philosophie zu verstehen und zu nutzen. Die Menge dieser HTML Autoren führte bereits jetzt zu einer Fülle frei angebotener XML Tools wie Parser, Editoren etc. aller großen Softwareanbieter. Die Menge der erwarteten Nutzer (installed base) ist daher möglicherweise der entscheidende Faktor der Diffusion von XML. Darüber hinaus gibt es – auch wenn HTTP primitiver ist als beispielsweise CORBA/IIOP – wesentlich mehr HTTP-basierte Produkte. Die Verfügbarkeit leistungsfähiger Browser macht das Web oder HTTP in Verbindung mit XML zu einer weltweiten Plattform für strukturierte Daten. Ziel von XML ist nicht BitmengenEffizienz, sondern breite Anwendbarkeit. 10.1.2 XML ist einfach und portabel XML soll Dokumente beliebiger Struktur im Web sowie eine Austauschbarkeit der enthaltenen Daten unterstützen. Für wirklich portable Dokumente waren bislang beispielsweise reine ASCII-Dateien geeignet, die sich mit fast allen Editoren bearbeiten lassen, unabhängig von der Anwendung, mit der sie erstellt wurden. Die von WYSIWYG-Editoren erzeugten Dokumente unterscheiden sich nun derart von diesen ASCII-Dateien, dass von Kompatibilität, teilweise sogar zwischen unterschiedlichen Versionen der gleichen Anwendung, nicht mehr gesprochen werden kann. Mit XML wurde ein Markup-Ansatz entwickelt, da ein Vorteil der expliziten Auszeichnung von Dokumentteilen, z.B. im Gegensatz zu Binärdateien, die leichte Lesbarkeit und die Möglichkeit der Bearbeitung mit Editoren, die überall zur STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 122 - © Prof. J. Goll - 10. Zusammenfassung Verfügung stehen, ist. Der ausgezeichnete Inhalt ist für Autoren und Nutzer wesentlich einfacher zugänglich. Um XML zu verstehen, ist so z.B. kein Umgang mit hexadezimalen Datenmengen erforderlich. "In the Internet world, the rule of the game is openness" [Maru98]. Die Einfachheit und antizipierte Verbreitung von XML führte dazu, dass viele Initiativen zur Definition von Austauschformaten auf der Basis von XML neu aufgelegt worden sind. 10.1.3 XML kann Dokumente beliebiger Komplexität abbilden Bei aller Einfachheit ist es mit XML möglich, auch sehr komplexe Datenstrukturen abzubilden. So können beispielsweise EDI Nachrichten als XML Dokumente dargestellt werden. Es wurde gezeigt, dass XML Dokumente grundsätzlich eine Baumstruktur aufweisen. Tabellen als logische Datenstruktur gängiger relationaler Datenbanksysteme können in die XML Baumstruktur abgebildet werden. So kann eine Zeile als Unterbaum und die ganze Tabelle als Abfolge derartiger Teilbäume beschrieben werden. Das RDF stellt darüber hinaus ein graphenbasiertes Datenmodell zur Verfügung. XML ist der Versuch, ein günstiges Verhältnis zwischen Reichhaltigkeit auszuzeichnender Datenstrukturen und Einfachheit zu finden. 10.1.4 XML ist mehr als nur eine Auszeichnungssprache Der vielleicht mächtigste Vorteil von XML liegt darin, dass es sich nicht nur um eine Auszeichnungssprache mit relativ einfachen Spezifikationen handelt. Vielmehr ist XML ein Paket an Funktionalität gemäß den Anforderungen an einen netzbasierten, weltweiten Datenaustausch. So erhält XML seine Mächtigkeit aus dem Zusammenspiel seiner zugehörigen Linking- und Zugriffsmodelle (XLink, XPointer, DOM) mit der Möglichkeit, Daten einfach auszuzeichnen, Dokumenttypen zu definieren (DTDs) und deren Instanzen zu nutzen und über bestehende Netze und verfügbare Protokolle (HTTP) auszutauschen. Traditionelle Standards wurden im Hinblick auf eine optimale Funktionserfüllung innerhalb eines vergleichsweise fest umrissenen Anwendungsrahmens entwickelt. XML soll letztlich allen Nutzern im Internet dienen und ist dementsprechend breiter angelegt. Hier wird auch - gerade im Vergleich beispielsweise zu EDIFACT – ein geändertes Selbstverständnis der Standardisierungsorganisationen bzw. eine geänderte grundsätzliche Einstellung gegenüber der Bedeutung von Standards sichtbar, indem das W3C konsequent Kompatibilität und Offenheit in den Vordergrund seiner Bemühungen stellt. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 123 - © Prof. J. Goll - 10. Zusammenfassung - 10.1.5 Internationalität Ein häufig unterschätztes Argument für XML ist darüber hinaus die Unterstützung internationaler Zeichensätze. Das Internet und die weltweite Kommunikation überwinden Länder- und Sprachgrenzen. Daher unterstützt XML in der Version 1.0 den erweiterten Unicode-Zeichensatz ISO-10646 und verlangt, dass alle XML Prozessoren mindestens zwei "encodings" unterstützen, nämlich UTF-8 und UTF-16. 10.2 Anwendungsfelder für XML Da XML noch sehr jung ist, sind die meisten Implementierungen derzeit eher prototypisch. Auch wenn alle größeren Firmen Unterstützung für XML oder Schnittstellen für XML angekündigt haben, verhalten viele sich auch abwartend. Wie bei jeder neuen Technologie besteht auch bei XML Unsicherheit, wie und wofür die Sprache sich wird durchsetzen können. An einigen der kritischen Faktoren für eine Durchsetzung wird derzeit noch gearbeitet, wie etwa an der Performanz der Tools und an notwendigen Ergänzungen des Standards. Einige Innovationen dürften auch aus der Verbindung mit Java zu erwarten sein. So ist XML genau wie Java unabhängig von der verwendeten Plattform einsetzbar. Der berühmte Satz des Mitentwicklers von XML, Jon Bosak, nämlich "XML gives Java something to do" [Bosa97], resultiert aus der Fähigkeit von XML, nicht nur Textdaten, sondern "grundsätzlich beliebige, textuell kodierbare (also theoretisch alle) Formen von Daten zu speichern. (...) Praktisch könnte es so aussehen, dass ein Web-Server neben den in XML kodierten Daten auch gleich das passende Java Programm mitschickt. XML könnte also neben der universellen, system-unabhängigen Sprache Java das universelle Datenformat des Web werden." [BeMi98]. Für die Kombination Java/XML wurde schon das Schlagwort geprägt: "Portable Code – Portable Data". Das soll heißen, was Java im Bereich der Programmierung geschaffen hat, das kann XML im Bereich der Daten auch schaffen: Portabilität. Vor dem Hintergrund der oben beschriebenen allgemeinen Vorteile einerseits und der Beschränktheit von HTML andererseits lassen sich vier besonders geeignete Anwendungsfelder für XML identifizieren, die im Folgenden etwas genauer erläutert werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 124 - © Prof. J. Goll - 10. Zusammenfassung - 10.2.1 XML als standardisiertes Datenaustauschformat XML kann als Datenaustauschformat zwischen unterschiedlichen Datenbeständen dienen. Bislang gingen die meisten Überlegungen zur Gestaltung des XML-basierten Datenaustausches zwischen verschiedenen Systemen mit unterschiedlichen Datenformaten, die interessengruppen-spezifisch standardisiert werden können (etwa Bestellung und Rechnung), davon aus, dass die auszutauschenden Dokumente eine im Industriestandard spezifizierte DTD als Grundlage nutzen. Diese DTDs werden in Repositories zur Verfügung gestellt. Damit können Dokumente von jeder empfangenden Anwendung validiert und verarbeitet werden. Neuere Ansätze gehen auch andere Wege und nutzen beispielsweise wohlgeformte XML Dokumente als flexiblere Grundlage für den Datenaustausch. Beispiele für die Anwendung von XML als Datenaustauschformat sind Krankenakten, kooperatives CAD/CAM oder Terminmanagement sowie allgemein jeder Datenaustausch zwischen verschiedenen Datenbanken wie auch Workflow-Systeme. Konkrete Anwendungen sind etwa der Datenaustausch mit Electronic Data Interchange über das WWW (XML/EDI) oder das Open Trade Protocol (OTP), das ein standardisiertes Verfahren für den Handel mit Privatkunden zur Verfügung stellt. Microsoft hat in die neuen Office-Versionen XML als (internes) Datenformat integriert, um so den Dokumenten- und Datenaustausch zwischen den einzelnen Office-Anwendungen und über das WWW zu erleichtern. 10.2.2 Verlagerung der Rechenleistung vom Server zum Client Durch die Möglichkeit, alle Daten, die zu einem Dokument gehören, in XML zu codieren, können alle zum Verarbeiten des Dokumentes notwendigen Informationen übertragen werden und beim Client entsprechend ausgeführt werden. Hier wird auch die Bedeutung der bereits angesprochenen Kombination der Netzsprache Java und XML deutlich (z.B. Electronic Banking, Electronic Commerce). 10.2.3 Variable Darstellung von Informationen Auf XML Dokumente können in Abhängigkeit vom jeweiligen Anwendungszweck unterschiedliche Sichten genommen werden. Aus einer Softwaredokumentation können z.B. nur die für das jeweilige Betriebssystem interessanten Informationen angezeigt werden. Dokumente können unterschiedlich angezeigt und ausgedruckt werden, andere Beispiele sind zur Laufzeit generierte Inhaltsverzeichnisse, mehrsprachige Informationen, die nur in der jeweils gewünschten Sprache angezeigt werden, verschiedene Behandlung von Fußnoten in Dokumenten, eine Sortierung von Telefonbüchern je Wunsch nach Name, Nummer, Vorname etc. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 125 - © Prof. J. Goll - 10. Zusammenfassung - 10.2.4 Intelligentes Suchen in XML Datenbeständen Intelligente Softwareagenten können die Bedeutung von in XML codierten Informationen verstehen. So wird z.B. eine bessere Indizierung von Webseiten (allgemeiner von Produkten) möglich, um das bekannte Problem der Fehltreffer aus Homonymen und Synonymen in Suchmaschinen zu lösen. Allgemein bilden strukturierte Daten eine Grundlage für eine individuelle Nutzung von Massenmedien über Netze. "Information needs to know about itself, and information needs to know about me" [Bosa97]. Mögliche Anwendungen sind personalisierte FernsehProgrammzeitungen, die aus einer Vielzahl von Angeboten die den individuellen Präferenzen entsprechenden finden, bzw. eine Beschreibung der Programmangebote derart, dass diese von Interessierten überhaupt gefunden werden können. Auch wenn wirklich intelligente Agenten sicherlich nicht in nächster Zukunft verfügbar sein werden, werden sie eine zunehmend bedeutende Rolle spielen; auf jeden Fall und in jeder Ausbaustufe benötigen sie Daten in einem Format, das für sie verständlich ist, und dies kann XML bieten. 10.3 Ausblick XML ist durch das W3C entwickelt worden mit dem Ziel, ein offenes Datenformat für über das Web nutzbare Dokumente zu bieten. Dabei, so zwei der Designziele, solle es sich im Internet auf einfache Weise nutzen lassen und ein breites Spektrum von Anwendungen unterstützen. Auch wenn XML noch nicht lange den Status eines Standards besitzt, ist es derzeit in aller Munde. Bislang fehlte eine Möglichkeit, Daten, sei es auf Webseiten oder für unterschiedliche Anwendungen, allgemeinverständlich zu beschreiben. Es fehlte ein universelles Datenformat. Sollte sich die Erfolgsgeschichte von XML weiter fortsetzen, was allgemein erwartet wird, könnte sich die Sprache zu dem zukünftigen Standard zur Datenbeschreibung im Internet entwickeln. Inzwischen sind bereits weit über 100 in XML definierte Sprachen entwickelt worden, siehe [OASIS], und täglich entstehen neue XML Anwendungen. Die Einfachheit von XML katalysiert branchenübergreifende Ansätze zur Entwicklung interoperabler Lösungen und ermöglicht es einer großen Anzahl an Nutzern – Technikern wie Nichttechnikern – bei der Definition und Nutzung neuer Markup-Sprachen zusammenzuarbeiten. Die zunehmende Bedeutung des Internet als Kommunikationsmedium wird vermutlich der Durchsetzung von XML noch weiter Vorschub leisten, da mit XML eine neue Basis für die Integration verschiedener Partner, Prozesse und Anwendungen existiert. Die offene Struktur von XML könnte einen Beitrag zu einer Öffnung von Kommunikations- und Kooperationsnetzen leisten. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 126 - © Prof. J. Goll - 11. Quellenverzeichnis - 11 Quellenverzeichnis 11.1 Literatur [BäLa02] Michael Bässler, Wolfgang Langner: Vergleich von verschiedenen ParseVerfahren für XML Dokumente, Studienarbeit, HS Esslingen, FB Informationstechnik, SS2002. [BeMi98] Behme, Henning; Mintert, Stefan: XML in der Praxis: Professionelles WebPublishing mit der Extensible Markup Language. Bonn 1998. [Book02] Matthias Book: Untersuchung Schema-validierender XML Parser, Studienarbeit, HS Esslingen, FB Informationstechnik, SS2002. [Bosa97] Bosak Jon: XML, Java and the future of the Web. http://sunsite.unc.edu/pub/sun-info/standards/xml/why/xmlapps.html, 1997-10-03. [GOO] Google Suchmaschine. http://www.google.com. [HoUl01] Holubek, Andreas; Ulbricht, Frank: XML leicht gemacht - Die Java Architecture for XML Binding (JAXB) in der Praxis. Java Magazin 10/2001. [HTML40] Definition von HTML 4.0. http://www.w3.org/TR/html401/html40.pdf.gz [HTTPR] HTTPR Specification. http://www-106.ibm.com/developerworks/webservices/library/wshttprspec/. [Mach97] Macherius, Ingo: XML: Professionelle Alternative zu HTML. http://www.heise.de/ix/artikel/1997/06/106/. [Maru98] Maruyama, H./Uramoto, N./Tamura, K. (IBM Research): The Power of XML: XML's Purpose and Use in Web Applications. http://www.software.ibm.com/xml/education/xmlpower/xmlpower.pdf. [OASIS] Oasis and Robin Cover: The SGML/XML Web Page – Web Site Index – Expanded Outline. http://www.oasis-open.org/cover/siteIndex.html. [Schu03] Stefan Schuster: Web Services mit Axis, Studienarbeit, HS Esslingen, FB Informationstechnik, SS2003. [SOAP] Simple Object Access Protocol. http://www.w3.org/TR/SOAP/. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 127 - © Prof. J. Goll - 11. Quellenverzeichnis [Tri03] Matthias Trischler: Untersuchung der Java Architecture for XML Binding (JAXB) im Vergleich mit anderen Datenmodellen für XML, Studienarbeit, HS Esslingen, FB Informationstechnik, SS2003. [UDDI] About UDDI. http://www.uddi.org/about.html. [UDDI4J] Uddi4j project. http://www-124.ibm.com/developerworks/oss/uddi4j/top.htm. [W3C] Die Website des W3C. http://www.w3c.org/. [WSDL] Web Services Description Language. http://www.w3.org/TR/wsdl. [WSIF] WSIF project homepage. http://www.alpaworks.com/wsif. [WSS] Microsoft, IBM und andere: Web Services Security (WS-security). April 2002. http://www-106.ibm.com/developerworks/library/ws-secure/. [XMLdev] XML-dev-Mailing-Liste in: http://lists.xml.org/archives/xml-dev/. Heute wird die Mailing Liste von OASIS weitergeführt: http://www.oasis-open.org/ (ToDo) In diesem Download ist auch eine Beschreibung enthalten: Fordin, Scott: The Java Architecture for XML Binding User´s Guide. Sun Microsystems, February 2003. http://java.sun.com/webservices/downloads/webservicespack.html 11.2 Bücher Dies ist eine unvollständige Liste, der Markt wächst ständig! "Professional XML" Didier Martin et al., Wrox Press Ltd. "The XML Handbook" C. Goldfarb, P. Prescod, Prentice Hall. "The XML Bible" E.R. Harold, IDG Books “XML in 21 days” S. North, P. Hermans, SAMS, MacMillan Publishing. “Das XML Einsteigerseminar” M. Seeboerger-Weichselbaum, bhv. “XML kompakt” T. Michel, Hanser Verlag. “XML” M. Stein, I. Dellwig, Addison-Wesley “Just XML” J.E. Simpson, Prentice-Hall "Beginning XML" D. Hunter et al., Wrox Press Ltd STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 128 - © Prof. J. Goll - 11. Quellenverzeichnis - 11.3 Links zu Informationsquellen • http://www.w3c.org/ the standards body that defines all core XML standards • http://www.w3.org/XML/ explains all W3C activities around XML, and has links to software resources. • http://www.xml.com/ good base to enter the world of XML • http://www.megginson.com/ is well worth a trip for up-to-date information on SAX • http://www.ibiblio.org/xml/ Cafe con Leche: news and resources • http://msdn.microsoft.com/library/ • http://www.newsnow.co.uk/cgi/NewsNow/NewsFeed.htm?Topic=*.Tech&ASe arch=XML&Section=ASearchW&Search=XML news portal • http://www.perfectxml.com/ • http://www.w3schools.com/xml/ one of the WWW schools • http://www.xmlmag.com/ with in-depth articles • http://www.cetus-links.org/oo_xml.html presents many links to XML resources in a suitable classification. • http://www.oasis-open.org/cover/ provides a detailed overview of all ongoing XML activities. • http://www.xmltree.com/index.html index of XML sites on the Internet. • http://www.xmlinfo.com/ • http://www.xslinfo.com/ • http://www.xmlsoftware.com/ • http://www.zvon.org/ STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 129 - © Prof. J. Goll - 11. Quellenverzeichnis - 11.4 Links zu Software Herstellern • http://xml.apache.org/ The Apache Software Foundation has stepped up its involvement in XML with 5 subprojects. Part of the suite is Xerces, a Java XML parser donated by IBM (formerly the XML4J parser). • http://msdn.microsoft.com/code/default.asp?url=/code/topic.asp?URL=/msdnfiles/028/000/072/topic.xml free tools from Microsoft to create an XML document, including validation support. • http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid= u28000438 XML Portal from Microsoft • http://alphaworks.ibm.com/ IBM's free XML and Java tools. • http://www-106.ibm.com/developerworks/xml/ XML Portal from IBM • http://www.oracle.com/xml/ • http://www.jclark.com/xml/expat.html James Clark's (author of the XSLT W3C recommendation) expat is a non-validating XML parser written in C. expat has been used for the XML support in the Mozilla browser. • http://www.xmloperator.org/ a free Java XML editor. • http://www.tibco.com/ XML and XSL Tools • http://www.sun.com/software/xml/ XML Portal from Sun • http://java.sun.com/j2ee/ J2EE released by Sun contains a lot of XML software • http://www.topxml.com/xsltester/ information • http://www.induslogic.com/ Tools for XML and XSLT (XMLWiz) Open Source Project with tools and Siehe dazu auch den folgenden Abschnitt mit ausführlicheren Beschreibungen einzelner Tools. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 130 - © Prof. J. Goll - 12. XML Tools - 12 XML Tools 12.1 XML Editoren Da das Erstellen von XML Files besonders fehleranfällig ist (Tippfehler bei den Tags, falsche Gliederung, etc.), gibt es gerade hierfür einige Tools. Alle hier vorgestellten Editoren sind DTD-aware, d.h. sie validieren die gelesenen XML Dokumente und unterstützen den Autor beim Editieren. Es können dann an bestimmten Stellen immer nur die Tags eingefügt werden, die die DTD dafür vorsieht. 12.1.1 Xeena Hersteller: IBM kostenpflichtig, kostenfreie Evaluationsphase in Java, XML Schema Support Abbildung 11-1: Das Adressbuch in Xeena STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 131 - © Prof. J. Goll - 12. XML Tools - 12.1.2 Merlot Open-Source gesponsort von ChannelPoint Inc. in Java zu finden auf dem Webserver (http://www.merlotxml.org/) des Projekts. Abbildung 11-2: Das Adressbuch in Merlot 12.1.3 Morphon Hersteller: Lunatech Research kostenpflichtig, freie Beta erhältlich in Java zu finden bei Morphon (http://www.morphon.com/). STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 132 - © Prof. J. Goll - 12. XML Tools - Abbildung 11-3: Das Adressbuch in Morphon 12.1.4 EpcEdit Hersteller: Koch Consulting & Software kostenpflichtig, freie Beta erhältlich für Windows und Linux verfügbar kann XML und SGML Im Gegensatz zu den anderen Editoren wird hier das Dokument nicht tagweise sondern komplett dargestellt, daher eignet sich dieser Editor besonders für Text-Dokumente. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 133 - © Prof. J. Goll - 12. XML Tools - Abbildung 11-4: Dieses Skript in EpcEdit 12.1.5 Weitere XML Editoren Wordperfect von Corel (http://www.corel.com/Office2000/index.htm) Arbortext (http://www.arbortext.com/) Framemaker von Adobe (http://www.adobe.com/products/framemaker/) Oxygen (http://www.oxygenxml.com) lässt sich auch als Plugin in die Eclipse-IDE integrieren STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 134 - © Prof. J. Goll - 12. XML Tools - 12.2 XML Parser 12.2.1 XML4J XML Parser für Java (XML 4 Java) Hersteller: IBM kostenpflichtig Die Version 1.0 wurde dem Apache-Projekt gespendet. Seitdem werden XML4J und Xerces parallel entwickelt. XML4J 3.0 basiert jedoch wieder auf den Xerces-Sourcen. SAX, SAX2, DOM, DOM Level 2 zu finden auf IBM's Alphaworks-Server. 12.2.2 Xerces Hersteller: Apache-Projekt Open-Source basiert auf XML4J erhältlich für Java, C++ und Perl SAX, SAX2, DOM, DOM Level 2 zu finden auf den XML Seiten des Apache-Projekts. 12.2.3 Java API for XML Processing Hersteller: SUN Referenz-Implementation für Java API, gehört inzwischen zu J2EE SAX, DOM, XML Namespaces zu finden auf den Java/XML Seiten von SUN. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 135 - © Prof. J. Goll - 12. XML Tools - 12.3 XSL Tools 12.3.1 XSLT Prozessoren Xalan-J [1] ist ein Open Source XSLT Prozessor der Apache Software Foundation (ASF) und kann unter Berücksichtigung der ASF Lizenzbedingungen auch in kommerziellen Projekten eingesetzt werden. Xalan bietet die Verwendung von XSLTC (eXtensible Stylesheet Language Transformations Compiled). Hier kann der Compiler die zu verwendenden Stylesheets in Java Bytecode (sogenannte Translets) übersetzen. Den Xalan XSLT Prozessor gibt es auch in einer C++ Implementierung, die den Geschwindigkeitsvorteil von C++ gegenüber Java nutzt. Xalan verdankt seinen Namen einem seltenen Musikinstrument und ist voll kompatibel zum XSLT 1.0 Standard. SAXON [2] entstand "on top of SAX", der API (Application Programming Interface) für XML Parsing. Ihr verdankt SAXON auch seinen Namen. SAXON ist ein Open Source XSLT Prozessor und steht unter der Mozilla Public License Version 1.0 [3] zur Verfügung. SAXON wird in vielen Quellen und Benchmarks als schnelle XSLT Implementierung aufgeführt und zeichnet sich durch zahlreiche Erweiterungen aus, von denen einige in EXSLT (Extensions to XSLT) [4] eingeflossen sind. Für Windows gibt es einen abgespeckten SAXON ohne Quellen und API Dokumentation. Instant SAXON [5] läuft mit der VM (Virtuellen Maschine) von Microsoft, ist jedoch gegenüber seinem „großen“ Bruder um ca. Faktor 3 langsamer. Aufgrund seiner Größe und unkomplizierten Installation kann der Instant SAXON für kleinere Projekte eine Alternative sein. XT [6] ist ein in Java implementierter Open Source XSLT Prozessor, der sich durch eine extrem hohe Verarbeitungsgeschwindigkeit auszeichnet, XSLT aber nicht voll unterstützt. Bei einfachen Stylesheets, die keinen Gebrauch von den nicht unterstützten Features machen, kann XT eine Alternative sein, wenn die Geschwindigkeit der Transformation entscheidend ist. Der Altova XSLT Prozessor [9] ist voll kompatibel mit der W3C XSLT 1.0 Spezifikation [10]. Geliefert wird der Prozessor als Windows .exe File, welcher mittels der Komandozeile ausgeführt wird. Dadurch ist der Prozessor sowohl für Client als auch für serverseitige Anwendungen geeignet. Die Altova XSLT Engine entspricht voll und ganz der Version, welche im XMLSpy von Altova verwendet wird und unterliegt keinen Einschränkungen. Sablotron [13] ist mit C++ realisiert. Binaries für Linux und Windows können von der Ginger Alliance Website heruntergeladen werden. Er ist ein Open Source Toolkit für XML und enthält neben DOM Level 2 und XPath Unterstützung einen eigenen XSLT Prozessor. Zudem existieren für Perl, PHP, Python, Object Pascal, Ruby, Erlang, Tcl und Ada Wrapper, die es ermöglichen Sablotron in diesen Sprachen zu verwenden. Erweiterungen für Sablotron können über ein DOM API in JavaScript realisiert werden. STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 136 - © Prof. J. Goll - 12. XML Tools - Für das „Gnome Projekt“ wurde libxslt [15], eine XSLT Bibliothek in C von Daniel Veillard entwickelt. Die Bibliothek kann in eigene Projekte eingebunden werden. Neben dem Source Code gibt es fertige Binaries für Windows. Die Microsoft(R) XML Core Services [16] bieten neben einem Parser und Schema Unterstützung auch einen XSLT Prozessor. MSXML ist zunächst nur eine Bibliothek in Form einer DLL, die in eigenen Programmen verwendet werden kann. Der Wrapper MSXSL ist für die Kommandozeile als separater Download von Microsoft erhältlich. Voraussetzung ist eine installierte Version von MSXML 2.6 oder höher. MSXML kann vom Internet Explorer für Client-seitige XSLT Transformationen verwendet werden. 12.3.2 Cocoon Cocoon, das Web Publishing Framework der Apache Software Foundation, gehört zu den wichtigsten Projekten der Apache Group. Es ist ein Unterprojekt des Apache XML Projektes Cocoon ist ein Servlet aus mehreren Komponenten. Das Java-basierte XML Publishing Framework dient als Übersetzer zwischen den Clients, die die Daten in einem bestimmten Format anfordern und den eigentlichen Daten. Diese können aus einer oder mehreren XML Dateien oder auch aus einer Datenbank stammen. Mit den dazugehörigen XSL Dateien lassen sich die Inhalte in ein beliebiges Ausgabeformat, wie zum Beispiel HTML, TXT, RTF, PDF transformieren. Näheres zu den Features, Einsatzmöglichkeiten und Ausgabeformaten ist unter http://cocoon.apache.org/2.1/features.html zu finden. 12.3.3 XSLT Editoren ToDo STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 137 - © Prof. J. Goll - 12. XML Tools - 12.3.4 XSL-FO Prozessoren fop ist ein freier XSL-FO Prozessor von der Apache Software Foundation. Die aktuelle Version erzeugt unter anderem die Formate PDF, PCL, PS, SVG, XML und TXT. (http://xml.apache.org/fop/index.html) XEP ist ein kostenpflichtiger FO-Prozessor von der Firma RenderX. (http://www.renderx.com/FO2PDF.html) PassiveTeX ist eine Bibliothek von TeX Makros zur Umsetzung von XSLFormatierungsobjekten. (http://www.tei-c.org.uk/Software/passivetex/) WH2FO ist eine frei verfügbare Anwendung, um HTML-Dokumente aus Word nach XML-FO zu transformieren. (http://wh2fo.sourceforge.net/) XSL Formatter von Antenna House Inc. stellt ein komplettes Toolkit zur Verfügung, um aus XML mittels Formatting Objects PDF-Dokumente zu erstellen. (http://www.antennahouse.com/) Unicorn Formatting Objects ist ein in C++ geschriebenes Toolkit inklusive XSL-FO Prozessor zur Erzeugung von PDF, PS und HTML, das kostenlos verwendet werden kann. (http://www.unicorn-enterprises.com/products_ufo.html) REXP (Rendering Engine from XML/XSL into PDF) ist ein plattformunabhängiges Toolkit, das auf fop basiert. (http://www.esng.dibe.unige.it/REXP/) jfor ist ein in Java programmierter Open-Source XSL-FO Prozessor zur Generierung von RTF-Dokumenten. (http://www.jfor.org/) Apoc XSL-FO, ein Prozessor für Microsoft .NET, basiert ebenfalls auf fop. (http://www.chive.com/index.html) XMLmind FO Converter ist ein Java Programm zur Erzeugung von RTF Dokumenten aus FO. (http://www.xmlmind.com) STEINBEIS-TRANSFERZENTRUM SOFTWARETECHNIK Einführung in XML - 138 - © Prof. J. Goll