ElementTree.tostring(e)
を呼び出すたびに、次のエラーメッセージが表示されます。
AttributeError: 'Element' object has no attribute 'getroot'
ElementTreeオブジェクトをXML文字列に変換する他の方法はありますか?
TraceBack:
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'
Element
オブジェクトには.getroot()
メソッドがありません。その呼び出しをドロップすると、 .tostring()
呼び出しが機能します:
xmlstr = ElementTree.tostring(et, encoding='utf8', method='xml')
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
タイプを使用できます。残念ながら、この2つの異なる概念の合流は、いずれかの種類のデータで機能することもあれば、機能しないこともある脆弱なコードにつながる可能性があります。 [...]テキストとバイナリデータの区別をより明確で明確にするために、[Python 3]はテキストとバイナリデータを盲目的に混合できない個別のタイプにしました。
ソース: Porting Python 2 Code to Python 3
使用されているPythonのバージョンがわかっている場合は、エンコードをunicode
またはutf-8
として指定できます。そうでなければ、Python 2と3の両方との互換性が必要な場合、 decode()
を使用して正しい型に変換できます。
参考のために、Python 2とPython 3の.tostring()
の結果の比較を含めました。
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の間で変更されたことを指摘してくれた Martijn Peters に感謝します。
ほとんどのシナリオでは、 str()
を使用すると、オブジェクトを文字列に変換する " cannonical "の方法になります。残念ながら、これをElement
とともに使用すると、オブジェクトのデータの文字列表現ではなく、メモリ内のオブジェクトの位置が16進数文字列として返されます。
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>