Как правильно разобрать utf-8 xml с ElementTree?


Мне нужна помощь, чтобы понять, почему разбор моего xml-файла* с помощью xml.этри.ElementTree выдает следующие ошибки.

*мой тестовый xml-файл содержит арабские символы.

Задача: Откройте и проанализируйте файл utf8_file.xml.

Моя первая попытка:

import xml.etree.ElementTree as etree
with codecs.open('utf8_file.xml', 'r', encoding='utf-8') as utf8_file:
    xml_tree = etree.parse(utf8_file)

Результат 1:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 236-238: ordinal not in range(128)

Моя вторая попытка:

import xml.etree.ElementTree as etree
with codecs.open('utf8_file.xml', 'r', encoding='utf-8') as utf8_file:
    xml_string = etree.tostring(utf8_file, encoding='utf-8', method='xml')
    xml_tree  = etree.fromstring(xml_string)

Результат 2:

AttributeError: 'file' object has no attribute 'getiterator'

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

1 11

1 ответ:

Оставьте декодирование байтов синтаксическому анализатору; сделайте Не декодировать сначала:

import xml.etree.ElementTree as etree
with open('utf8_file.xml', 'r') as xml_file:
    xml_tree = etree.parse(xml_file)

XML-файлдолжен содержать достаточно информации в первой строке для обработки декодирования синтаксическим анализатором. Если заголовок отсутствует, синтаксический анализатор должен предположить, что используется UTF-8.

Поскольку именно заголовок XML содержит эту информацию, ответственность за декодирование лежит на синтаксическом анализаторе.

Ваша первая попытка не удалась, потому что Python пытался кодировать значения Unicode опять же, чтобы синтаксический анализатор мог обрабатывать байтовые строки, как он ожидал. Вторая попытка не удалась, так как etree.tostring() ожидает в качестве первого аргумента анализируемое дерево, а не строку Юникода.