Övningar i XML och DTD

Medieteknik
Övningar i XML och DTD XML används för att strukturera information och DTD används för att definiera strukturen. I dessa
övningar tar vi upp båda språken, eftersom de tätt hänger ihop.
XML XML (eXtended Markup Language) är ett språk för att strukturera information. Språket har dock inga
bestämda element, utan består istället av en uppsättning regler för hur element och attribut skrivs. Med
XML kan man sedan definiera egna ”språk” genom att bestämma vad taggarna och attributen ska heta.
XHTML och RSS är exempel på språk som är definierade i XML.
De grundläggande regler som gäller för XML är i stort sett de samma som gäller för HTML:
•
•
•
•
•
•
•
•
•
•
Dokumentet måste börja med en XML-deklaration.
o Exempel: <?xml version="1.0" encoding="UTF-8"?>
Det måste finnas ett rotelement – en starttagg och tillhörande sluttagg som omger hela XML-koden i
dokumentet.
o På samma sätt som <html>-taggen i HTML-dokument.
Taggarna måste avslutas, antingen med en sluttagg eller ett /.
o Exempel: <abc>...</abc> eller <xyz />
Taggarna kan inkluderas i varandra, men ej överlappa varandra.
o Exempel:
Rätt: <abc>...<xyz>...</xyz>...</abc>
Fel: <abc>...<xyz>...</abc>...</xyz>
Man skiljer på gemena och versala bokstäver. Taggarna måste skrivas likadant både i start- och sluttagg.
o Exempel:
Rätt: <abc>...</abc> eller <Abc>...</Abc>
Fel: <Abc>...</abc>
I taggarnas namn kan endast bokstäver, siffror, _ och . användas. De måste inledas med en bokstav.
För tecknen < > " ' och & används samma koder som i HTML, dvs &lt; &gt; &quot; &apos; och &amp;
För åäöÅÄÖ kan man dock ej använda HTML-koder, utan använder teckenkoder från den teckenkodning
man använder. Används UTF-8 skrivs åäöÅÄÖ som &#229; &#228; &#246; &#197; &#196; och &#214;
o Lista med teckenkodning kan du säkert hitta genom att i Google söka på t.ex. "UTF-8 table" eller
"ISO-8859-1 table".
o I den första raden i dokumentet bör man i encoding-attributet ange vilken teckenkodning som
används och som dokumentet är sparat i. Då kan man skriva åäö som vanligt utan specialkoderna.
Attributvärden måste skrivas inom citattecken.
o Exempel: <image file="bilden.gif" />
Kommentarer skrivs på samma sätt som i HTML.
o Exempel: <!-- Min kommentar -->
Namnen på taggarna hittar man på själv och man bör då välja namn som beskriver innehållet, så att
man får en innehållsmässig struktur. Strukturen definierar man i ett DTD-dokument.
DTD DTD (Document Type Definition) är ett enkelt språk där man definierar en XML-tillämpning. Då man tar fram
en struktur och bestämmer namn för taggar och attribut, så gör man en formell beskrivning av detta i en DTD.
Då kan man sedan validera sina XML-dokument mot DTD:n, om man tar fram flera XML-dokument som ska
följa samma struktur.
Vi har redan i början av kursen använt en DTD, då vi validerade HTML-dokument. De validerades då
mot en DTD som definierar HTML. Vi behövde då inte skriva DTD:n själva, utan DTD:n för HTML
finns på W3C:s webbplats och används av validatorn.
2013-10-20 – Rune Körnefors ([email protected])
1
Medieteknik
Övningarna I dessa övningar ska du först analysera en fil med en XML-kod som innehåller ett antal fel genom att
ovanstående regler inte används korrekt. Du ska då se hur webbläsaren ger felmeddelanden och sedan
rätta dessa fel. I de resterande övningarna kommer du sedan att ledas genom ett antal steg för att göra
en innehållsmässig struktur av informationen i en litteraturlista.
Den största arbetsuppgiften då man använder XML, är att analysera vilket innehåll man har och
bestämma hur det ska struktureras och vad man ska kalla taggarna och attributen. Då det är klart, är
det en enkel match att skriva koden. Så en stor del av denna laboration består av ett resonemang kring
hur informationen kan struktureras.
Du ska först skapa ett dokument med både DTD- och XML-kod. Sedan ska dokumentet valideras i en
validator, för att kontrollera att XML-koden stämmer med DTD:n. Då detta är OK i validatorn, ska du
separera koderna i ett dokument för DTD och ett för XML. I XML-dokumentet refererar du till DTDdokumentet. Fördelen med detta är att samma DTD-dokument kan användas i flera XML-dokument.
1. Finn fem fel
I denna övning ska du analysera ett XML-dokument som innehåller en del fel. Koden följer inte exakt
de allmänna regler som gäller för XML. Med hjälp av de felmeddelanden som du får i webbläsaren, då
filen öppnas där, ska du rätta till felen. Även om du själv ser felen i koden utan att testa, så bör du göra
enligt nedan, för att se hur webbläsaren ger felmeddelanden.
Kontrollera och rätta felen. •
Öppna filen movies.xml i webbläsaren. (Filen hittar du i zip-filen XMLintro.zip, som du laddar ner från
•
Du får ett felmeddelande, som talar om på vilken rad det blir fel.
o Observera att webbläsaren stannar och ger felmeddelandet, då den inte längre kan tolka
koden. Ibland är felet på den rad som webbläsaren säger, men ibland kan det vara ett annat
fel högre upp i koden, som gett orsak till felet.
Öppna filen i din editor (samma program som du hade då du skrev HTML- och CSS-kod) och
rätta felet.
Gå sedan över till webbläsaren och ladda om filen.
Fortsätt så tills alla fel är rättade – då visar webbläsaren XML-koden.
o Då koden är korrekt visas endast XML-koden i webbläsaren, eftersom det inte finns någon
stilmall som anger hur den ska presenteras.
•
•
•
laborationens webbsida.)
Då du själv försökt, kan du se längst bak i detta dokument för ett "facit".
2. Informationsanalys
Du ska skapa en struktur som beskriver kurslitteraturen för en kurs. Utgå från litteraturlistan på
kursens webbplats (http://medieteknik.lnu.se/1me101/kursinfo/litteratur.htm). Listan ska ges en
”innehållsmässig” struktur (dvs innehållet i listan, inte innehållet i böckerna :-). Det är inte hela
innehållet på sidan som ska struktureras, så bortse från sidhuvud, sidfot och rutorna i högerkolumnen.
Det är alltså innehållet under rubriken Litteratur som ska struktureras. Vi struntar också i bilderna och
tar endast med texten.
Om syftet endast var att göra en presentation av litteraturen på en webbsida, så skulle det varit bäst att
använda HTML och CSS. Men vi ska istället utforma det som ett dokument som även kan användas
på andra sätt, t.ex. läsas in med JavaScript senare i kursen.
Om vi endast ska göra en presentation av informationen, så tänker vi troligen i termer som att
böckerna ska ligga i en lista, tabell eller på rader under varandra. Det ska också finnas en rubrik och
2013-10-20 – Rune Körnefors ([email protected])
2
Medieteknik
lite text. Men då gör vi en layoutmässig struktur och det underlättar inte, då vi sedan vill kunna göra
urval baserat på innehållet. Därför ska vi göra en innehållsmässig struktur, så första steget blir att
analysera vilket innehåll vi har och vad vi vill beskriva. Vi ska också försöka generalisera det, så att
samma struktur kan användas även för litteraturlistor i andra kurser.
Analysera innehållet Börja med att själv titta på innehållet och fundera på vilka delar det består av, t.ex. böcker som har titel
och författare, innan du går vidare med nedanstående analys. Diskutera gärna med en kurskamrat, ifall
du har möjlighet till det. Skriv ingen XML-kod ännu, utan fundera bara på vilka delar informationen
består av och hur dessa delar skulle kunna namnges.
3. Analys av innehållet
Det som finns är ett antal böcker, men om vi tänker lite bredare, så kan en litteraturlista även bestå av
artiklar och annat material. Så det vi har är ett antal referenser.
Vi kan behöva två typer av information, dels information om referensens innehåll och dels
information om vilken typ av referens det är.
Utifrån analysen ska vi ta fram termer som beskriver informationen. Dessa termer ska vara namn på
taggar eller attribut till dem. Så vi behöver också avgöra vad som ska vara taggar och vad som ska
vara attribut. Generellt brukar man ha taggar för ny information, medan man har attribut om det är
fakta om informationen (metainformation).
Termer för informationen Vi börjar med att ostrukturerat lista vilken information och fakta som finns. Vi har redan konstaterat
att vi har referenser, så vi tittar nu på vad en referens består av och inom parentes vilken form värdet
ska vara på. I namn på taggar och attribut ska man undvika åäö, så det kan vara bra att namnge dem på
engelska. I annat fall kan det bli konstigt då man t.ex. måste skriva farg istället för färg. Det är då lika
bra att använda engelska redan från början i termerna som beskriver innehållet.
•
reference
o type (book | article | electronic | other)
o title (text)
o author (text)
o publication_year (integer)
o publisher (text)
o isbn (integer)
o nr_of_pages (integer)
o link (url)
Inom parentes anges form för värdet. För type är värdet något av de ord som räknas upp. Med text
avses valfri text med vilka tecken som helst och integer är ett heltal (alltså endast siffror). De två sista
delarna (nr_of_pages och link) finns inte med i listan på webbsidan, men vi tar med dem här ändå.
Antal sidor (nr_of_pages) är totalt antal sidor i boken, artikeln eller vad det är för något. Om
referensen har en webbsida, så har vi en länk och behöver ange link med en url.
När vi sedan skriver termerna som namn på taggar, så kan vi inte ha blanktecken, så redan nu kan vi
undvika det och istället använda understrykningstecken som i nr_of_pages.
Man skulle också kunna tänka sig att upplaga (edition) skulle kunna vara en term i listan, men vi låter
det ingå i titeln i detta fall.
2013-10-20 – Rune Körnefors ([email protected])
3
Medieteknik
4. Strukturering
Nästa steg är att se om de olika termerna ska ligga på samma nivå eller om de ska struktureras på olika
nivåer. Det kanske också behöver läggas till underelement. Då vi ska strukturera detta ska vi skapa en
hierarkisk struktur (trädstruktur). Detta kan ritas upp grafiskt eller skrivas i form av en lista med
inskjutna termer. I övningen används den sistnämnda av dessa former. De termer som vi tagit fram
utgör olika beståndsdelar av informationen och vi kallar dem nu element.
Operatorer Vissa element kan upprepas på olika sätt, så vi använder oss av tre olika operatorer för att markera det.
Med abc* menas att vi kan upprepa elementet abc noll eller flera gånger, dvs det kan finnas hur
många gånger som helst, men kan också uteslutas. Med abc+ menas att vi kan ha elementet abc en
eller flera gånger. Det kan på samma sätt som för *-operatorn upprepas flera gånger, men det måste
finnas med minst en gång. Med abc? menas att elementet abc kan finnas noll eller en gång, dvs
antingen har man med det eller så utesluts det.
Struktur av innehållet Vi utgår nu från listan av termer för reference. I en litteraturlista kan vi ju ha flera referenser, så till att
börja med har vi:
•
reference+
o ...
Elementet reference kan alltså upprepas en eller flera gånger. Med ... avses här de övriga element
(type, title, etc.) som vi hade i listan tidigare.
För author behöver vi kunna ange både för- och efternamn. Vi behöver också kunna ange initialer för
förnamnet (det är inte alltid endast den första bokstaven, utan kan vara en annan kombination). Ser
man på litteraturlistan på webbsidan så behövs inte förnamnet, utan endast initialerna, men vi tar här
med båda. Så för author har vi:
•
author
o firstname
o lastname
o initial
Vi kan också ha flera författare. För en bok eller artikel kan det vara en eller flera författare, så för att
ange det kan vi använda +-operatorn på author, dvs author+. Men om referensen avser en webbsida
för ett företag eller annan organisation, så finns det kanske ingen person som är författare. Vi har då
endast en publisher, men ingen author, så author ska också kunna uteslutas. Vi ska alltså istället ha en
*-operator, för att ange att author kan upprepas noll eller flera gånger, dvs author*.
Elementen isbn och nr_of_pages har bara något innehåll om det är publicerad litteratur på papper, men
för en webbsida finns de inte. Detsamma gäller link, som endast finns om källan för referensen finns
på webben. Så alla dessa tre element kan uteslutas och ska ha ?-operatorn.
I övrigt behåller vi strukturen som tidigare, så vi har nu:
•
reference+
o type (book | article | electronic | other)
o title (text)
o author*
§ firstname (text)
§ lastname (text)
§ initial (text)
o publication_year (integer)
o publisher (text)
o isbn? (integer)
o nr_of_pages? (integer)
o link? (url)
2013-10-20 – Rune Körnefors ([email protected])
4
Medieteknik
Annat innehåll Vi har nu en uppsättning referenser, men om vi tittar på webbsidan med litteraturlistan, så finns det
även annan information. Det kan också finnas en kommentar med valfri text. Vi behöver också kunna
ange för vilken kurs som listan gäller och då behöver vi kanske både kurskod och kurstitel. Så vi får:
•
•
•
course
o code (text)
o title (text)
reference+
o ...
comment? (text)
På webbsidan har vi också en uppdelning i obligatorisk litteratur (mandatory) och bredvidläsningslitteratur (supplementary). Om referenserna för dessa hade olika form, så hade det varit naturligt att
dela upp det som:
•
•
mandatory
o mandatory_reference+
§ ...
supplementary
o supplementary_reference+
§ ...
Men nu skrivs referenserna likadant, oavsett om det är obligatorisk litteratur eller ej. Så det är bättre
att införa ytterligare ett underelement till reference, som anger om det är obligatorisk litteratur eller ej,
på samma sätt som vi anger typen. Detta element kan ha värdena yes eller no. Vi antar också att det
kan uteslutas (och tolkar det då som no), så vi använder ?-operatorn på det.
•
reference+
o mandatory? (yes | no)
o ...
Rotelement När vi skriver det som XML-kod, måste vi också ha ett rotelement som omger allting. Vi kan kalla
rotelementet course_litterature.
Vi har nu följande struktur:
•
course_literature
o course
§ code (text)
§ title (text)
o reference+
§ type (book | article | electronic | other)
§ mandatory? (yes | no)
§ title (text)
§ author*
• firstname (text)
• lastname (text)
• initial (text)
§ publication_year (integer)
§ publisher (text)
§ isbn? (integer)
§ nr_of_pages? (integer)
§ link? (url)
o comment? (text)
2013-10-20 – Rune Körnefors ([email protected])
5
Medieteknik
5. Attribut
Hittills har vi behandlat allt som element som har antingen ett innehåll eller flera underelement. T.ex.
kan course skrivas som:
<course>
<code>1ME101</code>
<title>Webbdesign</title>
</course>
Men allt behöver inte vara underelement, utan en del av det kan vara attribut. Så course skulle också
kunna skrivas som:
<course code="1ME101">Webbdesign</course>
eller
<course code="1ME101" title="Webbdesign" />
Det går alltså skriva det på flera olika sätt. Så vi behöver nu bestämma vad som ska skrivas som
element (taggar) och vad som ska vara attribut.
En del rekommenderar att man inte alls ska använda attribut, men det kan skapa onödigt krångliga
strukturer med mycket kod. Så attribut är bra för att ge extra information om taggarna.
Då man inför någon ny informationsdetalj bör det vara en tagg. Taggens namn beskriver innehållet.
Men då man ger ytterligare information om detta element (s.k. metainformation – information om
informationen), så kan det vara lämpligt att ha det som ett attribut. Ett exempel på detta är om man ska
ange vikt för något. Då är siffervärdet för vikten informationsinnehåll i en tagg, t.ex.
<weight>73</weight>
Enheten för vikten kan anges som ett attribut, t.ex.
<weight unit="kg">73</weight>
Detta blir ett kortare skrivsätt än t.ex.
<weight>
<value>73</value>
<unit>kg</unit>
<weight>
Naturligtvis skulle man också kunna ha
<weight>73 kg</weight>
Men om man har vikter i olika enheter, så kan det bli svårt att göra sorteringar baserat på enhet eller
vikt. Så det är bättre att separera värde och enhet i två olika taggar eller attribut.
Attribut i litteraturlistan I strukturen i litteraturlistan kan vi se type och mandatory under reference som beskrivning av
elementet. Värdet för dessa skrivs antagligen inte ut i någon presentation, utan används istället för
sortering eller urval. Dessa är därför lämpliga att ha som attribut. Taggen för reference ska alltså vara:
<reference type="..." mandatory="...">...</reference>
För author har vi ett underelement kallat initial, men det ska vara förnamnets initialer, så det är
naturligare att ha det som attribut i taggen firstname:
<firstname initial="...">...</firstname>
I elementet link ska vi ange en url och det kan vara lämpligt att ha som attribut. Då har vi inget annat
innehåll, så link blir ett s.k. tomt element, dvs utan sluttagg och avslutas då med snedstreck:
<link url="..." />
2013-10-20 – Rune Körnefors ([email protected])
6
Medieteknik
Slutlig struktur Vi har nu följande struktur:
•
course_literature
o course
§ code (text)
§ title (text)
o reference+
§ attribut: type (book | article | electronic | other)
§ attribut. mandatory? (yes | no)
§ title (text)
§ author*
• firstname (text)
o attribut: initial (text)
• lastname (text)
§ publication_year (integer)
§ publisher (text)
§ isbn? (integer)
§ nr_of_pages? (integer)
§ link?
• attribut: url (text)
o comment? (text)
6. DTD-kod
Nu när strukturen är klar, så är i princip DTD-koden klar. Det är bara att skriva om listan med
strukturen till kod för DTD:n. För element använder vi <!ELEMENT ...> och för attributen
<!ATTLIST ...>.
Till att börja med skriver vi DTD-koden i en DOCTYPE-tagg i XML-dokumentet, så blir det enklare
då vi ska validera XML-koden. Har vi både DTD- och XML-kod i samma dokument, så är det endast
ett dokument som ska skickas upp till validatorn. Sedan flyttar vi över DTD-koden till en separat fil,
så att samma DTD kan användas av flera XML-dokument.
Skapa ett nytt XML-­‐dokument •
•
Skapa ett nytt XML-dokument i din editor och spara det med lämpligt namn, t.ex.
"literature1me101.xml".
Skriv in följande kod i dokumentet:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
]>
o
Därmed har du först talat om att det är ett XML-dokument. Sedan har du påbörjat DTD:n i
DOCTYPE-taggen och angett att rotelementet är course_literature. DTD-koden ska sedan
skrivas på raderna mellan hakparenteserna.
2013-10-20 – Rune Körnefors ([email protected])
7
Medieteknik
DOCTYPE med DTD-­‐kod •
Påbörja DTD:n genom att lägga in en ELEMENT-tagg för rotelementet:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
]>
Denna ELEMENT-tagg definierar course_literature och anger att den har underelementet
course, reference och comment i den ordningen. Dessutom används + på reference, för att
ange att reference kan upprepas en eller flera gånger. På comment används ? för att ange
att elementet kan uteslutas.
Lägg sedan till kod för elementet course:
o
•
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
]>
Elementet course består av code och title. Dessa element definieras också med varsin
ELEMENT-tagg. Deras innehåll är text och det definieras som #PCDATA (parsed
character data). Parsed betyder att innehållet ska tolkas av webbläsaren, ifall det i texten
skulle förekomma några "entiteter" (t.ex. &#226;) som ska översättas till andra tecken.
Fortsätt sedan med elementet reference:
o
•
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT reference (title, author*, publication_year,
publisher, isbn?, nr_of_pages?, link?)>
]>
Detta element består av flera underelement, varav en del har * eller ? för att ange hur de
kan upprepas eller uteslutas.
Vi definierar nu attributen för reference:
o
•
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT reference (title, author*, publication_year,
publisher, isbn?, nr_of_pages?, link?)>
<!ATTLIST reference
type (book|article|electronic|other) #REQUIRED
mandatory (yes|no) #IMPLIED>
]>
o
o
Attributen definieras med ATTLIST. Först anges namnet på elementet (reference i detta
fall) och därefter definitionerna av attributen.
Det finns två attribut. Det första är type och de värden som får förekomma anges inom
parentes och åtskiljs med ett lodrätt streck. Därefter står det #REQUIRED för att markera
att detta attribut måste finnas med.
2013-10-20 – Rune Körnefors ([email protected])
8
Medieteknik
Det andra attributet är mandatory och det kan ha värdena yes eller no. Detta attribut är
valfritt (trots sitt namn :-) och det markeras med #IMPLIED.
Det första elementet i reference är title som består av text. Så för detta skulle vi ange
<!ELEMENT title (#PCDATA)>, men title finns redan definierat då vi la in koden för course. Så
vi behöver inte (och får inte) lägga in det en gång till. Den definition som redan är inlagd används
även här.
Lägg nu till kod för elementet author:
o
•
•
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT reference (title, author*, publication_year,
publisher, isbn?, nr_of_pages?, link?)>
<!ATTLIST reference
type (book|article|electronic|other) #REQUIRED
mandatory (yes|no) #IMPLIED>
<!ELEMENT author (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ATTLIST firstname initial CDATA #REQUIRED>
<!ELEMENT lastname (#PCDATA)>
]>
Elementet author består av firstname och lastname.
Både firstname och lastname består av text, vilket anges som #PCDATA.
Elementet firstname har dessutom attributet initial. Det består av text och markeras med
CDATA. Observera att det är utan #-tecken. Det är heller inte P för parsed, eftersom
attributets värde inte ska tolkas. Det kan inte innehålla entiteter.
Nu fortsätter vi med kod för publication_year, publisher, isbn och nr_of_pages:
o
o
o
•
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT reference (title, author*, publication_year,
publisher, isbn?, nr_of_pages?, link?)>
<!ATTLIST reference
type (book|article|electronic|other) #REQUIRED
mandatory (yes|no) #IMPLIED>
<!ELEMENT author (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ATTLIST firstname initial CDATA #REQUIRED>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT publication_year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT nr_of_pages (#PCDATA)>
]>
o
o
Alla dessa element består av #PCDATA, dvs valfri text.
För en del av dessa element hade vi tidigare i strukturen angett att de skulle bestå av
"integer", dvs heltal – en sekvens av siffror. Det går dock inte definiera i DTD, så vi får
nöja oss med att ange att innehållet ska vara vilka tecken som helst.
2013-10-20 – Rune Körnefors ([email protected])
9
Medieteknik
•
Lägg sedan till kod för link:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT reference (title, author*, publication_year,
publisher, isbn?, nr_of_pages?, link?)>
<!ATTLIST reference
type (book|article|electronic|other) #REQUIRED
mandatory (yes|no) #IMPLIED>
<!ELEMENT author (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ATTLIST firstname initial CDATA #REQUIRED>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT publication_year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT nr_of_pages (#PCDATA)>
<!ELEMENT link EMPTY>
<!ATTLIST link url CDATA #REQUIRED>
]>
Elementet link ska skrivs som <link url="..." />, dvs utan sluttagg. Så det är ett s.k. tomt
element, vilket anges med EMPTY.
o Elementet har attributet url som består av CDATA och måste finnas med (REQUIRED).
Slutligen lägger vi till kod för elementet comment:
o
•
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
<!ELEMENT course_literature (course, reference+, comment?)>
<!ELEMENT course (code, title)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT reference (title, author*, publication_year,
publisher, isbn?, nr_of_pages?, link?)>
<!ATTLIST reference
type (book|article|electronic|other) #REQUIRED
mandatory (yes|no) #IMPLIED>
<!ELEMENT author (firstname, lastname)>
<!ELEMENT firstname (#PCDATA)>
<!ATTLIST firstname initial CDATA #REQUIRED>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT publication_year (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT nr_of_pages (#PCDATA)>
<!ELEMENT link EMPTY>
<!ATTLIST link url CDATA #REQUIRED>
<!ELEMENT comment (#PCDATA)>
]>
o
Detta element består av text.
Därmed är DTD-koden klar och alla element och attribut är definierade. I detta fall är den skriven i
samma ordning som den struktur som tidigare togs fram. Taggarna är också inskjutna på samma sätt.
Det är dock inte nödvändigt att göra på detta sätt, utan taggarna kan skrivas hur som helst och i valfri
ordning. Men det blir lättare att se strukturen, om DTD:n skrivs på detta sätt.
2013-10-20 – Rune Körnefors ([email protected])
10
Medieteknik
7. XML-kod
Nu ska vi skriva XML-koden för en litteraturlista. Det görs under DTD:n i samma dokument.
Rotelementet •
Börja med att skriva in rotelementet:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE course_literature [
...
]>
<course_literature>
</course_literature>
Kod för kurs •
Därefter lägger du till kod för kursen:
<course_literature>
<course>
<code>1ME101</code>
<title>Webbdesign</title>
</course>
</course_literature>
Kod för en referens •
Skriv nu in kod för den första referensen:
<course_literature>
<course>
<code>1ME101</code>
<title>Webbdesign</title>
</course>
<reference type="book" mandatory="yes">
<title>Basics of Web Design</title>
<author>
<firstname initial="T.">Terry</firstname>
<lastname>Felke-Morris</lastname>
</author>
<publication_year>2012</publication_year>
<publisher>Addison-Wesley Educational Publishers</publisher>
<isbn>9780137003389</isbn>
<nr_of_pages>352</nr_of_pages>
</reference>
</course_literature>
2013-10-20 – Rune Körnefors ([email protected])
11
Medieteknik
Fler referenser •
Skriv in ett par referenser till för att prova, t.ex. för Garretts bok och boken av Lynch & Horton,
som också har en länk.
<reference type="book" mandatory="yes">
<title>The Elements of User Experience, Second edition</title>
<author>
<firstname initial="J.J.">Jessy James</firstname>
<lastname>Garrett</lastname>
</author>
<publication_year>2011</publication_year>
<publisher>New Riders</publisher>
<isbn>9780321683687</isbn>
<nr_of_pages>192</nr_of_pages>
</reference>
<reference type="book" mandatory="no">
<title>Web Style Guide, 3rd ed.</title>
<author>
<firstname initial="P.">Patrick</firstname>
<lastname>Lynch</lastname>
</author>
<author>
<firstname initial="S.">Sarah</firstname>
<lastname>Horton</lastname>
</author>
<publication_year>2008</publication_year>
<publisher>Yale University Press</publisher>
<isbn>9780300137378</isbn>
<nr_of_pages>338</nr_of_pages>
<link url="http://www.webstyleguide.com/" />
</reference>
8. Validering av XML-koden
Du ska nu kontrollera att din XML-kod är korrekt skriven. Första kontrollen är att se om de
grundläggande reglerna följs. Det kontrollerar du i webbläsaren, på samma sätt som i övning 1. Den
andra kontrollen är att se om koden följer den definition som görs i DTD-koden. Det görs i en
validator.
Kontrollera grundreglerna •
•
•
Öppna din XML-fil i webbläsaren.
Om allting är OK, så ska du se koden. Om du får något felmeddelande, så rättar du felet och
laddar sedan om filen i webbläsaren.
När allting är OK och koden visas, går du vidare till validatorn.
Kontrollera koden i en validator •
•
•
Öppna validatorn på följande url i webbläsaren: http://www.validome.org/xml/validate/
Klicka på knappen Browse (Bläddra) och peka ut din XML-fil.
Klicka sedan på knappen Validate.
o Validatorn kontrollerar då filen och efter ett tag bör du få en grön ruta med ett meddelande
som säger "The Document is Valid".
o Får du en röd ruta och felmeddelanden, så får du kontrollera felen och rätta dem.
§ Då man vet att man har en korrekt DTD, så är det i XML-koden felen finns och
ska rättas. Men i dessa övningar har du nu skrivit både DTD- och XML-koden
och kan ha skrivit fel någonstans. Så kontrollera båda koderna och jämför med det
som skrivits i dessa övningar.
2013-10-20 – Rune Körnefors ([email protected])
12
Medieteknik
Experimentera med fel i koden •
•
Ändra något i din XML-kod, så att den inte stämmer överens med DTD:n.
Prova att validera igen, för att se hur felmeddelandena ser ut.
9. DTD-dokument
När du nu fått fram en korrekt DTD-kod, ska du flytta ut den från XML-dokumentet till ett separat
dokument. Då kan flera XML-dokument utnyttja samma DTD och validera mot den. När man sedan
tar fram nya XML-dokument som beskriver litteraturlistor, så validerar man XML-dokumentet mot
DTD:n, för att kontrollera att man skrivit XML-koden korrekt.
Skapa ett DTD-­‐dokument •
•
•
•
Öppna din editor och skapa ett nytt tomt dokument. Spara det med namnet literature.dtd i samma
mapp som du har din XML-fil.
Öppna XML-filen (om du inte redan har den öppen) och kopiera DTD-koden, dvs alla
ELEMENT- och ATTLIST-taggar som står mellan hakparenteserna i DOCTYPE-taggen.
Klistra in koden i dokumentet literature.dtd och spara filen.
I XML-filen ändrar du DOCTYPE-taggen till följande:
<!DOCTYPE course_literature SYSTEM "literature.dtd">
Hakparenteserna och all DTD-kod tas alltså bort.
Denna tagg anger nu att rotelementet i XML-koden heter course_literature, att det är en
extern DTD-fil (SYSTEM) samt url till filen.
o Om DTD-filen ligger i samma mapp som XML-filen, räcker det att ange filnamnet. Men
skapar man sedan flera litteraturlistor för andra kurser, så kanske de ligger på andra ställen
och till och med andra servrar. Då anger man en fullständig url till DTD-filen.
I den första raden i XML-filen lägger du till ett attribut:
o
o
•
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
o
Detta anger att dokumentet inte "står på egna ben", utan är beroende av ett separat
dokument med DTD-koden.
Publicera och validera •
•
•
Publicera mappen med dina filer (både XML- och DTD-filen) i ditt webbutrymme på servern.
o Det måste vara i den öppna delen, om validatorn ska kunna hitta filerna. Så du kan inte
lägga dem i den lösenordskyddade mappen. (I kursens uppgift validerar du dock först
filerna medan de finns på din dator och publicerar dem sedan i den lösenordskyddade
mappen.)
Prova sedan att validera din publicerade XML-fil. Skriv in url:en till XML-filen (kontrollera noga
att den börjar med http och inte https) och klicka på knappen Validate.
Eftersom det är samma XML- och DTD-kod som tidigare, bör du inte få några fel.
Slut
Genom dessa övningar har du sett att XML-koden kan skrivas på många olika sätt. Det finns inga
bestämda regler för vad som ska vara med i informationen eller vad som ska vara taggar eller attribut.
De regler som finns för XML är istället regler för på vilken form man skriver koden (grundreglerna
som gavs i inledningen). Vad som ska vara taggar eller attribut är mer än smaksak. Man bör dock vara
konsekvent, så att liknande typ av information skrivs på samma sätt.
2013-10-20 – Rune Körnefors ([email protected])
13
Medieteknik
Facit för övning 1
De fem felen är:
•
•
•
•
•
rad 5: Sluttaggen är felstavad
rad 18: Starttaggen skrivs med gemener och sluttaggen med en inledande versal. Det måste vara
lika i båda taggarna.
rad 23: Attributvärdet måste skrivas inom citationstecken, "comedy".
rad 25: / saknas i sluttaggen för year. Detta fel är lite svårare att hitta, eftersom webbläsaren
upptäcker felet först då den kommer fram till sluttaggen för movie på rad 30. Anledningen till att
webbläsaren ej ger felmeddelande på rad 25 är att koden är syntaktiskt korrekt. Den har sett en
början på ett year-element, inuti det finns sedan ytterligare ett year-element (den felaktiga
sluttaggen) samt ytterligare ett antal element. Men då den kommer fram till sluttaggen för movie,
så ska den matcha den mot starttaggen för movie som ligger före year-taggarna. Därför vill den
första avsluta year-taggarna och säger att den förväntade sig en sluttagg för year.
rad 39: Sluttaggen för rotelementet, dvs movielist, saknas.
2013-10-20 – Rune Körnefors ([email protected])
14