Parsowanie XML w Pythonie

Obsługa XMLa w Pythonie jest pełna i zapewniana przez wiele modułów. Niestety API nie jest tak proste i przyjemne jak np. simpleXML w PHP. Oto prosty kod XML jaki użyjemy do nauki:
<znajomi>
	<osoba>
		<imie foo="zzz">Zygmunt</imie>
		<email>1@1.pl</email>
	</osoba>
	<osoba>
		<imie foo="aaaa">Janina</imie>
		<email>2@2.pl</email>
	</osoba>
</znajomi>
A oto pierwszy kod Pythona:
from xml.dom import minidom

#otwieramy plik w parserze
DOMTree = minidom.parse('plik.xml')

print DOMTree.toxml()
Powyższy kod otwiera plik z kodem XML i zwraca obiekt minidom pod zmienną "DOMTree". Zastosowana na końcu metoda .toxml() służy do wyświetlania kodu XML - powyższy kod wyświetli całą strukturę XMLa z naszego przykładowego pliku. .toxml() jest dość przydatne, gdyż przeglądając dzieci danego taga XML możemy szybko sprawdzić jak wygląda sytuacja (na jakim poziomie jesteśmy i jakie dane mamy dostępne). Oto kolejny przykład:
from xml.dom import minidom

#Open XML document using minidom parser
DOMTree = minidom.parse('plik.xml')

#pobieramy elementy struktury dokumentu XML
cNodes = DOMTree.childNodes
# struktura pierwszego dziecka "osoba"
print cNodes[0].getElementsByTagName("osoba")[0].toxml()
Metoda DOMTree.childNodes zwraca obiekt "DOM Element" w tupli, dzięki któremu możemy uzyskać dostęp do elementów dokumentu XML. Kolejna metoda getElementsByTagName("NAZWA") umożliwia dostęp do taga-dziecka o podanej nazwie (też przez tuplę). Powyższy kod wyświetli:
<osoba>
                <imie foo="zzz">Zygmunt</imie>
                <email>1@1.pl</email>
        </osoba>

Oto kompletny kod parsujący nasz plik XML:
from xml.dom import minidom

#Open XML document using minidom parser
DOMTree = minidom.parse('plik.xml')

#pobieramy elementy struktury dokumentu XML
cNodes = DOMTree.childNodes
for i in cNodes[0].getElementsByTagName("osoba"):
	# nazwa taga
	print i.getElementsByTagName("imie")[0].nodeName
	# wartosc taga
	print i.getElementsByTagName("imie")[0].childNodes[0].toxml()
	# dostep do atrybutu
	print i.getElementsByTagName("imie")[0].getAttribute("foo")
W powyższym kodzie pobieramy obiekt do taga "osoba" i w pętli iterujemy go uzyskując dostęp do poszczególnych jego dzieci (w tym przypadku tylko do taga "imie"). .nodeName - zwraca nazwę taga, .nodeValue - wartość taga (nie w tym przypadku), a getAttribute("NAZWA") wartość podanego atrybutu taga.
RkBlog

Podstawy Pythona, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact