Aufgaben zur Vorlesung

Aufgabe 1:

Schreiben Sie ein XML Dokument, daß nach den Regeln der obigen DTD gebildet wird.

Aufgabe 2:

Die folgenden Dokumente sind kein wohlgeformetes XML. Begründen Sie, wo der Fehler liegt, und wie dieser Fehler behoben werden kann.
a)
<a>to be </a><b> or not to be</b>

b)
<person geburtsjahr=1767>Ferdinand Carulli</person>
Attributwerte müssen in Anführungszeichen stehen.
c)
<line>lebt wohl<br/>
<b>Gott weiß, wann wir uns wiedersehen</line>
<b> wird nicht geschlossen.
d)
<kockrezept><!--habe ich aus dem Netz
  <name>Saltimbocca</name>
  <zubereitung>Zutaten aufeinanderlegen 
               und braten.</zubereitung>
</kockrezept>
Kommentar wird nicht geschlossen.
e)
<cd>
  <artist>dead&alive</artist>
  <title>you spin me round</title></cd>
Das Zeichen \ muß als character entity &amp; geschrieben werden.

Aufgabe 3:

Gegeben sind das folgende XML-Dokument:
<?xml version="1.0" encoding="iso-8859-1" ?>
<autoren>
<autor>
  <person>
    <nachname>Shakespeare</nachname>
    <vorname>William</vorname>
  </person>
  <werke>
    <opus>Hamlet</opus>
    <opus>Macbeth</opus>
    <opus>King Lear</opus>
  </werke>
</autor>
<autor>
  <person>
    <nachname>Kane</nachname>
    <vorname>Sarah</vorname>
  </person>
  <werke>
    <opus>Gesäubert</opus>
    <opus>Psychose 4.48</opus>
    <opus>Gier</opus>
  </werke>
</autor>
</autoren>
a) Schreiben Sie eine DTD, das die Struktur dieses Dokuments beschreibt.
<!DOCTYPE autoren SYSTEM "AutorenType.dtd" [
<!ELEMENT autoren (autor+)>
<!ELEMENT autor (person,werke)>
<!ELEMENT werke (opus*)>
<!ELEMENT opus (#PCDATA)>
<!ELEMENT person (nachname,vorname)>
<!ELEMENT nachname (#PCDATA)>
<!ELEMENT vorname (#PCDATA)>]>

b) Entwerfen Sie Java Schnittstellen, die Objekte ihrer DTD beschreiben.
package name.panitz.xml.exercise;
import java.util.List;
public interface Autoren {
  List<Autor> getAutorList();
}
package name.panitz.xml.exercise;
public interface Autor {
  Person getPerson();
  Werke  getWerke();
}
package name.panitz.xml.exercise;
public interface Person {
  Nachname getNachname();
  Vorname  getVorname();
}
package name.panitz.xml.exercise;
import java.util.List;
public interface Werke {
  List<Opus> getOpusList();
}
package name.panitz.xml.exercise;
public interface HasJustTextChild {
  String getText();
}
package name.panitz.xml.exercise;
public interface Opus extends HasJustTextChild {}
package name.panitz.xml.exercise;
public interface Nachname extends HasJustTextChild {}
package name.panitz.xml.exercise;
public interface Vorname extends HasJustTextChild {}

c) Schreiben Sie ein XSLT-Skript, das obige Dokument in eine Html Liste der Werke ohne Autorangabe transformiert.
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
     <html><head><title>Werke</title></head>
       <body><xsl:apply-templates /></body>
     </html>
  </xsl:template>

  <xsl:template match="autoren">
     <ul><xsl:apply-templates select="autor/werke/opus"/></ul>
  </xsl:template>

  <xsl:template match="opus">
     <li><xsl:apply-templates/></li>
  </xsl:template>
</xsl:stylesheet>

d) Schreiben Sie eine Javamethode
List<String> getWerkListe(Autoren autoren);,
die auf den Objekten Ihrer Schnittstelle für Autoren eine Liste von Werknamen erzeugt.
package name.panitz.xml.exercise;
import java.util.List;
import java.util.ArrayList;

public class GetWerke{
  public List<String> getWerkListe(Autoren autoren){
    List<String> result = new ArrayList<String>();
    for (Autor a:autoren.getAutorList()){
      for (Opus opus: a.getWerke().getOpusList())
        result.add(opus.getText());
    }
    return result;
  }
}

Aufgabe 4:

Gegeben sei folgendes XML-Dokument:
<?xml version="1.0" encoding="iso-8859-1" ?>
<x1><x2><x5>5</x5><x6>6</x6></x2><x3><x7>7</x7></x3>
<x4><x8/><x9><x10><x11></x11></x10></x9></x4></x1>
a) Zeichnen Sie dieses Dokument als Baum.
b) Welche Dokumente selektieren, die folgenden XPath-Ausdrücke ausgehend von der Wurzel dieses Dokuments

Aufgabe 5:

Schreiben Sie eine Methode
List<Node> getLeaves(Node n);,
die für einen DOM Knoten, die Liste aller seiner Blätter zurückgibt.
package name.panitz.xml.exercise;
import java.util.List;
import java.util.ArrayList;
import org.w3c.dom.*;

public class GetLeaves{
  public List<Node> getLeaves(Node n){
    List<Node> result = new ArrayList<Node>();
    NodeList ns = n.getChildNodes();
    if (ns.getLength()==0){
      result.add(n); return result;
    }
    for (int i=0;i<ns.getLength();i++){
      result.addAll(getLeaves(ns.item(i)));
    }
    return result;
  }
}