[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