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: , , ,  · Kategoria: Programowanie

Napisz komentarz