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 < > " ' och & 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 å ä ö Å Ä och Ö 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. â) 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
© Copyright 2024