Python ElementTree中的findall不区分大小写

6

我需要解析XML,但标签名可能是任何形式的大小写(混合大小写、全大写、全小写等),而且我不知道预先知道它的大小写方式。如何使ElementTree中的findall完全不区分大小写?

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

3
因为XML区分大小写。 - kev
3
我了解XML区分大小写。我无法控制生成此XML的过程,所以问题是... 如何让findall搜索可以出现在任何情况下的标签? Boost iptree可以做到。我以为ElementTree也可以。 - 01100110
2个回答

6

您只需从树中获取字符串,将其转换为小写并重构树。这样就可以进行解析。

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
3
为什么这样做?至少使用正则表达式,只将其应用于标签和属性名称,天哪。 - SleepyCal
1
这不太好。上面的代码也将有用的数据转换为小写。 - Chris P
太糟糕了!当你完成后,所有XML数据都是小写的。 - jbo5112
这太糟糕了!完成后,所有的XML数据都变成小写字母。 - jbo5112

2

正则表达式来拯救。请注意,这可能在性能方面很可怕,但非常适合从元素中提取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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接