PythonでXMLファイルを書き込む方法~コーディングのコツ~

PythonでXMLファイルを書き込む方法~コーディングのコツ~

こんにちは、挑戦するエンジニア のり ですよ。

みなさんは、Pythonのプログラムを作るときに、XMLファイルを扱うことってありませんか?
XMLファイルはTEXT形式のファイルですが、ライブラリの使い方がわからないと大変ですよね。

今回は、PythonでXMLファイルを書き込む方法を解説します。

目次

始めに

この記事では、PythonのプログラムでXMLファイルを作成する方法を解説します。

この記事を読んでいただくことで、PythonのプログラムでXMLファイルを作成する方法を知っていただくことが出来ます。

筆者の環境(Windows11 23H2、Python3.12)での手順を紹介します。
また、使用するライブラリはPython3標準で使えるため追加でインストールする必要はありません。

参考にしたサイト
https://docs.python.org/ja/3/library/index.html

ぜひ、挑戦してみてください!

XMLファイルを書き込むサンプルプログラム

まず、XMLファイルの書き込みプログラムです。

from xml.dom.minidom import parseString
import xml.etree.ElementTree as ET

# ルートを作成する
root = ET.Element('root')

# 子ノードを追加
child = ET.SubElement(root,'child')
child.set('child_attrib','A')
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','a1')
grandchild.text = 'データ1'
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','a2')
grandchild.text = 'データ2'

# 子ノードを追加
child = ET.SubElement(root,'child')
child.set('child_attrib','B')
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','b1')
grandchild.text = 'データ3'
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','b2')
grandchild.text = 'データ4'

# ドキュメント形式に変換して書き込み
documentstring = ET.tostring(root, 'utf-8')
docum = parseString(documentstring)
with open('sample03.xml', 'w', encoding='utf-8') as f:
    docum.writexml(f, indent='', addindent='  ', newl='\n', encoding='utf-8')

次に、プログラムを実行して、書き込んだ結果のXMLファイルです。

<?xml version="1.0" encoding="utf-8"?>
<root>
  <child child_attrib="A">
    <grandchild grandchild_attrib="a1">データ1</grandchild>
    <grandchild grandchild_attrib="a2">データ2</grandchild>
  </child>
  <child child_attrib="B">
    <grandchild grandchild_attrib="b1">データ3</grandchild>
    <grandchild grandchild_attrib="b2">データ4</grandchild>
  </child>
</root>

それでは、サンプルプログラムの解説を見ていきましょう。

よくあるデータファイルのXMLの場合

今回のサンプルは、データファイルなどによくあるXMLの例です。(二つ目のXMLのコードを見てください)

rootのノード「root」は一意ですが、子ノード「child」は複数存在します。
また、その次のノード「grandchild」も一つの子ノードに複数存在します。

このようなタイプのXMLファイルの場合、編集、書き込みは次の手順で行います。

使用ライブラリのインポート

from xml.dom.minidom import parseString
import xml.etree.ElementTree as ET

Python3標準のライブラリから、次のライブラリをインポートします。

「parseString」
「xml.etree.ElementTree」

これを使うことで、XMLファイルの形式でデータを書き込むことができます。

ルートの作成

# ルートを作成する
root = ET.Element('root')

各ノードの元となるrootのノードを作成します。
今回は、タグ名を識別しやすくするために「root」としています。(リテラルで囲まれている部分です)

子ノードを追加

# 子ノードを追加
child = ET.SubElement(root,'child')
child.set('child_attrib','A')

rootのノードに子ノードを追加します。
今回は、タグ名を識別しやすくするために「child」としています。(リテラルで囲まれている部分です)
また、属性「child_attrib」に属性の値「A」を設定しています。

今回の一つ目のポイントです。
親ノード(ここでは「root」)とタグ名(ここでは「’child’」)を指定して、従属するノードを作成できます。

孫ノードを追加

# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','a1')
grandchild.text = 'データ1'
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','a2')
grandchild.text = 'データ2'

子ノードに孫ノードを追加します。

今回は、タグ名を識別しやすくするために「grandchild」としています。(リテラルで囲まれている部分です)
子ノードも孫ノードも同じタグ名で複数作成することが出来ます。

また、属性「grandchild_attrib」に属性の値「a1」(1回目)、「a2」(2回目)を設定しています。
そして、データには「データ1」(1回目)、「データ2」(2回目)を設定しています。

今回の二つ目のポイントです。
データの内容は、ノードの値「text」に設定しましょう。

2回目の子ノードと孫ノードの追加

# 子ノードを追加
child = ET.SubElement(root,'child')
child.set('child_attrib','B')
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','b1')
grandchild.text = 'データ3'
# 孫ノードを追加
grandchild = ET.SubElement(child,'grandchild')
grandchild.set('grandchild_attrib','b2')
grandchild.text = 'データ4'

さらに、子ノード、孫ノードを追加します。

この時、わかりやすいように値を変えています。
ループさせるなど処理を工夫することで、子ノードと孫ノードのセットを複数作成することができます。

ドキュメント形式への変換と書き込み

# ドキュメント形式に変換して書き込み
documentstring = ET.tostring(root, 'utf-8')
docum = parseString(documentstring)
with open('sample03.xml', 'w', encoding='utf-8') as f:
    docum.writexml(f, indent='', addindent='  ', newl='\n', encoding='utf-8')

最後にrootの情報を文字コード「utf-8」に変換し、ドキュメント型に翻訳してXMLとしてファイルに書き込みます。

ちなみに書き込みメソッド「writexml」の各引数は次の通りです。

  • 「indent」は現在ノードにインデントする文字列を指定します。
  • 「addindent」は現在のノードの下にサブノードを追加する際のインデント増分を指定します。rootのノードの場合、子ノード、孫ノードと順にインデントされます。
  • 「newl」は改行時に行の最後に編集する文字を指定します。「\n」と書いておくと、筆者の環境では改行コードCrLfが書き込まれました。
  • 「encoding」は書き込み時の文字コードを指定します。今回は、文字コード「utf-8」に統一しています。

今回の三つ目のポイントです。
「書き込み」をして、はじめてXMLファイルになります。

それでは、最後のまとめです。

まとめ

今回は、PythonでXMLファイルを書き込む方法について解説しました。
XMLを書き込めることで、いろいろな処理を構築出来るといいですね。

それでは、今日の解説はこのへんで。
またのお越しをお待ちしております。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次