Как преобразовать 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).unicode
вернули строку.Нелатинское расширение ответа
Расширение ответа @ Stevoisiak и работа с нелатинскими символами. Только один способ отобразит вам нелатинские символы. Один метод отличается как на Python 3, так и на Python 2.
Ввод
xml = ElementTree.fromstring('<Person Name="크리스" />') xml = ElementTree.Element("Person", Name="크리스") # Read Note about Python 2
Вывод
ElementTree.tostring(xml) # Python 3 (크리스): b'<Person Name="크리스" />' # Python 3 (John): b'<Person Name="John" />' # Python 2 (크리스): <Person Name="크리스" /> # Python 2 (John): <Person Name="John" /> ElementTree.tostring(xml, encoding='unicode') # Python 3 (크리스): <Person Name="크리스" /> <-------- Python 3 # Python 3 (John): <Person Name="John" /> # Python 2 (크리스): LookupError: unknown encoding: unicode # Python 2 (John): LookupError: unknown encoding: unicode ElementTree.tostring(xml, encoding='utf-8') # Python 3 (크리스): b'<Person Name="\xed\x81\xac\xeb\xa6\xac\xec\x8a\xa4" />' # Python 3 (John): b'<Person Name="John" />' # Python 2 (크리스): <Person Name="크리스" /> <-------- Python 2 # Python 2 (John): <Person Name="John" /> ElementTree.tostring(xml).decode() # Python 3 (크리스): <Person Name="크리스" /> # Python 3 (John): <Person Name="John" /> # Python 2 (크리스): <Person Name="크리스" /> # Python 2 (John): <Person Name="John" />
источник
Если вам это нужно просто для отладки, чтобы увидеть, как выглядит XML, тогда вместо
print(xml.etree.ElementTree.tostring(e))
вы можете использоватьdump
вот так:xml.etree.ElementTree.dump(e)
И это работает как с
Element
иElementTree
объекты , какe
, так что не должно быть никакой необходимостиgetroot
.Документация
dump
говорится:источник