Как сделать так, чтобы Python ElementTree игнорировал отсутствие пробелов между кавычками и атрибутами? - PullRequest
4 голосов
/ 01 июля 2019

Когда я запускаю

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

, я получаю

xml.etree.ElementTree.ParseError: неправильно сформирован (неверный токен): строка 1, столбец 11

Это связано с отсутствием пробела между "" и baz.

Я сталкиваюсь с этой проблемой в файлах XML, предоставленных мне третьей стороной.

Isесть ли способ заставить ElementTree быть немного менее педантичным в интервале и проанализировать его, как если бы был пробел?

1 Ответ

1 голос
/ 01 июля 2019

Поскольку это звучит как решение, может быть, не в поле зрения ...

Пока не будет найдено лучшее решение, вот хакерский обходной путь для следующей бедной души ...

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>

Очки Брауни, если вы обнаружите ошибки в этом!

...