[python] XML PARSER
Petr Prikryl
PrikrylP na skil.cz
Úterý Duben 10 09:32:42 CEST 2007
hexim> Sent: Friday, April 06, 2007 7:13 PM
> [...] Jedna se mi o rozparsovani XML
> dokumentu do promenne , nejlepe slovniku ,
> napr x = {} aby bylo mozne
> cist hodnoty nasledovne:
>
> hodnotaA = x['tagA']
> hodnotaB = x['user']
>
> Vzorovy XML:
>
> <?xml version='1.0' encoding='UTF-8'?>
> <myxml>
> <neco>
> <tagA>Ahoj Světe</tagA>
> </neco>
> <mysql>
> <host>localhost</host>
> <user>root</user>
> <password>heslo</password>
> <db>databaze</db>
> </mysql>
> </myxml>
>
>
> Poradi mi nekdo, nejlepe malym vzorovym prikladem.
Záleží na tom, co všechno může být v xml souboru
uloženo a jak s tím budu chtít pracovat. Příklad
jsem uložil do xml souboru v daném kódování s BOM
na začátku a fungovalo mi bez problému tohle:
-----------------------------------------------
import xml.etree.ElementTree as et
tree = et.parse('a.xml')
d = dict( (e.tag, e.text) for e in tree.getiterator() )
print d
print d['user']
print d['password']
print d['tagA']
print type(d['tagA']) # unicode
-----------------------------------------------
Výsledek vypadal takto:
-----------------------------------------------
C:\tmp>python a.py
{'neco': '\n ', 'myxml': '\n ', 'db': 'databaze', 'host': 'localhost', 'user': 'roo
t', 'mysql': '\n \t', 'password': 'heslo', 'tagA': u'Ahoj Sv\u011bte'}
root
heslo
Ahoj Světe
<type 'unicode'>
-----------------------------------------------
Pozor! Je to nasrknuté do slovníku d, ve kterém
se ztratí duplicity. Pokud by tam bylo například
víc elementů user a password, bude ve slovníku
jen poslední z nich. To je aplikační věc -- možná
se to z toho stromu bude muset posbírat jinak.
Obecně, pro zpracování XML se používá buď SAX.
kdy průběžně zpracovávám části dokumentu, který
může být i extrémně velký -- nevytváří se jeho
obraz v paměti. Druhý přístup představuje DOM,
kdy se v paměti vytvoří model dokumentu, který
se pak různě prochází. DOM byl ale napsán původně
v jiném programovacím jazyce a do Pythonu byl
tak trochu otrocky přepsán. Nevyužívá se zde
výhod Pythonu ve smyslu vyjadřovacích schopností
a práce s pythonovskými základními datovými
strukturami. ElementTree je vlastně obdoba
DOM, která přebírá základní myšlenku, ale
implementuje ji čistě pythonovskými prostředky.
pepr
P.S. pro další šťourání nechť poslouží
následující příklad:
import xml.etree.ElementTree as et
tree = et.parse('a.xml')
print dir(tree)
et.dump(tree)
for e in tree.getiterator():
print e
print e.tag, e.text, e.attrib
Další informace o konferenci Python