【问题标题】:Case Insensitive findall in Python ElementTreePython ElementTree 中不区分大小写的 findall
【发布时间】:2014-02-01 08:42:37
【问题描述】:

我必须解析具有可能在任何情况下(混合、上、下等)的标记名称的 XML,并且我不知道事先会是什么情况。如何在 ElementTree 中使 findall 完全不区分大小写?

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

【问题讨论】:

  • 因为XML 区分大小写。
  • 我了解 XML 区分大小写。我不控制此 XML 的生成,所以问题是…… findall 如何搜索在任何情况下都可能出现的标签? Boost iptree 做到了。我认为 ElementTree 也会。

标签: python xml


【解决方案1】:

您只需从树中获取字符串,将其小写,然后重新制作树。那么它应该是可解析的

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

【讨论】:

  • 谢谢。在我尝试过的所有解决方案中,这种方法效果最好。我同意我不应该这样做,因为 XML 的创建者应该在标记和属性名称中使用一致的大小写,但是当它超出您的控制并且您必须处理这种 XML 时,那么 ElementTree 中的这种方法有效.
  • Wtf,你为什么要这样做?至少使用正则表达式使其仅适用于标签和属性名称,jeez。
  • 那不好。上面的代码也将有用的数据转换为小写。
【解决方案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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2013-03-06
    • 2020-02-18
    相关资源
    最近更新 更多