Göm menyn

TDP007 Konstruktion av datorspråk

Seminarie 2: Strukturerad text, reguljära uttryck och XML

Syftet med det andra seminariet är att titta på olika sätt att hantera strukturerad text. I första delen behandlar vi informationen i en vanlig textfil med reguljära uttryck, och i andra delen läser vi in information som lagrats med ett uppmärkningsspråk. Båda dessa tekniker fokuserar i första hand på språk som inte är till för programkod utan för information.

Vad ska man tänka på?

Denna omgång består av två lite större uppgifter. Precis som inför förra seminariet ska ni, förutom lösningar på uppgifter, lämna in enhetstester och utvecklarblogg. Eftersom uppgifterna är lite större får man välja en lämplig nivå för enhetstesterna. Kanske är det inte nödvändigt att testa alla funktioner.


Uppgift 1: Presentera rapporter från textfiler

I filen football.txt finns det data i tabellform från en säsong i engelska Premier League. Er uppgift är att skriva ett Ruby-program som kan presentera rapporter med följande information:

  • Ange vilket lag som haft minst skillnad i antal gjorda (F) och insläppta (A) mål.
  • Rangordna lagen med avseende på målskillnad, alltså skillnaden mellan (F) och (A).

Tanken är att ni ska utforma ert program så att det kan hantera även andra fotbollsresultattabeller som ser likadana ut, inte bara just den här exempelfilen.

När ni gjort detta ska ni gå vidare och hantera en annan fil weather.txt som innehåller väderdata under en månads tid för en ort. Er uppgift med väderdatat blir även här att presentera olika rapporter.

  • Vilken dag innebar minst skillnad mellan lägsta (MnT) och högsta (MxT) dyngstemperaturen?
  • Rangordna dagarna med avseende på skillnaden mellan lägsta och högsta dygnstemperatur.

När ni har löst båda dessa deluppgifter ska ni, som kommentar i programkoden eller i er utvecklarblogg, reflektera över hur mycket av koden från första delen som gick att återanvända inför andra delen av uppgiften.

Testa gärna reguljära uttryck på rubular.com.


Uppgift 2: Hantering av XML-baserad kontaktinformation

I den här uppgiften ska ni hantera olika typer av information som finns inbäddad i webbsidor. Det finns en uppsättning föreslagna standarder för att hantera sådan information som heter Microformats. Tanken är att om man följer dessa standarder blir det lätt att utveckla program som automatiskt kan söka genom webbsidor och sammanställa strukturerad information.

Som exempelfil kommer vi att använda events.html (eller events2.html) där det finns mötestider och kontaktinformation. Denna information är lätt läsbar för människor, men har också taggats enligt standarderna hCalendar och hCard. Titta i källkoden för webbsidan och leta efter DIV-taggar som har ett class-attribut vevent. Observera alltså att den yttre taggen är av typen div, inte span som det är i exeplet i länken ovan

Er uppgift är att skriva ett Ruby-program som kan läsa in en godtycklig webbsida (i XHTML) och skapa lämpliga Ruby-objekt som innehåller alla kalenderhändelser som finns på webbsidan. Ni får själva bestämma hur dessa Ruby-objekt som motsvarar händelserna ska se ut. För att man lätt ska kunna se vad som händer är det också lämpligt att programmet skriver ut innehållet i dessa inlästa objekt på något valfritt sätt.

Man skulle kunna använda sig av reguljära uttryck för att hitta händelserna i webbsidan, men eftersom den är skriven i XHTML är det bättre att använda en parser för att tolka sidan. En parser är ett verktyg som läser in hela sidan och tolkar XML-koden. Det finns två typer av parsrar. En SAX-parser bearbetar XML-koden sekvensiellt och man får själv tala om vad man vill ska hända när olika taggar påträffas. En DOM-parser bearbetar hela XML-koden i ett svep och returnerar ett objekt som representerar innehållet. Med hjälp av olika metoder kan man sedan få ut valfri information. En särskild teknik för att bearbeta DOM-objekt är XPath med vars hjälp man kan skriva ett slags mönster för att direkt plocka ut viss information (Se fö 3-4). Standarden för xpath är inte direkt lätt att läsa så jag kan tipsa om w3schools tutorial men standarden är ett bra exempel på hur bnf-grammatik används i praktiken så jag låter länken stå kvar.

Det finns åtminstone ett par lämpliga parsrar som ni kan använda: REXML-paketet (som följer med Ruby) eller nokogiri. Ni får använda vilken ni vill, och ni får använda SAX- eller DOM-metoden. Det är bara bra om ni väljer lite olika alternativ, för då får vi mer att diskutera på seminariet.

I den här uppgiften ingår också att sätta sig in i vad XML, SAX, DOM, XPath med flera tekniker innebär och hur man får in dem i Ruby. Det vi går igenom på föreläsningarna kanske inte kommer att räcka som introduktion. Det är därför viktigt att ni i er utvecklarblogg skriver ner vad ni har testat, vad ni har läst för material på nätet och gärna inkluderar små kodexempel som ni har gjort när ni har testat och försökt förstå. Använd utvecklarbloggen som ett sätt att tänka högt under arbetets gång.


Sidansvarig: Pontus Haglund
Senast uppdaterad: 2022-01-21