PDA

View Full Version : [Python]Parsing xml


pmhwp
21-04-2010, 11:37
Ciao,
ho un file xm tipo questo:
<Environment NumLayers="2">
<Map Id="aaaaa" IsCategorical="0"/>
<Map Id="bbbbb" IsCategorical="0"/>
<Mask Id="ccccc"/>
</Environment>

Vorrei estrarre con uno script python i valori contenuti in map ip e mask id.

Come posso fare?

Grazie.

cionci
21-04-2010, 12:30
http://docs.python.org/library/markup.html

pmhwp
21-04-2010, 12:35
Si,
l'avevo letta...ma non è che sia molto esperto di python.....
Non è che potete farmi un esempio?

Grazie ancora.

cdimauro
21-04-2010, 21:40
Per un parsing molto semplice e veloce (ma senza tanti controlli), ti suggerisco expat (http://docs.python.org/library/pyexpat.html?highlight=expat#module-xml.parsers.expat). Trovi un esempio bello e pronto che ti suggerisco di provare e di adattare in due secondi per il tuo caso d'uso.

Per qualcosa di più robusto c'è il link che ha ti ha segnalato Riccardo prima.

pmhwp
22-04-2010, 10:07
Scusate ma sono alle prime armi con python.

Allora ho provato questo esempio:

import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
print 'Start element:', name, attrs
def end_element(name):
print 'End element:', name
def char_data(data):
print 'Character data:', repr(data)

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)

Non mi viene mostrato nessun risultato lanciandolo da shell.

Da come ho capito gli handler sono tipo dei thread che mostrano il contenuto del file.

Cosa sbaglio?

Grazie.

pmhwp
22-04-2010, 10:13
Come non detto...ora improvvisamente funziona.....

Ho adattato lo script in questo modo:

import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
if(name=="Map" ):
print 'Map:', attrs
if(name=="Mask"):
print 'Mask:', attrs

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element

p.ParseFile(open("request.xml","r"))



Il problema è che l'output é:
Map: {u'IsCategorical': u'0', u'Id': u'rain_coolest.tif'}

Solo che a me servirebbe solo rain_coolest.tif

Come lo estraggo?

Grazie.

cdimauro
22-04-2010, 14:48
if name == 'Map':
print 'IsCategorical:', attrs['IsCategorical']

pmhwp
22-04-2010, 15:07
Grazie