PythonElementTreeを文字列に変換する


84

を呼び出すたびに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'

回答:


106

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

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

6
検索エンジンから後発の場合:エンコーディングが「utf8」の場合、<?xml version='1.0' encoding='utf8'?>ヘッダーの前に追加されます。その場合utf-8、ヘッダーは含まれません。またet、ElementTreeの場合は、を渡す必要がありますet.getroot()
野口健二

23
Python 3ではencoding='utf8'、文字列の代わりにバイト文字列を返します。代わりに使用tostring(xml, encoding="unicode")することをお勧めします
Stevoisiak 2018

1
@StevenVascellaro:XMLは実際にはバイナリ形式であり、データ形式は特定のエンコーディングのバイトで構成されます(上部のXML宣言で指定され、欠落している場合はデフォルトでUTF-8になります)。Python 2では、Python 3strと同じ種類のオブジェクトbytesです。バイトの出力は完全に正しいです。unicode出力は基本的に追加であるため、特定のユースケースではなくUnicode文字列が必要な場合にデコードする必要がありません。
MartijnPieters

によると、文字列helpのみencoding="unicode"が返されます。
cz 2018

45

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>

1
Python 2ElementTree.tostring()では、バイト文字列も生成されます。strタイプはPython2ではバイト文字列です(Python3のタイプはPython2str呼び出さunicodeれます)。
MartijnPieters

1
この機能はPython3バージョンにのみ追加され、Python 2にバックポートされていません。追加された場合は、unicode文字列が返されます。
MartijnPieters

0

非ラテン語回答拡張

@Stevoisiakの回答の拡張と非ラテン文字の処理。ラテン文字以外の文字を表示する方法は1つだけです。1つの方法は、Python3とPython2の両方で異なります。

入力

xml = ElementTree.fromstring('<Person Name="크리스" />')
xml = ElementTree.Element("Person", Name="크리스")  # Read Note about Python 2

注:Python 2では、toString(...)コードを呼び出すときに、を割り当てるxmlElementTree.Element("Person", Name="크리스")エラーが発生します...

UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)

出力

ElementTree.tostring(xml)
# Python 3 (크리스): b'<Person Name="&#53356;&#47532;&#49828;" />'
# Python 3 (John): b'<Person Name="John" />'

# Python 2 (크리스): <Person Name="&#53356;&#47532;&#49828;" />
# 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="&#53356;&#47532;&#49828;" />
# Python 3 (John): <Person Name="John" />

# Python 2 (크리스): <Person Name="&#53356;&#47532;&#49828;" />
# Python 2 (John): <Person Name="John" />

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.