Övningar i XML ch DTD XML används för att strukturera infrmatin ch DTD används för att definiera strukturen. I dessa övningar tar vi upp båda språken, eftersm de tätt hänger ihp. XML XML (extended Markup Language) är ett språk för att strukturera infrmatin. Språket har dck inga bestämda element, utan består istället av en uppsättning regler för hur element ch attribut skrivs. Med XML kan man sedan definiera egna språk genm att bestämma vad taggarna ch attributen ska heta. XHTML ch RSS är exempel på språk sm är definierade i XML. De grundläggande regler sm gäller för XML är i strt sett de samma sm gäller för HTML: Dkumentet måste börja med en XML-deklaratin. Exempel: <?xml versin="1.0" encding="utf-8"?> Det måste finnas ett rtelement en starttagg ch tillhörande sluttagg sm mger hela XML-kden i dkumentet. På samma sätt sm <html>-taggen i HTML-dkument. Taggarna måste avslutas, antingen med en sluttagg eller ett /. Exempel: <abc>...</abc> eller <xyz /> Taggarna kan inkluderas i varandra, men ej överlappa varandra. Exempel: Rätt: <abc>...<xyz>...</xyz>...</abc> Fel: <abc>...<xyz>...</abc>...</xyz> Man skiljer på gemena ch versala bkstäver. Taggarna måste skrivas likadant både i start- ch sluttagg. Exempel: Rätt: <abc>...</abc> eller <Abc>...</Abc> Fel: <Abc>...</abc> I taggarnas namn kan endast bkstäver, siffrr, _ ch. användas. De måste inledas med en bkstav. För tecknen < > " ' ch & används samma kder sm i HTML, dvs < > &qut; &aps; ch & För åäöåäö kan man dck ej använda HTML-kder, utan använder teckenkder från den teckenkdning man använder. Används UTF-8 skrivs åäöåäö sm å ä ö Å Ä ch Ö Lista med teckenkdning kan du säkert hitta genm att i Ggle söka på t.ex. "UTF-8 table" eller "ISO-8859-1 table". I den första raden i dkumentet bör man i encding-attributet ange vilken teckenkdning sm används ch sm dkumentet är sparat i. Då kan man skriva åäö sm vanligt utan specialkderna. Attributvärden måste skrivas inm citattecken. Exempel: <image file="bilden.gif" /> Kmmentarer skrivs på samma sätt sm i HTML. Exempel: <!-- Min kmmentar --> Namnen på taggarna hittar man på själv ch man bör då välja namn sm beskriver innehållet, så att man får en innehållsmässig struktur. Strukturen definierar man i ett DTD-dkument. DTD DTD (Dcument Type Definitin) är ett enkelt språk där man definierar en XML-tillämpning. Då man tar fram en struktur ch bestämmer namn för taggar ch attribut, så gör man en frmell beskrivning av detta i en DTD. Då kan man sedan validera sina XML-dkument mt DTD:n, m man tar fram flera XML-dkument sm ska följa samma struktur. Vi har redan i början av kursen använt en DTD, då vi validerade HTML-dkument. De validerades då mt en DTD sm definierar HTML. Vi behövde då inte skriva DTD:n själva, utan DTD:n för HTML finns på W3C:s webbplats ch används av validatrn. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 1
Övningarna I dessa övningar ska du först analysera en fil med en XML-kd sm innehåller ett antal fel genm att vanstående regler inte används krrekt. Du ska då se hur webbläsaren ger felmeddelanden ch sedan rätta dessa fel. I de resterande övningarna kmmer du sedan att ledas genm ett antal steg för att göra en innehållsmässig struktur av infrmatinen i en litteraturlista. Den största arbetsuppgiften då man använder XML, är att analysera vilket innehåll man har ch bestämma hur det ska struktureras ch vad man ska kalla taggarna ch attributen. Då det är klart, är det en enkel match att skriva kden. Så en str del av denna labratin består av ett resnemang kring hur infrmatinen kan struktureras. Du ska först skapa ett dkument med både DTD- ch XML-kd. Sedan ska dkumentet valideras i en validatr, för att kntrllera att XML-kden stämmer med DTD:n. Då detta är OK i validatrn, ska du separera kderna i ett dkument för DTD ch ett för XML. I XML-dkumentet refererar du till DTDdkumentet. Fördelen med detta är att samma DTD-dkument kan användas i flera XML-dkument. 1. Finn fem fel I denna övning ska du analysera ett XML-dkument sm innehåller en del fel. Kden följer inte exakt de allmänna regler sm gäller för XML. Med hjälp av de felmeddelanden sm du får i webbläsaren, då filen öppnas där, ska du rätta till felen. Även m du själv ser felen i kden utan att testa, så bör du göra enligt nedan, för att se hur webbläsaren ger felmeddelanden. Kntrllera ch rätta felen. Öppna filen mvies.xml i webbläsaren. (Filen hittar du i zip-filen XMLintr.zip, sm du laddar ner från labratinens webbsida.) Du får ett felmeddelande, sm talar m på vilken rad det blir fel. Observera att webbläsaren stannar ch ger felmeddelandet, då den inte längre kan tlka kden. Ibland är felet på den rad sm webbläsaren säger, men ibland kan det vara ett annat fel högre upp i kden, sm gett rsak till felet. Öppna filen i din editr (samma prgram sm du hade då du skrev HTML- ch CSS-kd) ch rätta felet. Gå sedan över till webbläsaren ch ladda m filen. Frtsätt så tills alla fel är rättade då visar webbläsaren XML-kden. Då kden är krrekt visas endast XML-kden i webbläsaren, eftersm det inte finns någn stilmall sm anger hur den ska presenteras. Då du själv försökt, kan du se längst bak i detta dkument för ett "facit". 2. Infrmatinsanalys Du ska skapa en struktur sm beskriver kurslitteraturen för en kurs. Utgå från litteraturlistan på kursens webbplats (http://medieteknik.lnu.se/1me101/kursinf/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 sm ska struktureras, så brtse från sidhuvud, sidft ch rutrna i högerklumnen. Det är alltså innehållet under rubriken Litteratur sm ska struktureras. Vi struntar ckså i bilderna ch tar endast med texten. Om syftet endast var att göra en presentatin av litteraturen på en webbsida, så skulle det varit bäst att använda HTML ch CSS. Men vi ska istället utfrma det sm ett dkument sm ä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 presentatin av infrmatinen, så tänker vi trligen i termer sm att böckerna ska ligga i en lista, tabell eller på rader under varandra. Det ska ckså finnas en rubrik ch 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 2
lite text. Men då gör vi en layutmässig struktur ch 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 ch vad vi vill beskriva. Vi ska ckså försöka generalisera det, så att samma struktur kan användas även för litteraturlistr i andra kurser. Analysera innehållet Börja med att själv titta på innehållet ch fundera på vilka delar det består av, t.ex. böcker sm har titel ch 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-kd ännu, utan fundera bara på vilka delar infrmatinen består av ch hur dessa delar skulle kunna namnges. 3. Analys av innehållet Det sm finns är ett antal böcker, men m vi tänker lite bredare, så kan en litteraturlista även bestå av artiklar ch annat material. Så det vi har är ett antal referenser. Vi kan behöva två typer av infrmatin, dels infrmatin m referensens innehåll ch dels infrmatin m vilken typ av referens det är. Utifrån analysen ska vi ta fram termer sm beskriver infrmatinen. Dessa termer ska vara namn på taggar eller attribut till dem. Så vi behöver ckså avgöra vad sm ska vara taggar ch vad sm ska vara attribut. Generellt brukar man ha taggar för ny infrmatin, medan man har attribut m det är fakta m infrmatinen (metainfrmatin). Termer för infrmatinen Vi börjar med att strukturerat lista vilken infrmatin ch fakta sm finns. Vi har redan knstaterat att vi har referenser, så vi tittar nu på vad en referens består av ch inm parentes vilken frm värdet ska vara på. I namn på taggar ch attribut ska man undvika åäö, så det kan vara bra att namnge dem på engelska. I annat fall kan det bli knstigt 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 sm beskriver innehållet. reference type (bk article electrnic ther) title (text) authr (text) publicatin_year (integer) publisher (text) isbn (integer) nr_f_pages (integer) link (url) Inm parentes anges frm för värdet. För type är värdet någt av de rd sm räknas upp. Med text avses valfri text med vilka tecken sm helst ch integer är ett heltal (alltså endast siffrr). De två sista delarna (nr_f_pages ch link) finns inte med i listan på webbsidan, men vi tar med dem här ändå. Antal sidr (nr_f_pages) är ttalt antal sidr i bken, artikeln eller vad det är för någt. Om referensen har en webbsida, så har vi en länk ch behöver ange link med en url. När vi sedan skriver termerna sm namn på taggar, så kan vi inte ha blanktecken, så redan nu kan vi undvika det ch istället använda understrykningstecken sm i nr_f_pages. Man skulle ckså kunna tänka sig att upplaga (editin) skulle kunna vara en term i listan, men vi låter det ingå i titeln i detta fall. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 3
4. Strukturering Nästa steg är att se m de lika termerna ska ligga på samma nivå eller m de ska struktureras på lika nivåer. Det kanske ckså 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 frm av en lista med inskjutna termer. I övningen används den sistnämnda av dessa frmer. De termer sm vi tagit fram utgör lika beståndsdelar av infrmatinen ch vi kallar dem nu element. Operatrer Vissa element kan upprepas på lika sätt, så vi använder ss av tre lika peratrer för att markera det. Med abc* menas att vi kan upprepa elementet abc nll eller flera gånger, dvs det kan finnas hur många gånger sm helst, men kan ckså uteslutas. Med abc+ menas att vi kan ha elementet abc en eller flera gånger. Det kan på samma sätt sm för *-peratrn upprepas flera gånger, men det måste finnas med minst en gång. Med abc? menas att elementet abc kan finnas nll 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+... Elementet reference kan alltså upprepas en eller flera gånger. Med... avses här de övriga element (type, title, etc.) sm vi hade i listan tidigare. För authr behöver vi kunna ange både för- ch efternamn. Vi behöver ckså kunna ange initialer för förnamnet (det är inte alltid endast den första bkstaven, utan kan vara en annan kmbinatin). 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 authr har vi: authr firstname lastname initial Vi kan ckså ha flera författare. För en bk eller artikel kan det vara en eller flera författare, så för att ange det kan vi använda +-peratrn på authr, dvs authr+. Men m referensen avser en webbsida för ett företag eller annan rganisatin, så finns det kanske ingen persn sm är författare. Vi har då endast en publisher, men ingen authr, så authr ska ckså kunna uteslutas. Vi ska alltså istället ha en *-peratr, för att ange att authr kan upprepas nll eller flera gånger, dvs authr*. Elementen isbn ch nr_f_pages har bara någt innehåll m det är publicerad litteratur på papper, men för en webbsida finns de inte. Detsamma gäller link, sm endast finns m källan för referensen finns på webben. Så alla dessa tre element kan uteslutas ch ska ha?-peratrn. I övrigt behåller vi strukturen sm tidigare, så vi har nu: reference+ type (bk article electrnic ther) title (text) authr* firstname (text) lastname (text) initial (text) publicatin_year (integer) publisher (text) isbn? (integer) nr_f_pages? (integer) link? (url) 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 4
Annat innehåll Vi har nu en uppsättning referenser, men m vi tittar på webbsidan med litteraturlistan, så finns det även annan infrmatin. Det kan ckså finnas en kmmentar med valfri text. Vi behöver ckså kunna ange för vilken kurs sm listan gäller ch då behöver vi kanske både kurskd ch kurstitel. Så vi får: curse cde (text) title (text) reference+... cmment? (text) På webbsidan har vi ckså en uppdelning i bligatrisk litteratur (mandatry) ch bredvidläsningslitteratur (supplementary). Om referenserna för dessa hade lika frm, så hade det varit naturligt att dela upp det sm: mandatry mandatry_reference+... supplementary supplementary_reference+... Men nu skrivs referenserna likadant, avsett m det är bligatrisk litteratur eller ej. Så det är bättre att införa ytterligare ett underelement till reference, sm anger m det är bligatrisk litteratur eller ej, på samma sätt sm vi anger typen. Detta element kan ha värdena yes eller n. Vi antar ckså att det kan uteslutas (ch tlkar det då sm n), så vi använder?-peratrn på det. reference+ mandatry? (yes n)... Rtelement När vi skriver det sm XML-kd, måste vi ckså ha ett rtelement sm mger allting. Vi kan kalla rtelementet curse_litterature. Vi har nu följande struktur: curse_literature curse cde (text) title (text) reference+ type (bk article electrnic ther) mandatry? (yes n) title (text) authr* firstname (text) lastname (text) initial (text) publicatin_year (integer) publisher (text) isbn? (integer) nr_f_pages? (integer) link? (url) cmment? (text) 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 5
5. Attribut Hittills har vi behandlat allt sm element sm har antingen ett innehåll eller flera underelement. T.ex. kan curse skrivas sm: <curse> <cde>1me101</cde> <title>webbdesign</title> </curse> Men allt behöver inte vara underelement, utan en del av det kan vara attribut. Så curse skulle ckså kunna skrivas sm: eller <curse cde="1me101">webbdesign</curse> <curse cde="1me101" title="webbdesign" /> Det går alltså skriva det på flera lika sätt. Så vi behöver nu bestämma vad sm ska skrivas sm element (taggar) ch vad sm ska vara attribut. En del rekmmenderar att man inte alls ska använda attribut, men det kan skapa nödigt krångliga strukturer med mycket kd. Så attribut är bra för att ge extra infrmatin m taggarna. Då man inför någn ny infrmatinsdetalj bör det vara en tagg. Taggens namn beskriver innehållet. Men då man ger ytterligare infrmatin m detta element (s.k. metainfrmatin infrmatin m infrmatinen), så kan det vara lämpligt att ha det sm ett attribut. Ett exempel på detta är m man ska ange vikt för någt. Då är siffervärdet för vikten infrmatinsinnehåll i en tagg, t.ex. <weight>73</weight> Enheten för vikten kan anges sm ett attribut, t.ex. <weight unit="kg">73</weight> Detta blir ett krtare skrivsätt än t.ex. <weight> <value>73</value> <unit>kg</unit> <weight> Naturligtvis skulle man ckså kunna ha <weight>73 kg</weight> Men m man har vikter i lika enheter, så kan det bli svårt att göra srteringar baserat på enhet eller vikt. Så det är bättre att separera värde ch enhet i två lika taggar eller attribut. Attribut i litteraturlistan I strukturen i litteraturlistan kan vi se type ch mandatry under reference sm beskrivning av elementet. Värdet för dessa skrivs antagligen inte ut i någn presentatin, utan används istället för srtering eller urval. Dessa är därför lämpliga att ha sm attribut. Taggen för reference ska alltså vara: <reference type="..." mandatry="...">...</reference> För authr har vi ett underelement kallat initial, men det ska vara förnamnets initialer, så det är naturligare att ha det sm attribut i taggen firstname: <firstname initial="...">...</firstname> I elementet link ska vi ange en url ch det kan vara lämpligt att ha sm attribut. Då har vi inget annat innehåll, så link blir ett s.k. tmt element, dvs utan sluttagg ch avslutas då med snedstreck: <link url="..." /> 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 6
Slutlig struktur Vi har nu följande struktur: curse_literature curse cde (text) title (text) reference+ attribut: type (bk article electrnic ther) attribut. mandatry? (yes n) title (text) authr* firstname (text) attribut: initial (text) lastname (text) publicatin_year (integer) publisher (text) isbn? (integer) nr_f_pages? (integer) link? attribut: url (text) cmment? (text) 6. DTD-kd Nu när strukturen är klar, så är i princip DTD-kden klar. Det är bara att skriva m listan med strukturen till kd för DTD:n. För element använder vi <!ELEMENT...> ch för attributen <!ATTLIST...>. Till att börja med skriver vi DTD-kden i en DOCTYPE-tagg i XML-dkumentet, så blir det enklare då vi ska validera XML-kden. Har vi både DTD- ch XML-kd i samma dkument, så är det endast ett dkument sm ska skickas upp till validatrn. Sedan flyttar vi över DTD-kden till en separat fil, så att samma DTD kan användas av flera XML-dkument. Skapa ett nytt XML- dkument Skapa ett nytt XML-dkument i din editr ch spara det med lämpligt namn, t.ex. "literature1me101.xml". Skriv in följande kd i dkumentet: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ Därmed har du först talat m att det är ett XML-dkument. Sedan har du påbörjat DTD:n i DOCTYPE-taggen ch angett att rtelementet är curse_literature. DTD-kden ska sedan skrivas på raderna mellan hakparenteserna. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 7
DOCTYPE med DTD- kd Påbörja DTD:n genm att lägga in en ELEMENT-tagg för rtelementet: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> Denna ELEMENT-tagg definierar curse_literature ch anger att den har underelementet curse, reference ch cmment i den rdningen. Dessutm används + på reference, för att ange att reference kan upprepas en eller flera gånger. På cmment används? för att ange att elementet kan uteslutas. Lägg sedan till kd för elementet curse: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> Elementet curse består av cde ch title. Dessa element definieras ckså med varsin ELEMENT-tagg. Deras innehåll är text ch det definieras sm #PCDATA (parsed character data). Parsed betyder att innehållet ska tlkas av webbläsaren, ifall det i texten skulle förekmma några "entiteter" (t.ex. â) sm ska översättas till andra tecken. Frtsätt sedan med elementet reference: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT reference (title, authr*, publicatin_year, publisher, isbn?, nr_f_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: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT reference (title, authr*, publicatin_year, publisher, isbn?, nr_f_pages?, link?)> <!ATTLIST reference type (bk article electrnic ther) #REQUIRED mandatry (yes n) #IMPLIED> Attributen definieras med ATTLIST. Först anges namnet på elementet (reference i detta fall) ch därefter definitinerna av attributen. Det finns två attribut. Det första är type ch de värden sm får förekmma anges inm parentes ch åtskiljs med ett ldrätt streck. Därefter står det #REQUIRED för att markera att detta attribut måste finnas med. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 8
Det andra attributet är mandatry ch det kan ha värdena yes eller n. Detta attribut är valfritt (trts sitt namn :-) ch det markeras med #IMPLIED. Det första elementet i reference är title sm består av text. Så för detta skulle vi ange <!ELEMENT title (#PCDATA)>, men title finns redan definierat då vi la in kden för curse. Så vi behöver inte (ch får inte) lägga in det en gång till. Den definitin sm redan är inlagd används även här. Lägg nu till kd för elementet authr: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT reference (title, authr*, publicatin_year, publisher, isbn?, nr_f_pages?, link?)> <!ATTLIST reference type (bk article electrnic ther) #REQUIRED mandatry (yes n) #IMPLIED> <!ELEMENT authr (firstname, lastname)> <!ELEMENT firstname (#PCDATA)> <!ATTLIST firstname initial CDATA #REQUIRED> <!ELEMENT lastname (#PCDATA)> Elementet authr består av firstname ch lastname. Både firstname ch lastname består av text, vilket anges sm #PCDATA. Elementet firstname har dessutm attributet initial. Det består av text ch markeras med CDATA. Observera att det är utan #-tecken. Det är heller inte P för parsed, eftersm attributets värde inte ska tlkas. Det kan inte innehålla entiteter. Nu frtsätter vi med kd för publicatin_year, publisher, isbn ch nr_f_pages: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT reference (title, authr*, publicatin_year, publisher, isbn?, nr_f_pages?, link?)> <!ATTLIST reference type (bk article electrnic ther) #REQUIRED mandatry (yes n) #IMPLIED> <!ELEMENT authr (firstname, lastname)> <!ELEMENT firstname (#PCDATA)> <!ATTLIST firstname initial CDATA #REQUIRED> <!ELEMENT lastname (#PCDATA)> <!ELEMENT publicatin_year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ELEMENT isbn (#PCDATA)> <!ELEMENT nr_f_pages (#PCDATA)> 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 siffrr. Det går dck inte definiera i DTD, så vi får nöja ss med att ange att innehållet ska vara vilka tecken sm helst. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 9
Lägg sedan till kd för link: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT reference (title, authr*, publicatin_year, publisher, isbn?, nr_f_pages?, link?)> <!ATTLIST reference type (bk article electrnic ther) #REQUIRED mandatry (yes n) #IMPLIED> <!ELEMENT authr (firstname, lastname)> <!ELEMENT firstname (#PCDATA)> <!ATTLIST firstname initial CDATA #REQUIRED> <!ELEMENT lastname (#PCDATA)> <!ELEMENT publicatin_year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ELEMENT isbn (#PCDATA)> <!ELEMENT nr_f_pages (#PCDATA)> <!ELEMENT link EMPTY> <!ATTLIST link url CDATA #REQUIRED> Elementet link ska skrivs sm <link url="..." />, dvs utan sluttagg. Så det är ett s.k. tmt element, vilket anges med EMPTY. Elementet har attributet url sm består av CDATA ch måste finnas med (REQUIRED). Slutligen lägger vi till kd för elementet cmment: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [ <!ELEMENT curse_literature (curse, reference+, cmment?)> <!ELEMENT curse (cde, title)> <!ELEMENT cde (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT reference (title, authr*, publicatin_year, publisher, isbn?, nr_f_pages?, link?)> <!ATTLIST reference type (bk article electrnic ther) #REQUIRED mandatry (yes n) #IMPLIED> <!ELEMENT authr (firstname, lastname)> <!ELEMENT firstname (#PCDATA)> <!ATTLIST firstname initial CDATA #REQUIRED> <!ELEMENT lastname (#PCDATA)> <!ELEMENT publicatin_year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ELEMENT isbn (#PCDATA)> <!ELEMENT nr_f_pages (#PCDATA)> <!ELEMENT link EMPTY> <!ATTLIST link url CDATA #REQUIRED> <!ELEMENT cmment (#PCDATA)> Detta element består av text. Därmed är DTD-kden klar ch alla element ch attribut är definierade. I detta fall är den skriven i samma rdning sm den struktur sm tidigare tgs fram. Taggarna är ckså inskjutna på samma sätt. Det är dck inte nödvändigt att göra på detta sätt, utan taggarna kan skrivas hur sm helst ch i valfri rdning. Men det blir lättare att se strukturen, m DTD:n skrivs på detta sätt. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 10
7. XML-kd Nu ska vi skriva XML-kden för en litteraturlista. Det görs under DTD:n i samma dkument. Rtelementet Börja med att skriva in rtelementet: <?xml versin="1.0" encding="utf-8"?> <!DOCTYPE curse_literature [... <curse_literature> </curse_literature> Kd för kurs Därefter lägger du till kd för kursen: <curse_literature> <curse> <cde>1me101</cde> <title>webbdesign</title> </curse> </curse_literature> Kd för en referens Skriv nu in kd för den första referensen: <curse_literature> <curse> <cde>1me101</cde> <title>webbdesign</title> </curse> <reference type="bk" mandatry="yes"> <title>basics f Web Design</title> <authr> <firstname initial="t.">terry</firstname> <lastname>felke-mrris</lastname> </authr> <publicatin_year>2012</publicatin_year> <publisher>addisn-wesley Educatinal Publishers</publisher> <isbn>9780137003389</isbn> <nr_f_pages>352</nr_f_pages> </reference> </curse_literature> 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 11
Fler referenser Skriv in ett par referenser till för att prva, t.ex. för Garretts bk ch bken av Lynch & Hrtn, sm ckså har en länk. <reference type="bk" mandatry="yes"> <title>the Elements f User Experience, Secnd editin</title> <authr> <firstname initial="j.j.">jessy James</firstname> <lastname>garrett</lastname> </authr> <publicatin_year>2011</publicatin_year> <publisher>new Riders</publisher> <isbn>9780321683687</isbn> <nr_f_pages>192</nr_f_pages> </reference> <reference type="bk" mandatry="n"> <title>web Style Guide, 3rd ed.</title> <authr> <firstname initial="p.">patrick</firstname> <lastname>lynch</lastname> </authr> <authr> <firstname initial="s.">sarah</firstname> <lastname>hrtn</lastname> </authr> <publicatin_year>2008</publicatin_year> <publisher>yale University Press</publisher> <isbn>9780300137378</isbn> <nr_f_pages>338</nr_f_pages> <link url="http://www.webstyleguide.cm/" /> </reference> 8. Validering av XML-kden Du ska nu kntrllera att din XML-kd är krrekt skriven. Första kntrllen är att se m de grundläggande reglerna följs. Det kntrllerar du i webbläsaren, på samma sätt sm i övning 1. Den andra kntrllen är att se m kden följer den definitin sm görs i DTD-kden. Det görs i en validatr. Kntrllera grundreglerna Öppna din XML-fil i webbläsaren. Om allting är OK, så ska du se kden. Om du får någt felmeddelande, så rättar du felet ch laddar sedan m filen i webbläsaren. När allting är OK ch kden visas, går du vidare till validatrn. Kntrllera kden i en validatr Öppna validatrn på följande url i webbläsaren: http://www.validme.rg/xml/validate/ Klicka på knappen Brwse (Bläddra) ch peka ut din XML-fil. Klicka sedan på knappen Validate. Validatrn kntrllerar då filen ch efter ett tag bör du få en grön ruta med ett meddelande sm säger "The Dcument is Valid". Får du en röd ruta ch felmeddelanden, så får du kntrllera felen ch rätta dem. Då man vet att man har en krrekt DTD, så är det i XML-kden felen finns ch ska rättas. Men i dessa övningar har du nu skrivit både DTD- ch XML-kden ch kan ha skrivit fel någnstans. Så kntrllera båda kderna ch jämför med det sm skrivits i dessa övningar. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 12
Experimentera med fel i kden Ändra någt i din XML-kd, så att den inte stämmer överens med DTD:n. Prva att validera igen, för att se hur felmeddelandena ser ut. 9. DTD-dkument När du nu fått fram en krrekt DTD-kd, ska du flytta ut den från XML-dkumentet till ett separat dkument. Då kan flera XML-dkument utnyttja samma DTD ch validera mt den. När man sedan tar fram nya XML-dkument sm beskriver litteraturlistr, så validerar man XML-dkumentet mt DTD:n, för att kntrllera att man skrivit XML-kden krrekt. Skapa ett DTD- dkument Öppna din editr ch skapa ett nytt tmt dkument. Spara det med namnet literature.dtd i samma mapp sm du har din XML-fil. Öppna XML-filen (m du inte redan har den öppen) ch kpiera DTD-kden, dvs alla ELEMENT- ch ATTLIST-taggar sm står mellan hakparenteserna i DOCTYPE-taggen. Klistra in kden i dkumentet literature.dtd ch spara filen. I XML-filen ändrar du DOCTYPE-taggen till följande: <!DOCTYPE curse_literature SYSTEM "literature.dtd"> Hakparenteserna ch all DTD-kd tas alltså brt. Denna tagg anger nu att rtelementet i XML-kden heter curse_literature, att det är en extern DTD-fil (SYSTEM) samt url till filen. Om DTD-filen ligger i samma mapp sm XML-filen, räcker det att ange filnamnet. Men skapar man sedan flera litteraturlistr för andra kurser, så kanske de ligger på andra ställen ch till ch 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: <?xml versin="1.0" encding="utf-8" standalne="n"?> Detta anger att dkumentet inte "står på egna ben", utan är berende av ett separat dkument med DTD-kden. Publicera ch validera Publicera mappen med dina filer (både XML- ch DTD-filen) i ditt webbutrymme på servern. Det måste vara i den öppna delen, m validatrn ska kunna hitta filerna. Så du kan inte lägga dem i den lösenrdskyddade mappen. (I kursens uppgift validerar du dck först filerna medan de finns på din datr ch publicerar dem sedan i den lösenrdskyddade mappen.) Prva sedan att validera din publicerade XML-fil. Skriv in url:en till XML-filen (kntrllera nga att den börjar med http ch inte https) ch klicka på knappen Validate. Eftersm det är samma XML- ch DTD-kd sm tidigare, bör du inte få några fel. Slut Genm dessa övningar har du sett att XML-kden kan skrivas på många lika sätt. Det finns inga bestämda regler för vad sm ska vara med i infrmatinen eller vad sm ska vara taggar eller attribut. De regler sm finns för XML är istället regler för på vilken frm man skriver kden (grundreglerna sm gavs i inledningen). Vad sm ska vara taggar eller attribut är mer än smaksak. Man bör dck vara knsekvent, så att liknande typ av infrmatin skrivs på samma sätt. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 13
Facit för övning 1 De fem felen är: rad 5: Sluttaggen är felstavad rad 18: Starttaggen skrivs med gemener ch sluttaggen med en inledande versal. Det måste vara lika i båda taggarna. rad 23: Attributvärdet måste skrivas inm citatinstecken, "cmedy". rad 25: / saknas i sluttaggen för year. Detta fel är lite svårare att hitta, eftersm webbläsaren upptäcker felet först då den kmmer fram till sluttaggen för mvie på rad 30. Anledningen till att webbläsaren ej ger felmeddelande på rad 25 är att kden är syntaktiskt krrekt. 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 kmmer fram till sluttaggen för mvie, så ska den matcha den mt starttaggen för mvie sm ligger före year-taggarna. Därför vill den första avsluta year-taggarna ch säger att den förväntade sig en sluttagg för year. rad 39: Sluttaggen för rtelementet, dvs mvielist, saknas. 2013-10-20 Rune Körnefrs (rune.krnefrs@lnu.se) 14