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.
Testa gärna reguljära uttryck på rubular.com.
Utvecklarbloggen:
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. Tänk tillbaka på regeln DRY från TDP001, vad i dessa uppgift gör det lätt/svårt att återanvända kod?
Uppgift 2: Hantering av XML-baserad kalenderinformation
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
dokumentationen.
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 strukturerad text. I det här fallet XML. 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.
Även om det finns olika XML-parsers att använda tillsammans med Ruby så rekommenderar vi REXML-paketet (som följer med Ruby). Detta är parsern som finns tillgänglig i samband med dugga och tentamen. Men det är fritt fram att hitta och använda en annan parser om man känner för det.
Uppgift 3: Design av XML-uppgift
Två tekniker är fokus i denna laboration för XML-uppgifter. Trädparsning (DOM-parsning) med XPath eller strömparsning (SAX-parsning). Ni löste föregående uppgift med antingen DOM eller SAX tekniken. Designa nu en XML-fil (filnamn.xml) som är designad för att på ett bra sätt testa studenters kunskaper om den tekniken ni inte använde i föregående uppgift.
XML-filen behöver inte vara särskilt stor, och det är strukturen i sig som är intressant. Kanske strukturen är utformad för att testa någon särskilt knepig aspekt av SAX-parsning, eller någon särskild konstruktion i XPath? Att generera data för uppgifter är faktiskt en omständighet där AI-assistenter kan vara bra att använda. Så använd gärna exempelvis gpt eller co-pilot för att generera XML-filen, men kom ihåg att berätta om och hur ni använt ai-assistenten i sammanhanget.
När du genererat XML-filen är det viktigt att du motiverar:
- Vad är syftet med filens utformning?
- Vad är det tänkt att studenten ska hämta ut för data?
- Vilken teknik är det tänkt att studenten ska använda (SAX/DOM)?
- Reflektera kort över varför just denna XML-fil är bra att öva på/testa kunskap.
- Skriv en tillhörande uppgiftsbeskrivning.
Sidansvarig: Pontus Haglund
Senast uppdaterad: 2025-01-22