2012-02-25 109 views
5

我必須解析具有可能在任何情況下(混合,上,下等)的標籤名稱的XML,並且我不知道事件會是什麼。我怎樣才能讓findall在ElementTree中完全不區分大小寫?在Python中不區分大小寫的findall ElementTree

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

因爲'XML'區分大小寫。 – kev 2012-02-25 03:25:10

+1

我知道XML區分大小寫。我不控制這個XML的生成,所以問題是...如何找到可能出現在任何情況下的標籤?提升iptree做到這一點。我假設ElementTree也會。 – 01100110 2012-02-25 19:56:45

回答

5

您只需從樹中獲取字符串,小寫它,然後重新制作樹。那麼它應該可以解析

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

謝謝。在我嘗試的所有解決方案中,這種方法效果最佳。我同意我不應該這樣做,因爲XML的創建者應該在標記和屬性名稱中使用一致的大小寫,但是當它超出了您的控制範圍並且您必須處理這種類型的XML時,那麼ElementTree中的這種方法可以工作。 – 01100110 2012-03-25 17:30:34

+2

Wtf,你爲什麼要這樣做?至少使用正則表達式來使這隻適用於標籤和屬性名稱,jeez。 – sleepycal 2015-01-16 21:38:08

1

正則表達式來拯救。請注意,這在性能方面可能很可怕,但對於從元素中提取XML屬性非常有用。

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")