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ではデフォルトでバイト文字列を返します。これは、文字列にUnicodeを使用するPython3の問題です。
Python 2ではstr
、テキストとバイナリデータの両方に型を使用できます。残念ながら、この2つの異なる概念の合流により、コードが脆弱になり、どちらの種類のデータでも機能する場合と機能しない場合があります。[...]
テキストとバイナリデータの区別をより明確かつ明確にするために、[Python 3]は、テキストとバイナリデータを盲目的に混合できない別個のタイプにしました。
出典:Python2コードのPython3への移植
使用されているPythonのバージョンがわかっている場合は、エンコーディングをunicode
またはとして指定できますutf-8
。それ以外の場合、Python 2と3の両方との互換性が必要な場合は、を使用decode()
して正しい型に変換できます。
参考までに、Python2とPython3の.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" />
データ型がPython2str
と3の間で変更されたことを指摘してくれたMartijnPetersに感謝します。
str()を使用してみませんか?
ほとんどのシナリオでは、を使用str()
することは、オブジェクトを文字列に変換するための「標準的な」方法です。残念ながら、これをで使用Element
すると、オブジェクトのデータの文字列表現ではなく、メモリ内のオブジェクトの場所が16進文字列として返されます。
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()
。