1. ホーム
  2. python

[解決済み] Pythonを使った簡単なXMLファイルの作成

2022-04-14 09:55:26

質問

PythonでシンプルなXMLファイルを作成したい場合、どのような選択肢がありますか?(ライブラリ的に)

私が欲しいxmlは以下のようなものです。

<root>
 <doc>
     <field1 name="blah">some value1</field1>
     <field2 name="asdfasd">some vlaue2</field2>
 </doc>

</root>

解決方法は?

最近、最も人気のある(そして非常にシンプルな)オプションは ElementTree API , Python 2.5から標準ライブラリに含まれるようになりました。

その際に利用できるオプションは

  • ElementTree(ElementTreeの基本的な、純粋なPythonの実装。 2.5以降、標準ライブラリの一部)
  • cElementTree(ElementTreeの最適化されたC実装。2.5以降、標準ライブラリでも提供。非推奨。3.3から自動で通常のElementTreeに折り込まれるようになった)
  • LXML(libxml2がベース。ElementTree APIの豊富なスーパーセットとXPath、CSSセレクタなどを提供)

以下は、in-stdlibのcElementTreeを使用してサンプルドキュメントを生成する例です。

import xml.etree.cElementTree as ET

root = ET.Element("root")
doc = ET.SubElement(root, "doc")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

tree = ET.ElementTree(root)
tree.write("filename.xml")

テストしてみたところうまくいきましたが、空白は重要でないことが前提です。もし、"prettyprint"のインデントが必要なら、その方法を調べますので、お知らせください。(LXML特有のオプションかもしれません。stdlibの実装はあまり使っていません)

さらに詳しい情報については、以下のリンクが参考になります。

最後の注意として、cElementTreeとLXMLのどちらかは、すべてのニーズに対して十分に速いはずです(どちらも最適化されたCコードです)が、最後の1ビットまで性能を絞り出す必要がある状況であれば、LXMLサイトのベンチマークがそれを示しています。

  • XMLのシリアライズ(生成)においては、明らかにLXMLが勝っている
  • 適切な親トラバースを実装する副作用として、LXMLはcElementTreeよりもパースが少し遅くなります。