Как преобразовать ElementTree.Element
в строку?
Для Python 3:
xml_str = ElementTree.tostring(xml, encoding='unicode')
Для Python 2:
xml_str = ElementTree.tostring(xml, encoding='utf-8')
Следующее совместимо с Python 2 и 3, но работает только с латинскими символами :
xml_str = ElementTree.tostring(xml).decode()
Пример использования
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)
Вывод:
<Person Name="John" />
Объяснение
Несмотря на то, что подразумевает название, ElementTree.tostring()
по умолчанию возвращает строку байтов в Python 2 и 3. Это проблема в Python 3, который использует Unicode для строк .
В Python 2 вы можете использовать этот str
тип как для текстовых, так и для двоичных данных . К сожалению, это слияние двух разных концепций могло привести к нестабильному коду, который иногда работал с любыми типами данных, а иногда - нет. [...]
Чтобы сделать различие между текстом и двоичными данными более четким и явным, [Python 3] сделал текст и двоичные данные отдельными типами, которые нельзя слепо смешивать вместе .
Источник: Перенос кода Python 2 на Python 3
Если мы знаем, какая версия Python используется, мы можем указать кодировку как unicode
или utf-8
. В противном случае, если нам нужна совместимость с Python 2 и 3, мы можем использовать decode()
для преобразования в правильный тип.
Для справки я включил сравнение .tostring()
результатов между Python 2 и Python 3.
ElementTree.tostring(xml)
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml, encoding='unicode')
# Python 3: <Person Name="John" />
# Python 2: LookupError: unknown encoding: unicode
ElementTree.tostring(xml, encoding='utf-8')
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml).decode()
# Python 3: <Person Name="John" />
# Python 2: <Person Name="John" />
Спасибо Martijn Peters за указание на изменение str
типа данных между Python 2 и 3.
Почему бы не использовать str ()?
В большинстве сценариев использование str()
было бы « каноническим » способом преобразования объекта в строку. К сожалению, использование этого с Element
возвращает местоположение объекта в памяти как шестнадцатеричную строку, а не строковое представление данных объекта.
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml))
ElementTree.tostring()
также создается строка байтов.str
Тип является байтовой строки в Python 2 (Python 3 вstr
тип называетсяunicode
в Python 2).