1. ホーム
  2. python

[解決済み] Python の ElementTree を XML ファイルにきれいに印刷するにはどうしたらいいですか?

2022-02-11 09:50:59

質問内容

背景

SQLiteを使ってデータベースにアクセスし、必要な情報を取り出しています。Pythonバージョン2.6のElementTreeを使って、その情報を含むXMLファイルを作成しています。

コード

import sqlite3
import xml.etree.ElementTree as ET

# NOTE: Omitted code where I acccess the database,
# pull data, and add elements to the tree

tree = ET.ElementTree(root)

# Pretty printing to Python shell for testing purposes
from xml.dom import minidom
print minidom.parseString(ET.tostring(root)).toprettyxml(indent = "   ")

#######  Here lies my problem  #######
tree.write("New_Database.xml")

試行回数

を使ってみました。 tree.write("New_Database.xml", "utf-8") を上記のコードの最後の行に置き換えても、XMLのレイアウトは全く編集されず、まだごちゃごちゃしています。

また、いじくり回してみようと思い、こうしてみました。
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
というエラーが出て、Python シェルに出力されません。 AttributeError: 'unicode' オブジェクトには 'write' という属性がありません。 .

質問内容

最終行でXMLファイルにツリーを書き込むとき、Pythonシェルに書き込むのと同じようにXMLファイルにきれいに印刷する方法はありますか?

を使用することはできますか? toprettyxml() それとも別の方法があるのでしょうか?

どのように解決するのですか?

XMLの文字列が何であれ、書き込み用のファイルを開き、その文字列をファイルに書き込めば、好きなファイルに書き込むことができます。

from xml.dom import minidom

xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent="   ")
with open("New_Database.xml", "w") as f:
    f.write(xmlstr)

特にPython 2では、文字列内のUnicode文字についてあまり厳密でなく、また洗練されていないため、1つだけ複雑な可能性があります。もし、あなたの toprettyxml メソッドは、Unicode文字列( u"something" ) の場合、それをUTF-8などの適切なファイルエンコーディングにキャストしたい場合があります。例えば、1行の書き込みを次のように置き換えます。

f.write(xmlstr.encode('utf-8'))