Wie konvertiere ich ElementTree.Element
in einen String?
Für Python 3:
xml_str = ElementTree.tostring(xml, encoding='unicode')
Für Python 2:
xml_str = ElementTree.tostring(xml, encoding='utf-8')
Zur Kompatibilität mit Python 2 und 3:
xml_str = ElementTree.tostring(xml).decode()
Anwendungsbeispiel
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)
Ausgabe:
<Person Name="John" />
Erläuterung
Ungeachtet dessen, was der Name andeutet, ElementTree.tostring()
wird in Python 2 und 3 standardmäßig ein Bytestring zurückgegeben. Dies ist ein Problem in Python 3, das Unicode für Zeichenfolgen verwendet .
In Python 2 können Sie den str
Typ sowohl für Text- als auch für Binärdaten verwenden . Leider könnte dieses Zusammentreffen zweier unterschiedlicher Konzepte zu sprödem Code führen, der manchmal für beide Arten von Daten funktioniert, manchmal nicht. [...]
Um die Unterscheidung zwischen Text und Binärdaten klarer und deutlicher zu machen, hat [Python 3] Text- und Binärdaten zu unterschiedlichen Typen gemacht, die nicht blind miteinander gemischt werden können .
Quelle: Portierung von Python 2-Code nach Python 3
Wenn wir wissen, welche Version von Python verwendet wird, können wir die Codierung als unicode
oder angeben utf-8
. Wenn wir andernfalls Kompatibilität mit Python 2 und 3 benötigen, können wir decode()
in den richtigen Typ konvertieren.
Als Referenz habe ich einen Vergleich der .tostring()
Ergebnisse zwischen Python 2 und Python 3 beigefügt .
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" />
Vielen Dank an Martijn Peters für den Hinweis, dass sich der str
Datentyp zwischen Python 2 und 3 geändert hat.
Warum nicht str () verwenden?
In den meisten Szenarien ist die Verwendung str()
die " kanonische " Methode, um ein Objekt in eine Zeichenfolge zu konvertieren. Element
Wenn Sie dies mit verwenden, wird die Position des Objekts im Speicher leider als Hexstring und nicht als String-Darstellung der Objektdaten zurückgegeben.
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>
<?xml version='1.0' encoding='utf8'?>
Header vorangestellt . Wenn esutf-8
der Header ist, ist er nicht enthalten. Auch wennet
es sich um einen ElementTree handelt, muss man bestehenet.getroot()
.