首页 > 解决方案 > 如何让 Python 的 ElementTree 忽略引号和属性之间缺少空格?

问题描述

当我跑

from xml.etree import ElementTree
tree = ElementTree.fromstring('<foo bar=""baz=""></foo>')

我明白了

xml.etree.ElementTree.ParseError:格式不正确(无效标记):第 1 行,第 11 列

这是因为 和 之间没有""空格baz

我在第三方提供给我的 XML 文件中遇到了这个问题。

有什么办法可以让ElementTree间距变得不那么迂腐,并像有空格一样解析它?

标签: pythonelementtree

解决方案


因为这听起来像一个解决方案可能看不到......

在出现更好的解决方案之前,这里有一个针对下一个可怜的灵魂的 hacky 解决方法......

def xml_fixup(s):  # give it the XML as a tring
    flags = re.DOTALL
    pat_quotes = '\"[^\"]*\"|\'[^\']*\''
    re_quotes = re.compile('(%s)([^>\\s])' % pat_quotes, flags)  # TODO: cache
    re_pieces = re.compile('([^<]+)|(<)((?:[^\"\'>]+|%s)*)(>)' % pat_quotes, flags)  # TODO: cache
    pieces = re_pieces.findall(s)
    return s[:0].join(map(lambda m: m[0] or m[1] + re_quotes.sub('\\1 \\2', m[2]) + m[3], pieces))

print(xml_fixup('<foo bar=""baz=""></foo>'))  # <foo bar="" baz=""></foo>

如果您发现其中的错误,则布朗尼积分!


推荐阅读