pythonの内部表現からxmlへの出力

主に使うのは,etreeオブジェクト.これは標準で入っているモジュール(のはず)なので,一般的な話ができるはず.

基本的な書き方は
DrunkBoarder · yuki_B's web site
XML ドキュメントを作成する - Python Module of the Week
を見りゃいいのだが,細かい所の補足だけ.

作成したxmlツリーのオブジェクトを文字列に書き出すには,xml.etree.ElementTree.tostring(xmlのroot)を使えばよい.が,標準では文字コードがascii(たぶん)の上に,すべてが一行のxmlが生成されてしまう.

まず,文字コードの問題は,引数にencoding='utf-8'と記述すれば,解決.

次に,すべてが一行でつながるxmlに対しては,こんなことをしてやる

from xml.etree import ElementTree
from xml.dom import minidom

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = ElementTree.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="  ")

from Pretty print xml with python - indenting xml.


この関数が何をやっているか?というと,

  • 通常と同じくtostringメソッドで一行つなぎのxmlを作成する.
  • minidomのminidom.parseStringメソッドで解析させる
  • reparsed.toprettyxml(indent=" ")で整形を行う

という流れ.
一度,文字列にしたものを解析して,もう一度文字列にするっていうのは,無駄な気もするけど...ま,いっか