LEKTION 6 En snabb titt på XML Bokstaven x i Ajax står för XML, ett mycket användbart beskrivningsspråk som gör det möjligt för Ajax-tillämpningar att hantera komplex strukturerad information. I den här lektionen går vi igenom grunderna i att skapa och använda XML-dokument. XML Den som har jobbat med HTML har redan fått en känsla för hur XMLkod ser ut och fungerar. XML (extensible Markup Language) påminner mycket om HTML. Men medan HTML bara beskriver hur webbsidor ska se ut har XML ett mycket större användningsområde. XML-dokument kan användas för alla typer av datalagring och utbyte av data, och kan till och med överta funktioner som traditionellt har utförts av databasprogram. Varför behöver jag veta detta? Ett av många användningsområden för XML är att överföra strukturerad information mellan program. I Ajax kan man använda XML för att returnera information från servern till Ajax-tillämpningen, där informationen tolkas och används. Vad går lektionen (inte) igenom I likhet med de andra lektionerna i detta avsnitt kommer vi inte att gå igenom XML i detalj. Istället går vi igenom grunderna och riktar in oss på de delar av språket som är relevant för oss som Ajax-utvecklare.
62 Lektion 6 Tips Om du vill veta mer om XML kan du läsa Sams Teach Yourself XML in 10 Minutes av Andrew H. Watt. Grunderna i XML XML är ett beskrivningsspråk som gör det möjligt att hantera data på ett organiserat och hierarkiskt sätt. Det påminner om HTML men medan HTML har ett fördefinierat och begränsat antal element, och främst är avsett att definiera hur ett dokument ska visas, kan unika XML-element skapas för att bäst spegla den information som dokumentet ska lagra. Elementen (vanligtvis kallade märken) omges av < och > används för att strukturera och beskriva innehållet i en textfil. Obs Att XML och HTML påminner om varandra är inte en slump. Båda är baserade på SGML (Standard Generalized Markup Language), som är ett system för att hantera dokumentelement. SGML utvecklades och standardiserades av organisationen International Organization for Standards (ISO). Till skillnad från HTML, som har fördefinierade märken, kan XMLmärken utformas efter egna önskemål och kan på så vis beskriva praktiskt taget vilken information som helst. Betrakta följande XML-dokument: <race> <yacht raceno= 74 > <name>wanderer</name> <skipper>walter Jeffries</skipper> <helm>sally Jacobs</helm> </yacht> <yacht raceno= 22 > <name>free Spirit</name>
En snabb titt på XML 63 <skipper>jennifer Scully</skipper> <helm>paul Thomas</helm> </yacht> <race> Detta korta XML-dokument beskriver en båttävling med de två deltagande båtarna och besättning. Lägg märke till att namnen på märkena beskriver den information de innehåller, och hur märkena är hierarkiskt ordnade. Observera även att XML-märken kan vara försedda med attribut. Resultatet blir att XML-filer är ganska begripliga, det vill säga att informationen är enkel att läsa för en människa. Varning XML skiljer på stora och små bokstäver, så <yacht> och <Yacht> tolkas som två olika element. Tips XML använder samma syntax som HTML för att visa kommentarer. All information mellan <! och > kommer att ignoreras. <!-- Detta är en kommentar --> Uppbyggnaden av XML-dokument Det finns bara ett märke som är obligatoriskt i ett XML-dokument, och det är dokumentelementet. I tidigare nämnda båttävling fungerar märket <race> som dokumentelement. Obs Dokumentelementet behöver inte innehålla andra element. Följande är ett helt giltigt XMLdokument: <competition>farlington Summer Cup</competition>
64 Lektion 6 Dokumenthuvud Extra information kan infogas före dokumentelementet, och utgör i så fall dokumentets inledning. Ett exempel är XML-deklarationen: <?xml version= 1.0?> Varning Om du gör en sådan deklaration måste den ligga först i dokumentet. Du får inte ens ha ett mellanslag före. Inledningen kan innehålla kommentarer och instruktioner, liksom en dokumenttypsdeklaration. Dokumenttypsdeklaration Dokumenttypsdeklarationen, som är frivillig, (ofta kallad DOCTYPEdeklaration) är en beskrivning av den tillåtna strukturen för ett XMLdokument. Den innehåller (eller refererar till filer som innehåller) information om elementnamn och vilken inbördes relation de olika elementen har. Varning Dokumenttypsdeklarationen (DOCTYPE) är inte samma sak som Dokumenttypsdefinition (DTD). DTD består av den information som finns i DOCTYPEdeklarationen och information som finns i de externa filer som DOCTYPE-deklarationen eventuellt refererar till. Vi ska kika på dokumenttypsdeklarationen för vår båttävling: <!DOCTYPE race SYSTEM race.dtd> Den här deklarationen, som placeras före <race>-elementet, talar om att dokumentelementet heter <race> och att dokumenttypsdefinitionen finns i den externa filen race.dtd, som skulle kunna innehålla följande:
En snabb titt på XML 65 <!ELEMENT race (yacht+) > <!ELEMENT yacht (name, skipper, helm) > <!ATTLIST yacht raceno #CDATA #REQUIRED > <!ELEMENT name (#PCDATA) > <!ELEMENT skipper (#PCDATA) > <!ELEMENT helm (#PCDATA) > Ett alternativ är att inkludera informationen direkt i DOCTYPE-deklarationen, placerad mellan [ och ]. <!DOCTYPE race [ <!ELEMENT race (yacht+) > <!ATTLIST yacht raceno #CDATA #REQUIRED > <!ELEMENT yacht (name, skipper, helm) > <!ELEMENT name (#PCDATA) > <!ELEMENT skipper (#PCDATA) > <!ELEMENT helm (#PCDATA) > ]> Oavsett vilket alternativ vi väljer definierar vi fyra element, nämligen race, yacht, skipper och help, och en attributförteckning. Tips DOCTYPE-deklarationer kan bestå av både interna och externa referenser, även kallade interna och externa delmängder av DTD:n. Elementdeklarationer Raden <!ELEMENT race (yacht+) > säger att <race>-elementet ska innehålla element av typen <yacht>, och +- tecknet anger att det kan finnas en eller flera förekomster av dessa <yacht>-element. Tecknet * betyder valfritt antal förekomster inklusive noll, och? anger noll eller en förekomst. Om inget av ovan nämnda tecken används betyder det att exakt ett <yacht>-element är tillåtet i <race>.
66 Lektion 6 <yacht>-elementet deklareras att innehålla ytterligare tre elementtyper, <name>, <skipper> och <helm>. #PCDATA betyder att dessa element bara får innehålla teckenbaserad data och inga andra element. Andra typer är MIXED (text och element) och ANY (allt giltigt innehåll). Deklaration av attributförteckning Vårt exempel innehåller raden <!ATTLIST yacht raceno #CDATA #REQUIRED > Sådana deklarationer används för att ange vilka attribut som är tillåtna eller obligatoriska för specificerat element. I vårt exempel anger vi att <yacht> har ett attribut kallat raceno, vars värde består av #CDATA (character data). Begreppet #REQUIRED betyder att <yacht>-elementet måste vara försett med ett sådant attribut. Andra alternativ är #IMPLIED, som anger att attributet är valfritt; #DEFAULT (följt av ett värde inom citattecken), anger ett fördefinierat värde om ett sådant inte har deklarerats i XML-dokumentet; #FIXED (följt av ett värde inom citattecken), som bestämmer värdet på det aktuella attributet. Giltig XML-kod Om ett XML-dokument innehåller en DOCTYPE-deklaration, och följer deklarationen till punkt och pricka, säger man att det är ett giltigt XMLdokument. JavaScript och XML De flesta moderna webbläsare innehåller de verktyg som behövs för att hantera XML-dokument. XML-dokumentet måste lagras i ett JavaScript-objekt. Det finns olika sätt att skapa ett sådant objekt, beroende på om du använder Microsofts Internet Explorer, eller en webbläsare av någon annan tillverkare, exempelvis Firefox.
En snabb titt på XML 67 Firefox, och webbläsare från andra tillverkare än Microsoft, använder följande kod för att skapa ett JavaScript XML-objekt: <script type= text/javascript > var myxmldoc = document.implementation.createdocument(,,null); myxmldoc.load( exampledoc.xml ); Programsatser </script> För Internet Explorer använder du: <script type= text/javascript > var myxmldoc=new ActiveXObject( Microsoft.XMLDOM ) myxmldoc.async= false myxmldoc.load( exampledoc.xml ) Programsatser </script> När du har ett objekt som innehåller XML-dokumentet kan du använda objektets metoder och egenskaper för att komma åt dokumentets innehåll. Den hierarkiska datastrukturen i XML-dokumentet motsvaras av JavaScripts objekthierarki, eller DOM (Document Object Model). Document Object Model (DOM) Vi ska kika på några av de metoder och egenskaper som kan användas för att läsa och bearbeta informationen, det kallas Walking The DOM. Noder Antag att vårt JavaScript-objekt myxmldoc innehåller XML-informationen om båttävlingen. Dokumentelementet, <race>, innehåller två element av typen <yacht>; vilket beskrivs som att det har två barn. Du kan ta reda på hur många barn ett element har genom att använda objektegenskapen childnodes.length. Dokumentelementet <race> befinner
68 Lektion 6 sig överst i hierarkin, och därför kan vi referera till det genom variabeln myxmldoc: var noyachts = myxmldoc.childnodes.length; Vi kan hämta information från enskilda (barn)noder genom att ange nodens nummer inom parenteser: myxmldoc.childnode(0) Ovanstående kod refererar till det första <yacht>-elementet i dokumentet. Varning Lägg märke till att det första elementet är nummer noll, andra elementet är nummer ett och så vidare. Vi kan kontrollera om element har några (barn)noder genom att använda oss av metoden haschildnodes(). myxmldoc.childnodes(1).haschildnodes() Koden ovan returnerar sant eftersom den andra båten i dokumentet har tre barn (med namnen name, skipper och helm). Men, myxmldoc.childnodes(1).childnodes(0).haschildnodes() returnerar falskt eftersom elementet <name> inuti <yacht> saknar barn. Namn på märken Egenskapen tagname innehåller elementets namn. myxmldoc.childnodes(0).childnodes(1).tagname Ovanstående kod returnerar skipper. Elementattribut Metoden getattribute( AttributeName ) kan du använda för att hämta alla attribut för angivet element:
En snabb titt på XML 69 myxmldoc.childnodes(0).getattribute( raceno ) Detta anrop returnerar 74. Innehållet i märken Egenskapen text används för att hämta innehållet för angivet element. Raden myxmldoc.childnodes(0).childnodes(1).text returnerar Walter Jeffries. Vi kommer att lära oss mer om dessa och andra metoder i Lektion 14, Returnera data i XML-format. Sammanfattning Den här lektionen har vi ägnat åt grunderna i XML, däribland dokumentstrukturer och dokumenttypsdeklarationer. Vi gick också översiktligt igenom hur man kan använda JavaScript för att hantera XMLdata. Denna kunskap är användbar när vi så småningom kommer att använda Ajax för att hämta XML-data från servern.