Nada

2D1525, Programmering för interaktiva medier
Laboration 1: DTD och XML Schemas
Laborationspäng: 4-11

Laborationen som pdf

Förberedelser 

Läs kapitel 1-4 i XML in a nutshell, samt läs utdelade föreläsningsanteckningar  Om du planerar att jobba hemifrån krävs ett konto där du kan lägga upp webbsidor. Du har ett konto på datan.gt.kth.se och för att logga in på det krävs någon form av SSL-baserad inloggning. Från nada skriver man bara
>ssh -l användarnanm datan.gt.kth.se


För mac och windows finns några klienter

Översikt


I denna laboration ska du lära dig skriva DTDer och lära dig skriva XML-dokument som kan valideras mot en DTD. Som utvidgning kan du även göra XML Schemas.
 

Poäng

Del 1 är obligatorisk och ger 4 poäng. Del 2 är frivillig och ger 5 poäng. Om laborationen redovisas senast 2001-09-20 erhålles 2 ytterligare bonuspoäng.
 

Del 1: DTD (4 p)


Börja med att kopera dokumenten start.dtd och start.xml till en katalog som är åtkomlig från webben. Om du labbar på datan.gt.kth.se gör du förslagsvis såhär:

Logga in med hjälp av någon ssh-klient, t.ex. nifty telnet. Om det inte redan finns ett färdigt alias till datan.gt.kth.se så välj "New connecteion", därefter "New...", välj protokoll "SSH - 3DES" och fyll i hostname "datan.gt.kth.se". Utför därefter följande kommandon:

mkdir public_html
chmod 755 public_html
cd public_html
mkdir 2D1525
cd 2D1525
mkdir lab1
cd lab1
cp /home0/courses/2D1525/lab1/start.dtd .
cp /home0/courses/2D1525/lab1/start.xml .
Gå till en valideringstjänst på webben, förslagsvis http://www.stg.brown.edu/service/xmlvalid
Skriv därefter in urlen till där du lade dokumentet. På datan blir det, om du följde instruktionerna,
http://datan.gt.kth.se/~ditt-användarnamn/2D1525/lab1/start.xml
Om du får meddelandet att det inte fanns några fel så är du redo att börja laborationen.

Om det går långsamt med den webbaserade valideringen kan du även köra valideringen lokalt, men var beredd på att output är mer svårläst:

>xmlparse start.xml
 

Mål

Målet för denna laboration är att skapa ett xml-baserat format för att modellera och planera fester. Exempel på vad som ska ingå är tema, lokal, datum och tid, meny, gästlista, gästers eventuella mat- och dryckpreferenser samt bordspaceringsrestriktioner.

Börja med att skapa en skapa två filer, party.dtd och party.xml, förslagsvis genom att använda unixtexteditorn emacs (se kort intro till emacs).
 
 

1. Inled med att skapa två filer: en DTD, party.dtd, och ett instansdokument, party.xml, med rootelemetet "party" som inledningsvis ska innehålla ett underelement "title" som ska innehålla pcdata. Glöm inte att i instansdokumentet (dvs party.xml) ha med en dokumenttypdeklaration som anger rätt rootdokument i rätt DTD. Ange även en xml-deklaration (se föreläsningsanteckningarna om xml samt kapitel 2-3 i boken).

Validera dokumentet på samma sätt som ovan.

Förutom en "titel" på en fest finns flera andra relevanta fakta, såsom datum, tid och plats. Exakt hur man väljer att koda sådan information är helt upp till DTD-författaren. Exempelvis kan data kodas antingen som element eller som attribut till andra element. Inledningsvis väljer vi att koda data huvudsakligen som element.
 

2. Modifiera DTDn så att den på ett vettigt sätt kan validera ett dokument som ser ut så här:
<party>
  <title>Amphiox Gasque</title>
  <date>2001-09-08</date>
  <starttime>18.00</starttime>
  <endtime>03.00</endtime>
  <arranger>MF</arranger>
  <location>MF</location>
  <price unit="sek">195</price>
  <OSAdate>2001-08-24</OSAdate>
  <description>
    Party for the new students at Medicinska F&ouml;reningen.
  </description>
  <contact>
    <firstname>Berra</firstname>
    <lastname>Berrasson</lastname>
    <phone>08-123456</phone>
    <email>berra@mf.ki.se</email>
  </contact>
  <host>
    <firstname>Anna</firstname>
    <lastname>Jerresand-&Ouml;hrstr&ouml;m</lastname>
  </host>
  <toastmaster>
    <firstname>Miranda</firstname>
    <lastname>Michanek</lastname>
  </toastmaster>
  <toastmaster>
    <firstname>Johannes</firstname>
    <lastname>Linde</lastname>
  </toastmaster>
</party>


Host och toastmaster ska kunna förekomma noll till många gånger, endtime, price, OSAdate, description och contact ska förekomma noll eller en gång, övriga element ska förekomma exakt en gång. Elementet price ska ha ett optional attribut som heter unit. Glöm inte att definiera entiteter för stort och litet "Ö", litet ö har den decimala koden #246 och stort Ö har #214

Klipp in ovanstående xml-kod i ditt instansdokument och validera mot din modifierade DTD.

Förutom beskrivning av tid, plats och kontaktpersoner brukar maten vara ett viktigt inslag.
 

3. Komplettera DTDn och xml-dokumentet med elementet menu som ska förekomma noll till en gång efter toastmaster.
  <menu>
    <starter>
      <food type="shellfish">Toast Skagen</food>
      <drink type="beer">Carlsberg Hof</drink>
    </starter>
    <main_course>
      <food type="meat">B&brkbar;uf Ni&ccedil;osie</food>
      <drink type="red_wine">Castillo de Benizar</drink>
    </main_course>
    <dessert>
      <food type="dairy">Vanilla icecream</food>
      <drink type="coffee">Espresso</drink>
      <drink type="cognac">Napoleon Cognac</drink>
    </dessert>
  </menu>
 
  • En meny innehåller 0-1 starter, 1 main_course och 0-1 dessert.
  • Alla dessa element innehåller 0-många food-element samt 0-många drink-element
  • food ska ha ett attribut type som kan anta något av värdena shellfish, fish, meat, vegetarian, dairy eller other. Attributet ska vara icke-obligatoriskt.
  • drink ska likaledes ha ett attribut "type" som kan anta något av värdena beer, red_wine, white_wine, coffee, cognac, tea, punch eller other. Attributet ska vara icke-obligatoriskt.


Som du märker är innehållet (content model) exakt lika för starter, main_course och dessert. Gör därför en parameterentitet för detta innehåll.
 
 

  • &brkbar; används för tecknet ¦ vilket har den decimala koden #166
  • &ccedil; används för tecknet ç vilket har den decimala koden #231


Gör entitetsdeklarationer för dessa två tecken.
 
 

Validera dokumentet.

Ingen fest blir dock speciellt rolig utan gäster. Dessa gäster brukar ha en massa irriterande önskemål såsom vegetarisk mat, att de inte dricker rött vin samt att de inte vill sitta brevid vissa personer men vill sitta brevid andra personer.
 
 

4. Komplettera DTDn och xml-dokumentet med elementet guestlist  som ska förekomma noll till en gång efter menu.
 
  <guestlist>
    <guest id="pnr771212-1212" sex="male">
      <firstname>Sven</firstname>
      <lastname>Svensson</lastname>
      <affiliation>KTH</affiliation>
      <placementpreferences>
        <id nextto="yes" id="pnr760101-0101" />
      </placementpreferences>
      <foodrestrictions>
        <ingredient>garlic</ingredient>
        <ingredient>meat</ingredient>
      </foodrestrictions>
      <drinkrestrictions>
        <drink type="red_wine" />
        <drink type="beer" />
      </drinkrestrictions>
    </guest>
    <guest id="pnr760101-0101" sex="female">
      <firstname>Anna</firstname>
      <lastname>Karlsson</lastname>
      <affiliation>MF</affiliation>
      <placementpreferences>
        <id nextto="no"  id="pnr771212-1212" />
      </placementpreferences>
      <drinkrestrictions>
        <drink type="beer" />
      </drinkrestrictions>
    </guest>
  </guestlist>
 
  • En guestlist kan innehålla 0-många gäster.
  • Ett guest-element har ett obligatoriskt id-attribut som ska vara unikt inom xml-dokumentet (vilket är en speciell datatyp).
  • Det har även ett obligatoriskt sex-attribut som kan antaga något av värdena male, female eller unknown.
  • Ett guest-element kan, förutom de obligatoriska elementen firstname och lastname även innehålla en affiliation, placementpreferences, foodrestrictions och drinkrestrictions.
  • Ett placementpreferenceselement innehåller 1-många element av typen id. Ett sådant element har tomt innehåll men två obligatoriska attribut; nextto och id. Attributet  nextto kan anta ett av värdena "yes" eller "no", medan attributet id är en referens till ett id-attribut såsom definierades i guest-elementet (vilket även detta är en speciell datatyp).
  • Foodrestrictions-elementet ska innehålla 1-många ingredient-element vilka kan antaga text-data.
  • Drinkrestrictions-elementet ska innehålla 1-många drink-element, exakt som definierats tidigare.
Som du märker har vi nu ett antal varianter av element som alla representerar personer: host, toastmaster, contact och guest. Gör därför en parameterentitet som representerar det som är gemensamt för alla person-element och stoppa in den entiteten i deklarationerna av respektive element.

Validera dokumentet.

Nu är den obligatoriska delen av laborationen färdig!  Skriv ut DTDn och anteckna dig på redovisningslistan om du inte planerar att utföra även del 2, XML Schemas.


 

Del 2: XML Schema (5p)

 
5. Gör en fil, party2.xml, vars innehåll är så här
 
<?xml version="1.0"?>
<party  xmlns="http://datan.gt.kth.se/~ditt-användarnamn/2D1525/lab1/"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation=
           "http://datan.gt.kth.se/~ditt-användarnamn/2D1525/lab1/
            http://datan.gt.kth.se/~ditt-användarnamn/2D1525/lab1/party.xsd">

  <title>
    Amphiox Gasque
  </title>
</party>


Byt givetvis ut ditt-användarnamn mot just ditt användarnamn

Gör sedan en fil, party.xsd var innehåll är

<?xml version="1.0" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:party="http://datan.gt.kth.se/~ditt-användarnamn/2D1525/lab1/"
        targetNamespace="http://datan.gt.kth.se/~ditt-användarnamn/2D1525/lab1/">



  <element name="party"             type="party:PartyType"/>
  <element name="title"             type="string"/>

  <complexType name="PartyType">
    <sequence>
      <element ref="party:title"/>
    </sequence>
  </complexType>
</schema>
Byt även här ut ditt-användarnamn mot ditt användarnamn

Validera dokumentet  party2.xml på http://www.w3.org/2001/03/webdata/xsv . Glöm inte att klicka i vilken browsertyp du använder.

Nu ska du börja modifiera schemat party.xsd så att det till slut kan validera party.xml (förutsatt att alla namespacedeklarationer i elemetet party från dokumentet party2.xml stoppats in).
 

6. Börja med att deklarera de enkla elementen såsom title, date, starttime osv. De flesta av dessa har datatyper som finns definierade i XML Schema primer. Notera att du ska använda "rätt" datatyp. Att deklarera dessa datatyper som strängar gör förvisso dokumentet validerbart, men utnyttjar inte de möjligheter som finns.

Ett tips är att deklarera något/några element i taget, testa att sätta in motsvarande element i instansdokumentet och därefter validera. Annars blir man lätt förvirrad av många felmeddelanden. Observera också att validatorn hittar fel både i schemat och i instansdokumentet.

Två "simpleTypes", phone och email, kräver att du definiera egna datatyper. Dessa ska definieras med hjälp av regular expressions (se appendix D i XML Schema primer).

  • phone ska vara uppbyggt enligt följande: Först en nolla följt av 1-3 siffror. Därefter ett "-" följt av 5-8 siffror.
  • email ska vara uppbyggd av en eller flera "word characters" följt av ett "@" följt av en eller flera word characters. Avslutningsvis ska en eller flera upprepningar av sekvensen ("." följt av en eller flera word characters") finnas.
  • Observera att stödet för sådana datatyper är dåligt i valideringstjänsten. Det kan hända att den godkänner inkorrekta uttryck.
Elementen starter, main_course och dessert ska alla ha exakt samma datatyp, dishType.

Elementen contact, host, toastmaster och guest ska alla "ärva" sin content-model från ett datatyp som ska heta "person". Datatypen person ska innehålla ett firstname-element följt av ett lastname-element.

I övrigt ska schemat vara minst lika restriktivt som DTDn. Entiteter för märkliga tecken deklareras  med ett internt DTD-subset i instansdokumentet (se appendix C i XML Schema Primer).

När allt är klart ska det gå att validera party2.xml som ska se ut exakt som party.xml fråntaget namespacedeklarationerna och det interna DTD-subsetet.

 


^ Upp till Nadas kurser.
Sidansvarig: <bjornh@kth.se>
Senast ändrad 8 september 2001

Valid XHTML 1.0!