Bei jedem Anruf ElementTree.tostring(e)
wird folgende Fehlermeldung angezeigt:
AttributeError: 'Element' object has no attribute 'getroot'
Gibt es eine andere Möglichkeit, ein ElementTree-Objekt in eine XML-Zeichenfolge zu konvertieren?
Zurück verfolgen:
Traceback (most recent call last):
File "Development/Python/REObjectSort/REObjectResolver.py", line 145, in <module>
cm = integrateDataWithCsv(cm, csvm)
File "Development/Python/REObjectSort/REObjectResolver.py", line 137, in integrateDataWithCsv
xmlstr = ElementTree.tostring(et.getroot(),encoding='utf8',method='xml')
AttributeError: 'Element' object has no attribute 'getroot'
python
xml
marshalling
elementtree
Stevoisiak
quelle
quelle
<?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()
.encoding='utf8'
Gibt in Python 3 einen Bytestring anstelle eines Strings zurück. Ich empfehletostring(xml, encoding="unicode")
stattdessen zu verwenden .str
handelt es sich um dieselbe Art von Objekt wie inbytes
Python 3. Die Ausgabe von Bytes ist völlig korrekt,unicode
da die Ausgabe im Wesentlichen eine Ergänzung ist, mit der Sie vermeiden müssen, dass Sie dekodieren müssen, wenn Sie stattdessen eine Unicode-Zeichenfolge für Ihren speziellen Anwendungsfall benötigen.help
wird nurencoding="unicode"
eine Zeichenfolge zurückgegeben.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 .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 angebenutf-8
. Wenn wir andernfalls Kompatibilität mit Python 2 und 3 benötigen, können wirdecode()
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>
quelle
ElementTree.tostring()
auch ein Bytestring generiert. Derstr
Typ ist ein Bytestring in Python 2 (derstr
Typ von Python 3 wirdunicode
in Python 2 aufgerufen ).unicode
Zeichenfolge zurückerhalten.Nicht-lateinische Antworterweiterung
Erweiterung der Antwort von @ Stevoisiak und Umgang mit nicht-lateinischen Zeichen. Nur eine Möglichkeit zeigt Ihnen die nicht-lateinischen Zeichen an. Die eine Methode unterscheidet sich sowohl in Python 3 als auch in Python 2.
Eingang
xml = ElementTree.fromstring('<Person Name="크리스" />') xml = ElementTree.Element("Person", Name="크리스") # Read Note about Python 2
Ausgabe
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" />
quelle