Eidgenössische Technische Hochschule Zürich Swiss Federal Institute of Technology Zurich Institut für Informationssysteme Dr. C. Türker XML und Datenbanken WS 03/04 Übung 3 Beispiellösung XML, XML-DTDs, und XML Schema Aufgabe 1: Gültige XML-Dokumente Gegeben sei die folgende DTD Bookstore.dtd. <!ELEMENT bookstore (book)*> <!ELEMENT book (title, author+, price?, review*)> <!ATTLIST book genre CDATA #REQUIRED> <!ELEMENT title <!ELEMENT author (name (firstname, lastname))> <!ELEMENT price <!ELEMENT name <!ELEMENT firstname <!ELEMENT lastname <!ELEMENT review (reviewer, reviewtext)> <!ATTLIST review date CDATA #IMPLIED> <!ELEMENT reviewer (name (firstname, lastname))> <!ELEMENT reviewtext ANY> Überprüfen Sie, ob das folgende XML-Dokument wohlgeformt und gültig bezüglich dieser DTD ist. Ändern Sie gegebenenfalls das Dokument so ab, dass es sowohl wohlgeformt als auch gültig ist. <!DOCTYPE bookstore SYSTEM "Bookstore.dtd"> <bookstore> <title>data on the Web: From Relations to Semistructured Data and XML. </title> <name>serge</name> <name>abiteboul</name> 1
<firstname>peter</firstname> <lastname>buneman</lastname> <name>dan Suciu</name> <name>torsten Grabs</name> Ich habe das Buch gelesen und es zeigt einige Konzepte sehr schön. <emph>allerdings ist es schon etwas älter.</emph> <name>ein Student</name> Wenn <name>herr Türker</name> davon <it>sooo</it> begeistert ist, dann muss man das ja gelesen haben. <price>20,00 <currency>chf</currency></price> <title>xml und Datenbanken</title> <name>m. Klettke und H. Meyer</name> <name>can Türker</name> Viele Aspekte der Vorlesung werden von diesem Buch abgedeckt. </bookstore> Das Dokument ist schon wohlgeformt, gültig bezüglich der vorgegebenen DTD ist dann das 2
nachfolgend angegebene Dokument. XML-Kommentare im Dokument erläutern die wichtigsten Anpassungen. <!DOCTYPE bookstore SYSTEM "Bookstore.dtd"> <bookstore> <title> Data on the Web: From Relations to Semistructured Data and XML. </title> <!-- keine mehrfachen Vorkommen des name-elements in author --> <firstname>serge</firstname> <lastname>abiteboul</lastname> <firstname>peter</firstname> <lastname>buneman</lastname> <name>dan Suciu</name> <!-- Dokumentordnung: price muss nach author vor reviews kommen --> <price> 20,00 CHF </price> <name>torsten Grabs</name> <!-- in ANY sind nur Sub-Elemente erlaubt, die in der DTD definiert sind --> Ich habe das Buch gelesen und es zeigt einige Konzepte sehr schön. Allerdings ist es schon etwas älter. <name>ein Student</name> <!-- in ANY sind nur Sub-Elemente erlaubt, die in der DTD definiert sind --> Wenn <name>herr Türker</name> davon SOOO begeistert ist, dann muss man das ja gelesen haben. 3
<title>xml und Datenbanken</title> <name>m. Klettke und H. Meyer</name> <name>can Türker</name> Viele Aspekte der Vorlesung werden von diesem Buch abgedeckt. </bookstore> Aufgabe 2: Entwurf von XML DTDs Abbildung 1: Modell einer Auktionsdatenbank in RMSDM-Notation Setzen sie das Modell der Auktionsdatenbank aus Abbildung 1 möglichst genau in eine XML- DTD um. Welche Sachverhalte konnten Sie in der DTD nicht umsetzen? Die folgende DTD gibt das RMSDM-Modell aus Abbildung 1 wieder. Nicht modelliert werden konnte die Sub-Typ-Beziehung zwischen auction und closed auction. Hierzu müsste man statt XML DTDs zu verwenden auf XML Schema zurückgreifen, das die Modellierung von 4
Subtyp-Beziehungen unterstützt. Neu hinzugekommen ist auch die Dokumentordnung in den gültigen XML-Dokumenten. Das RMSDM-Modell hat beispielsweise nicht explizit vorgesehen, dass address bei einer Person vor balance erscheint. <!ELEMENT store (name, persons, auctions)> <!ELEMENT name <!ELEMENT persons (person)*> <!ELEMENT auctions (auction closed_auction)*> <!ELEMENT person (name, address, balance?)> <!ATTLIST person pid ID #REQUIRED> <!ELEMENT auction (bid*, item)> <!ELEMENT closed_auction (bid*, item, price)> <!ATTLIST closed_auction buyer IDREF #REQUIRED> <!ELEMENT address <!ELEMENT balance <!ELEMENT price <!ELEMENT bid <!ATTLIST bid bidder IDREFS #REQUIRED> <!ELEMENT item Aufgabe 3: XML Schema Setzen Sie die folgende XML DTD für eine Buch-Datenbank möglichst genau nach XML Schema um. <!ELEMENT bookstore (book)*> <!ELEMENT book (title, author+, price?)> <!ATTLIST book genre CDATA #REQUIRED> <!ELEMENT title <!ELEMENT author ( name (firstname, lastname))> <!ELEMENT price <!ELEMENT name <!ATTLIST price currency (CHF EUR USD) #REQUIRED> <!ELEMENT firstname <!ELEMENT lastname Eine Möglichkeit, die DTD nach XML Schema umzusetzen ist die folgende: <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:annotation> 5
<xsd:documentation xml:lang="en"> Bookstore Example, ETH Zurich, 2001 </xsd:documentation> </xsd:annotation> <xsd:element name="bookstore" type="bookstore"/> <xsd:complextype name="bookstore"> <xsd:sequence> <xsd:element name="book" type="book" minoccurs= 1 maxoccurs="unbounded"/> </xsd:sequence> <xsd:complextype name="book"> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="author" type="author" minoccurs= 1 maxoccurs="unbounded"/> <xsd:element name="price" minoccurs= 0 > <xsd:complextype> <xsd:simplecontent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="currency" type="currency"/> </xsd:extension> </xsd:simplecontent> </xsd:element> </xsd:sequence> <xsd:attribute name="genre" type="genre"/> <xsd:simpletype name="genre"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="autobiography"/> <xsd:enumeration value="novel"/> <xsd:enumeration value="philosophy"/> </xsd:restriction> </xsd:simpletype> <xsd:complextype name="author"> <xsd:choice> <xsd:element name="name" type="xsd:string"/> <xsd:group ref="fullname"/> </xsd:choice> <xsd:group name="fullname"> <xsd:sequence> <xsd:element name="firstname" type="xsd:string"/> 6
<xsd:element name="lastname" </xsd:sequence> </xsd:group> type="xsd:string"/> <xsd:simpletype name="currency"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="chf"/> <xsd:enumeration value="eur"/> <xsd:enumeration value="usd"/> </xsd:restriction> </xsd:simpletype> </xsd:schema> 7