こんにちは、挑戦するエンジニア のり ですよ。
みなさんは、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を書き込めることで、いろいろな処理を構築出来るといいですね。
それでは、今日の解説はこのへんで。
またのお越しをお待ちしております。