web-dev-qa-db-ja.com

Python XML ElementTreeを文字列に変換する

それを変更した後、XML ElementTree を文字列に変換する必要があります。機能していないのはtoString部分です。

import xml.etree.ElementTree as ET

tree = ET.parse('my_file.xml')
root = tree.getroot()

for e in root.iter('tag_name'):
    e.text = "something else" # This works

# Now I want the the complete XML as a String with the alteration

ETまたはElementTreeをさまざまな名前にして、toStringなどをインポートして、以下の行のさまざまなバージョンを試しました。

s = tree.tostring(ET, encoding='utf8', method='xml')

私はConvert Python ElementTree to stringと他のいくつかを見てきましたが、私はそれを私の例に適用する方法がわかりません。

8
user984003

これはうまくいくはずです:-

xmlstr = ET.tostring(root, encoding='utf8', method='xml')
6
Stephen Briney

_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>
_
4
Stevoisiak