XML i filer

under arbeid...


Eksempel:

I en quiz applikasjon (Se side 188 i læreboken) tenker vi oss at vi har noen spørsmål med fasit:

1 Hvem er statsminister i Norge? Stoltenberg

2 Hvem er president i USA? Obama

3 Hvem var den første presidenten i USA? Washington

osv.

Hvis vi først har laget en slik quiz er det dumt at vi må skrive om hele applikasjonen hvis vi senere skulle lage en annen quiz med andre spørsmål.

Løsningen er å legge alle spørsmål og svar (og eventuelt illustrasjoner) i en egen tekstfil og bare skifte ut filen hvis vi ønsker andre spørsmål.

Applikasjonen må da kunne lese filen og hente inn informasjonen.

Tekstfilen kunne sett slik ut: (kommaseparert fil)

1, Hvem er statsminister i Norge?, Stoltenberg, stoltenberg.jpg
2, Hvem er president i Usa?, Obama, obama.jpg
... osv, osv,

Problemet her er at vi må skrive mye kode for å lete opp kommaene i hver linje og plukke ut tekststrengene vi trenger.
(Mye bruk av String-metodene .indexOf() og .substring() ...)

Moderne programmeringsspråk har som regel muligheter til å gjøre dette lettere ved hjelp av standarden XML, hvor vi kan legge data i en hierarkisk struktur på denne måten:

Vi lager en tekstfil quiz.xml som angir denne strukturen i XML-format i Notepad på denne måten:
(Bruk utf-8 som koding i Lagre som - dialogen i Notepad.)

<?xml version="1.0" encoding="utf-8"?>
<Quiz>
   <sporsmal>
      <tekst>Hvem er statsminister i Norge?</tekst>
      <fasit>Stoltenberg</fasit>
      <bilde>stoltenberg.jpg</bilde>
   </sporsmal>
   <sporsmal>
      <tekst>Hvem er president i USA?</tekst>
      <fasit>Obama</fasit>
      <bilde>obama.jpg</bilde>
   </sporsmal>
   <sporsmal>
      <tekst>Hvem var første president i USA?</tekst>
      <fasit>Washington</fasit>
      <bilde>washington.jpg</bilde>
   </sporsmal>
</Quiz>

Det ser litt tungvindt ut men går greit med litt kopiering og klipping og liming.

Fordelen at dette er et standardisert format og kan leses av alle programmer som skjønner XML.

Så skal vi behandle denne filen i programmet vårt.

 

Eksempel på kode som henter inn filen og hvordan vi får tak i innholdet i ActionScript:

// Vi bruker klassene URLRequest, URLLoader og XML til å laste
// filen og gjøre innholdet tilgjengelig for oss:
var xmlURL: URLRequest = new URLRequest("quiz.xml");	// URL: Adresse på Internett/disk
var xmlLoader: URLLoader = new URLLoader(xmlURL);	// Loader laster og holder orden for oss
var quizdata: XML;		// Vår variabel med all informasjon fra filen quiz.xml
				// Datatypen er klassen XML som kan gjøre mye for oss!
// Vi henger på en lytter på loader som kjøres når den er ferdig med å lese filen:
xmlLoader.addEventListener(Event.COMPLETE, xmlLastet);	// Henger på vår lytter
// Vår lytterfunksjon som legger innholdet i filen i vår XML variabel
function xmlLastet(evt: Event) {	
   quizdata=XML(evt.target.data); 	// Vi lagrer XML objektet i vår variabel
}//xmlLastet()
...

Senere i programmet kan vi få tak i det vi vil, koden viser som eksempel hvordan jeg kan liste opp all informasjon:

var i: int = 0;
for (var i:int = 0; i < quizdata.sporsmal.length(); i++) {
   trace(quizdata.sporsmal[i].tekst);
   trace(quizdata.sporsmal[i].fasit);
   trace(quizdata.sporsmal[i].bilde);
}//for

Legg merke til hvordan jeg kan behandle egenskapen sporsmal i quizdata-objektet som en tabell!

Hver tabell-element er dessuten et nytt objekt med egenskapene tekst, fasit og bilde!

I quiz-eksemplet på side 188 og utover i læreboken er informasjone lagt direkte i koden,
nå kan vi gjøre noen forandringer, se side 190 der man setter fasit-tekst og tekst-feltet
til riktig spørsmål i det første nøkkelbildet (keyframe):

(Forutsetter her at jeg oppdaterer en variabel nr hver gang brukeren trykker for å gå til neste spørsmål.)

Bokens kode: Våre endringer for å bruke informasjon fra xml-filen:
var fasit = "Brasil"; var fasit = quizdata.sporsmal[nr].fasit;
txtSpørsmål.text = "Hvilket land?"; txtSpørsmal.text = quizdata.sporsmal[nr].tekst;

Tilsvarende kan gjøres i de andre nøkkelbildene.

På side 195 viser de hvordan man kan laste bilder fra fil ved å legge en UILoader komponent med
navn bildeviser i et nøkkelbilde. Istedenfor å legge inn og låse bildenavnene i koden, kan vi nå
hente navnet fra quizdata og bare fortelle bildeviser hvilken bildefil den skal hente inn:

Bokens kode: Vår endring for å bruke navn fra xml-filen:
bildeviser.source = "bilde1.jpg"; bildeviser.source = quizdata.sporsmal[nr].bilde;

Egentlig trenger vi bar et nøkkelbilde i en slik quiz-applikasjon, vi bare lager en variabel,
sporsmalsnummer, som vi ajourfører etterhvert som bruker klikker seg fremover,
og bruker nr som indeks til å hente og skifte ut spørsmål, fasitsvar
og bilder i de komponentene vi har lagt i nøkkelbildet!