それを変更した後、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と他のいくつかを見てきましたが、私はそれを私の例に適用する方法がわかりません。
これはうまくいくはずです:-
xmlstr = ET.tostring(root, 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>
_