Як конвертувати 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()
повертає bytestring за замовчуванням у 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" />
Дякую Мартіну Петерсу за вказівку на те, що str
тип даних змінився між Python 2 і 3.
Чому б не використовувати str ()?
У більшості сценаріїв використання str()
буде « канонічним » способом перетворення об’єкта в рядок. На жаль, використання цього параметра Element
повертає розташування об’єкта в пам’яті як шістнадцятковий рядок, а не як рядкове представлення даних об’єкта.
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>
<?xml version='1.0' encoding='utf8'?>
заголовок. Коли цеutf-8
заголовок, не входить. Крім того, якщо цеet
було ElementTree, ви повинні пройтиet.getroot()
.