2012-02-25 13 views
5

Devo analizzare XML con nomi di tag che possono essere in ogni caso (misti, superiori, inferiori, ecc.) E non so quale sarà il caso in anticipo. Come posso fare in modo che findall sia totalmente insensibile alle maiuscole e minuscole in ElementTree?Trova maiuscole/minuscole in Python ElementTree

# Does not work 
    variables = message.findall("VaRiAbLE") 
+3

perché 'XML' è case-sensitive. – kev

+1

Capisco che l'XML sia case sensitive. Non controllo la generazione di questo XML, quindi la domanda sta ... Come può cercare la ricerca di un tag che possa apparire in ogni caso? Spinta iptree lo fa. Supponevo che anche ElementTree lo fosse. – 01100110

risposta

5

È sufficiente ottenere la stringa dall'albero, in minuscolo e rifare l'albero. Quindi dovrebbe essere analizzabile

import xml.etree.ElementTree as ET 
def to_parseable(tree): 
    t = ET.tostring(tree) 
    t = t.lower() 
    return ET.fromstring(t) 
+1

Grazie. Di tutte le soluzioni che ho provato, questo approccio funziona meglio. Sono d'accordo sul fatto che non dovrei farlo perché il creatore dell'XML dovrebbe usare un caso coerente nei nomi di tag e attributi, ma quando è fuori dal tuo controllo e devi gestire questo tipo di XML, allora questo approccio in ElementTree funziona . – 01100110

+2

Wtf, perché stai facendo questo? Almeno usa espressioni regolari per fare in modo che si applichino solo ai nomi di tag e attributi, jeez. – sleepycal

1

Regex al salvataggio. Si noti che questo è probabilmente orribile in termini di prestazioni, ma è ottimo per gli attributi XML estratti dagli elementi.

def getInsensitiveAttrbiute(element, key) : 

    keyRegex = re.compile(key, re.IGNORECASE) 
    for key in element.attrib.keys() : 
     if keyRegex.match(key) : 
      return element.attrib[key] 
    raise KeyError 


element = ET.fromstring('<FOO src="BAR" />') 
print getInsensitiveAttrbiute(element, "sRc") 
Problemi correlati