2014年3月28日金曜日

xmlにインデントを加えて整形した時の覚書

svgwriteを使ってSVGファイルを作ってみたのですが、改行がないので、ファイルサイズ的には良いのですが、デバッグには都合が悪いので、整形するための方法を探していた時の覚書です。

lxml

inkscapeに合わせてlxmlにしてみました。

from lxml import etree
...
    e = etree.fromstring(root.tostring())
    et = etree.ElementTree(e)
    et.write(filename, pretty_print=True)

分かりやすくてよいのですが、インデントが半角スペース二個で固定されている点が不満です。
その他、表示上問題ありませんが、styleに付いている<[!CDATA[]]>が消えてしまいました。

minidom

参考:Creating XML Documents

上は自力でがんばったのですが、最初に検索で見つけたのはこちらの方法です。

from xml.dom import minidom
...
    d = minidom.parseString(root.tostring())
    f = open(filename, 'w')
    f.write(d.toprettyxml(indent=' '))
    f.close()

svgwriteから直接文字列を取り出せるので、参考先と比較すると少し簡潔になります。
私の見損じがあるかもしれませんが、lxmlを使うより良い感じがしました。