XML i Python
Istnieją dwa podstawowe sposoby przetwarzania dokumentów XML: SAX (Simple API for XML) i DOM (Document Object Model). Standardowa biblioteka Pythona posiada moduły do obsługi obu interfejsów.
SAX jest strumieniowym interfejsem odczytywania danych z dokumentów XML opartym na zdarzeniach. Zdarzenia wywoływane są dwukrotnie (na początku i na końcu) podczas napotkania któregokolwiek z elementów dokumentu XML. Wystąpienie zdarzenia powoduje wywołanie metody zdefiniowanej przez programistę. Dokument XML jest przetwarzany jednorazowo od początku do końca dokumentu. Takie podejście powoduje, że SAX sprawdza się dobrze przy przetwarzaniu dużych dokumentów nie obciążając mocno pamięci. Obsługa interfejsu SAX realizowana jest w Pythonie przez moduł xml.sax.
DOM przedstawia dokument w postaci hierarchicznej struktury podobnej do drzewa. Elementy XML w modelu DOM nazywane są węzłami. Na szczycie drzewa mamy węzeł korzeń, który zawiera pozostałe węzły elementów XML. Teksty w elementach są węzłami tekstów, a atrybuty węzłami atrybutów. Również komentarze w dokumencie są węzłami komentarzy. Pomiędzy węzłami istnieje związek hierarchiczny oznaczający, że każdy węzeł (oprócz korzenia) ma dokładnie jednego rodzica i może mieć dowolną liczbę dzieci. Węzły z tymi samymi rodzicami nazywane są rodzeństwem, natomiast węzeł bez dzieci nazywany jest liściem.
Interfejs DOM zanim rozpocznie przetwarzanie dokumentu XML ładuje go do pamięci, dlatego zalecany jest do przetwarzania niewielkich dokumentów ze względu na obciążenie pamięci. W porównaniu do SAX uznawany jest za wolniejszy, ale za to łatwiejszy w obsłudze.
Poniżej przykład jak utworzyć dokument XML przy użyciu interfejsu DOM:
# -*- coding: utf-8 -*-
from xml.dom import minidom
# Utworzenie obiektu DOM
DOMimpl = minidom.getDOMImplementation()
# Utworzenie dokumentu
xmldoc = DOMimpl.createDocument(None, "kontakty", None)
kontakty = xmldoc.documentElement
# Dodanie kontaktu
kontakt = xmldoc.createElement("kontakt")
kontakt_atr = xmldoc.createAttribute("nick")
kontakt_atr.nodeValue = "janek"
kontakt.setAttributeNode(kontakt_atr)
imie = xmldoc.createElement("imie")
imie.appendChild(xmldoc.createTextNode("Jan"))
kontakt.appendChild(imie)
nazwisko = xmldoc.createElement("nazwisko")
nazwisko.appendChild(xmldoc.createTextNode("Kowalski"))
kontakt.appendChild(nazwisko)
telefon = xmldoc.createElement("telefon")
telefon.appendChild(xmldoc.createTextNode("123 456 789"))
kontakt.appendChild(telefon)
kontakty.appendChild(kontakt)
# Zapisanie dokumentu
plik = open("kontakty.xml", "wb")
plik.write(xmldoc.toxml("utf-8"))
plik.close()
Przykład w jaki sposób przy pomocy DOM dostać się do danych z pliku utworzonego w poprzednim przykładzie:
# -*- coding: utf-8 -*-
from xml.dom import minidom
xmldoc = minidom.parse("kontakty.xml")
kontakty = xmldoc.getElementsByTagName("kontakt")
for kontakt in kontakty:
nick = kontakt.getAttribute("nick")
imie = kontakt.getElementsByTagName("imie")[0]
imie = imie.firstChild.nodeValue
nazwisko = kontakt.getElementsByTagName("nazwisko")[0]
nazwisko = nazwisko.firstChild.nodeValue
telefon = kontakt.getElementsByTagName("telefon")[0]
telefon = telefon.firstChild.nodeValue
print "Kontakt: %s" % nick
print " Imie: %s" % imie
print " Nazwisko: %s" % nazwisko
print " Telefon: %s" % telefon
A oto wynik:
Kontakt: janek Imie: Jan Nazwisko: Kowalski Telefon: 123 456 789
20.03.2011
·
Wojciech Warczakowski ·
Brak komentarzy
Tagi: dom, python, sax, xml · Kategoria: Programowanie

Napisz komentarz