web-dev-qa-db-ja.com

Python ElementTreeを文字列に変換します

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'
64
user1732480

Elementオブジェクトには.getroot()メソッドがありません。その呼び出しをドロップすると、 .tostring() 呼び出しが機能します:

xmlstr = ElementTree.tostring(et, encoding='utf8', method='xml')
80
Martijn Pieters

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()を使用しないのですか?

ほとんどのシナリオでは、 str() を使用すると、オブジェクトを文字列に変換する " cannonical "の方法になります。残念ながら、これをElementとともに使用すると、オブジェクトのデータの文字列表現ではなく、メモリ内のオブジェクトの位置が16進数文字列として返されます。

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
print(str(xml))  # <Element 'Person' at 0x00497A80>
20
Stevoisiak