Python – XML bestanden uitlezen
In dit voorbeeld laat ik zien hoe je met een Python script een XML bestand kan uitlezen.
XML ElementTree
Hieronder vind je een voorbeeld bestand, welke we gaan uitlezen, je kan een bestand aanmaken en deze inhoud kopiëren en plakken:
1 2 3 4 5 6 7 8 9 10 11 12 |
<project naam="Mijn project" eigenaar="DomoticX"> <subproject naam="Een subproject" info="Oud"> <tekst>Hallo wereld!</tekst> <datum>2014.01.01</datum> <admin bericht="Dit is het oude project!"/> </subproject> <subproject naam="Tweede subproject" info="Nieuw"> <tekst>Hallo maan!</tekst> <datum>2015.02.02</datum> <admin bericht="Dit is het nieuwe project!"/> </subproject> </project> |
Het PHP script (bijvoorbeeld test.py in dezelfde map) om de XML en de waarden uit te lezen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET xml = ET.parse("test.xml") project_naam = xml.getroot().attrib.get('naam') project_eigenaar = xml.getroot().attrib.get('eigenaar') subproject_naam01 = xml.find("subproject[1]").attrib.get('naam') subproject_info01 = xml.find("subproject[1]").attrib.get('info') subproject_tekst01 = xml.find("subproject[1]/tekst").text subproject_datum01 = xml.find("subproject[1]/datum").text subproject_admin01 = xml.find("subproject[1]/admin").attrib.get('bericht') subproject_naam02 = xml.find("subproject[2]").attrib.get('naam') subproject_info02 = xml.find("subproject[2]").attrib.get('info') subproject_tekst02 = xml.find("subproject[2]/tekst").text subproject_datum02 = xml.find("subproject[2]/datum").text subproject_admin02 = xml.find("subproject[2]/admin").attrib.get('bericht') print "" print project_naam, "door :", project_eigenaar print "" print "Subproject:", subproject_naam01, "(", subproject_info01, ")" print "Datum:", subproject_datum01 print "Tekst:", subproject_tekst01 print "Admin bericht:", subproject_admin01 print "" print "Subproject:", subproject_naam02, "(", subproject_info02, ")" print "Datum:", subproject_datum02 print "Tekst:", subproject_tekst02 print "Admin bericht:", subproject_admin02 |
Zodra je het bovenstaande script uitvoert, is dit het resultaat:
1 2 3 4 5 6 7 8 9 10 11 |
Mijn project door : DomoticX Subproject: Een subproject ( Oud ) Datum: 2014.01.01 Tekst: Hallo wereld! Admin bericht: Dit is het oude project! Subproject: Tweede subproject ( Nieuw ) Datum: 2015.02.02 Tekst: Hallo maan! Admin bericht: Dit is het nieuwe project! |
Een XML bestand doorlopen
Een voorbeeld hoe je bijvoorbeeld 100 waarden kan doorlopen in een XML bestand:
1 2 3 4 5 6 7 8 |
for x in xrange(1, 101): try: loggerid = xml.find("value[" + str(x) + "]").attrib.get('id') loggertype = xml.find("value[" + str(x) + "]").attrib.get('type') loggerwaarde = xml.find("value[" + str(x) + "]").text print loggerid, loggertype, loggerwaarde except: print "geen waarde" |
Praktijkvoorbeeld: weergegevens buienradar.nl
De weergegevens staan in het XML bestand:Â http://xml.buienradar.nl/
Temperatuur van een station ophalen
Met onderstaande code kan je de temperatuur ophalen van een weerstation station vanuit de XML data van Buienradar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# XML voorbeeld van het ophalen van de temperatuur van een weerstation vanuit de XML data van Buienradar (door S. Ebeltjes / domoticx.nl) # # Importeren van bibliotheken # Bibliotheek om data te ontvangen en te versturen via het HTTP protocol. import urllib2 # Bibliotheek om XML bestanden te verwerken. try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET # [INSTELLINGEN] httpadres = "http://xml.buienradar.nl/" bestand = "buienradar.xml" station = "6278" # Heino httpdata = urllib2.Request(httpadres) httphandle = urllib2.urlopen(httpdata) # XML Bestand wegschrijven. file = open(bestand, "w") file.write(httphandle.read()) file.close() xml = ET.parse(bestand) # Parse het XML bestand. try: for x in xrange(1, 1000): stationscan = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]").attrib.get('id') if stationscan == station: # Het weerstation is gevonden, lees de gegevens in. stationnaam = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/stationnaam").text regio = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/stationnaam").attrib.get('regio') temperatuur = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/temperatuur10cm").text print "Het is",temperatuur,"graden bij",stationnaam,"( regio",regio,")" break # Verbreek de loop except: # Foutafhandeling als het station niet gevonden is. print "Weerstation niet gevonden!" |
Data streamen ipv eerst op te slaan
Het is ook mogelijk om de XML te parsen zonder deze eerst op te slaan, scheelt weer read/write cycles.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# XML voorbeeld van het ophalen van de temperatuur van een weerstation vanuit de XML data van Buienradar (door S. Ebeltjes / domoticx.nl) # # Importeren van bibliotheken # Bibliotheek om data te ontvangen en te versturen via het HTTP protocol. import urllib2 # Bibliotheek om XML bestanden te verwerken. try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET # [INSTELLINGEN] httpadres = "http://xml.buienradar.nl/" station = "6278" # Heino httpdata = urllib2.Request(httpadres) xml = ET.parse(urllib2.urlopen(httpdata)) # Parse het XML bestand try: for x in xrange(1, 1000): stationscan = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]").attrib.get('id') if stationscan == station: # Het weerstation is gevonden, lees de gegevens in. stationnaam = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/stationnaam").text regio = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/stationnaam").attrib.get('regio') temperatuur = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/temperatuur10cm").text print "Het is",temperatuur,"graden bij",stationnaam,"( regio",regio,")" break # Verbreek de loop except: # Foutafhandeling als het station niet gevonden is. print "Weerstation niet gevonden!" |
Het script als import functie gebruiken:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# XML voorbeeld van het ophalen van gegevens van een weerstation vanuit de XML data van Buienradar (door S. Ebeltjes / domoticx.nl) # # Importeren van bibliotheken # Bibliotheek om data te ontvangen en te versturen via het HTTP protocol. import urllib2 # Bibliotheek om XML bestanden te verwerken. try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET # [INSTELLINGEN] httpadres = "http://xml.buienradar.nl/" def station(stationnr): httpdata = urllib2.Request(httpadres) xml = ET.parse(urllib2.urlopen(httpdata)) # Parse het XML bestand try: for x in xrange(1, 1000): stationscan = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]").attrib.get('id') if stationscan == stationnr: # Het weerstation is gevonden, lees de gegevens in. stationnaam = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/stationnaam").text #[0] regio = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/stationnaam").attrib.get('regio') #[1] datum = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/datum").text #[2] luchtvochtigheid = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/luchtvochtigheid").text #[3] temperatuurGC = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/temperatuurGC").text #[4] windsnelheidMS = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/windsnelheidMS").text #[5] windsnelheidBF = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/windsnelheidBF").text #[6] windrichtingGR = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/windrichtingGR").text #[7] windrichting = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/windrichting").text #[8] luchtdruk = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/luchtdruk").text #[9] zichtmeters = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/zichtmeters").text #[10] windstotenMS = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/windstotenMS").text #[11] regenMMPU = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/regenMMPU").text #[12] zin = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/icoonactueel").attrib.get('zin') #[13] temperatuur10cm = xml.find("weergegevens/actueel_weer/weerstations/weerstation[" + str(x) + "]/temperatuur10cm").text #[14] return stationnaam, regio, datum, luchtvochtigheid, temperatuurGC, windsnelheidMS, windsnelheidBF, windrichtingGR, windrichting, luchtdruk, zichtmeters, windstotenMS, regenMMPU, zin, temperatuur10cm break # Verbreek de loop except: # Foutafhandeling als het station niet gevonden is. return "0","0","0","0","0","0","0","0","0","0","0","0","0","0" |
Gebruik:
1 2 3 4 |
import buienradar stationnaam = buienradar.station("6278")[0] regio = buienradar.station("6278")[1] temperatuur = buienradar.station("6278")[14] |