Avoin data - Pääteohjaus 7
Käytetään muiden tekemiä XML-dokumentteja ja WWW-sivuja tiedonlähteenä.
DOM-rajapinta on tuttu jo TIEA2120 WEb-käyttöliittymien ohjelmointi -kurssilta. Jos olet unohtanut niin kertaa Document Object Model (DOM) ja Javascript ja DOM. Tässä pääteohjauksessa opetellaan DOM-rajapinnan käyttäminen Python-ohjelmointikielellä.
Ulkoisen XML-datan sisällyttäminen omalle sivulle
- Aloita uusi python-ohjelma. Pyritään hakemaan ja parsimaan http://appro.mit.jyu.fi/tiea2080/ohjaus/ohjaus7/data.xml- tiedosto ja sisällyttämään siitä tärkeimmät osat omalle sivulle. Käsiteltävän tiedoston rakenne on sama kuin aiemmin käytetyissä json-versioissa. Katso malliohjelman tuloste (Mallin lähdekoodi).
- Haetaan XML-dokumentti käyttäen Pythonin xml.dom.minidom ja urllib-kirjastoja.
- Tee ensin pelkästään komentoriviltä toimiva versio.
from xml.dom.minidom import parse import urllib doc = parse( urllib.urlopen("tähän sivun osoite")) print doc.toxml('UTF-8')Kokeile tulostuuko komentoriviltä ajettaessa sivun sisältö - Kaivellaan dokumentista yksittäisiä osia. Haetaan ensimmäiseksi yleistietoja:
# Haetaan kilpailun tiedot eli ensimmäiset esiintymät nimi, kesto, alkuaika ja loppuaika elementeistä nimi = doc.getElementsByTagName("nimi")[0] kesto = doc.getElementsByTagName("kesto")[0] alkuaika = doc.getElementsByTagName("alkuaika")[0] loppuaika = doc.getElementsByTagName("loppuaika")[0] - Tulosta kaikkien hakemiesi elementtien tekstisisältö. Muista kokeilla komentorivillä, että ohjelma toimii.
textContent-ominaisuus ei toimi minidomissa joten joudut käyttämään:
nimi.firstChild.nodeValue
- Tee samaan tapaan listaus joukkueiden nimistä. Hae kaikki joukkueet-elementit, käy ne silmukassa läpi, hae jokaisen joukkueet-elementin alta ensimmäinen nimi-elementti ja tulosta sen sisältö.
- Mitäs jos haluat tulostaa joukkueiden nimet sarjoittain? Kokeile tehdä tämä ja tulosta aina ensin sarjan nimi ja sen alle sisennettynä kaikkien sarjaan kuuluvien joukkueiden nimet
- Tee nyt sovelluksestasi web-sovellus (CGI-ohjelma, Flask-sovellus tai web2py-sovellus) ja luo XML-tiedoston sisällöstä
järkevä html-dokumentti. Vrt. mallisovellus ((Mallin lähdekoodi)). Jos käytät web2py-ympäristöä niin urllib-kirjaston sijaan käytä fetch-funktiota:
from gluon.tools import fetch page = fetch('http://www.web2py.com')Voit luoda myös html-dokumenttisi ja sen sisällön DOM-rajapinnan avulla
- Voit halutessasi opetella käyttämään myös ElementTree XML API-rajapintaa. ElementTree-rajapinnan käyttäminen on hieman yksinkertaisempaa kuin DOM-rajapinnan. ElementTree-rajapintaa tarvitset jos joudut parsimaan rakenteeltaan rikkinäisiä html-dokumentteja (tagsoup...). Tällöin käytetään esimerkiksi BeautifulSoup-kirjastoa, joka toteuttaa ElementTree-rajapinnan.
XML ja nimiavaruudet
XML-dokumenttiin voi olla sisällytetty elementtejä useasta eri nimiavaruudesta (namespace). Tämä täytyy osata huomioida dokumentin sisältöä käsiteltäessä. Käytetystä kirjastosta riippuen voi joutua käyttämään getElementsByTagNameNS-funktiota tavallisen getElementsByTagName-funktion sijaan. Esim.
mi = doc.getElementsByTagNameNS("http://www.w3.org/1998/Math/MathML", "mi")
Käyttämällä nimiavaruuden osaavaa versiota varmistaa, että ei ainakaan saa vahingossa tulokseen vääriä elementtejä. Eri nimiavaruuksissa voi olla samannimisiä elementtejä.
Joskus XML-dokumenteissa on myös CDATA-osioita, joiden parsiminen täytyy joillakin kirjastoilla tehdä poikkeavasti:
if node.firstChild.nodeName == "#cdata-section":
print node.firstChild.data
else:
print node.firstChild.nodeValue
- Tee sovellus, joka tulostaa https://www.w3.org/TR/XHTMLplusMathMLplusSVG/sample.xhtml-dokumentista kaikkien h2-tason otsikoiden tekstit
- Tulosta myös kaikkien mathml-osioiden mi-elementtien sisältö
- Tulosta myös kaikkien svg-polygonien pisteet (points)

Käyttäjien kommentit