PythonのElementTree XML API入門:XMLファイルの作成・解析・編集方法
XML(Extensible Markup Language:拡張マークアップ言語)は、HTMLによく似たマークアップ言語です。移植性が高く、SQLデータベースを使わずに小規模〜中規模のデータを扱うのに非常に便利です。
Pythonの標準ライブラリにはxmlパッケージが含まれており、その中にElementTreeモジュールがあります。これはシンプルかつ軽量なXML処理用APIで、追加インストールなしですぐに利用できるのが大きな魅力です。
XMLは木構造(ツリー)のような階層型データ形式です。ElementTreeモジュールでは、XML文書全体を1本のツリーとして扱います。Elementクラスは、このツリー内の単一ノードを表します。XMLファイルの読み書き操作はElementTreeレベルで行い、個々のXML要素やその子要素とのやり取りはElementレベルで行います。
XMLファイルを作成する
ツリーは、ルート要素から始まり、その下に他の要素が続く階層構造です。各要素は、このモジュールのElement()関数を使って作成します。
import xml.etree.ElementTree as et
e = et.Element('name')
各要素はtag属性とattrib属性(dictオブジェクト)によって特徴付けられます。ツリーの起点となるルート要素の場合、attribは空の辞書になります。
>>> root = et.Element('employees')
>>> root.tag
'employees'
>>> root.attrib
{}
続いて、ルート要素の下に1つ以上の子要素を追加できます。さらに各子要素には、1つ以上のサブ要素を持たせることも可能です。子要素はSubElement()関数で追加し、text属性で内容を定義します。
child = et.Element("employee")
nm = et.SubElement(child, "name")
nm.text = employee.get('name')
age = et.SubElement(child, "salary")
age.text = str(employee.get('salary'))
作成した子要素は、append()関数でルートに追加します。
root.append(child)
必要な数の子要素を追加し終えたら、ElementTree()関数でツリーオブジェクトを構築します。
tree = et.ElementTree(root)
そして、ツリーオブジェクトのwrite()関数を使えば、ツリー全体の構造をバイナリファイルとして書き出せます。
f = open('employees.xml', "wb")
tree.write(f)
以下の例では、辞書項目のリストからツリーを構築しています。各辞書項目は、従業員データを表すキーと値のペアを保持しています。構築したツリーは「employees.xml」に書き込まれます。
import xml.etree.ElementTree as et
employees = [{'name': 'aaa', 'age': 21, 'sal': 5000},
{'name': 'xyz', 'age': 22, 'sal': 6000}]
root = et.Element("employees")
for employee in employees:
child = et.Element("employee")
root.append(child)
nm = et.SubElement(child, "name")
nm.text = employee.get('name')
age = et.SubElement(child, "age")
age.text = str(employee.get('age'))
sal = et.SubElement(child, "sal")
sal.text = str(employee.get('sal'))
tree = et.ElementTree(root)
with open('employees.xml', "wb") as fh:
tree.write(fh)
生成された「employees.xml」は、カレントワーキングディレクトリに保存されます。
<employees>
<employee>
<name>aaa</name>
<age>21</age>
<sal>5000</sal>
</employee>
<employee>
<name>xyz</name>
<age>22</age>
<sal>6000</sal>
</employee>
</employees>
XMLファイルを解析する
次に、先ほど作成した「employees.xml」を読み戻してみましょう。このために、ElementTreeモジュールの以下の関数を使用します。
ElementTree() — オーバーロードされた関数で、要素の階層構造を読み込んでツリーオブジェクトとして返します。
tree = et.ElementTree(file='employees.xml')
getroot() — ツリーのルート要素を返します。
root = tree.getroot()
getchildren() — ある要素の1階層下にあるサブ要素のリストを返します。
children = root.getchildren()
なお、getchildren()はPython 3.9以降で非推奨(削除済み)となっているため、新しい環境ではlist(root)やroot.findall()を使うのがおすすめです。
以下の例では、「employees.xml」の要素とサブ要素を解析し、辞書項目のリストへ変換しています。
import xml.etree.ElementTree as et
tree = et.ElementTree(file='employees.xml')
root = tree.getroot()
employees = []
children = list(root)
for child in children:
employee = {}
pairs = list(child)
for pair in pairs:
employee[pair.tag] = pair.text
employees.append(employee)
print(employees)
出力
[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]
XMLファイルを修正する
既存のXMLファイルを編集する場合は、Elementクラスのiter()関数が便利です。この関数は、現在の要素をルートとして指定タグに対するツリーイテレータを作成します。イテレータは、ドキュメント順(深さ優先)で対象要素とその下位のすべての要素を順番に走査します。
例として、すべての「sal」サブ要素に対してイテレータを作成し、各salタグのテキスト値を100ずつ増やしてみましょう。
import xml.etree.ElementTree as et
tree = et.ElementTree(file='employees.xml')
root = tree.getroot()
for x in root.iter('sal'):
s = int(x.text)
s = s + 100
x.text = str(s)
with open("employees.xml", "wb") as fh:
tree.write(fh)
これで「employees.xml」の給与データがすべて100増加した状態で更新されます。
また、set()メソッドを使えば、特定のキー(属性)の値を更新することもできます。
x.set(marks, str(mark))
まとめ
Pythonのxml.etree.ElementTreeモジュールを使えば、外部ライブラリを追加することなく、XMLファイルの作成・読み込み・編集をすべて実現できます。軽量なデータ交換や設定ファイルの管理など、SQLデータベースを導入するほどではないケースで、ぜひ活用してみてください。
-
PythonでXMLを解析・編集・生成する方法|ElementTree APIの使い方を徹底解説
Pythonの標準ライブラリに含まれるXMLパーサーは、XMLファイルから必要な情報を読み取り、抽出するための最も手軽な手段のひとつです。このチュートリアルでは、xml.etree.ElementTree(ElementTree XML API)を使って、XMLファイルの「解析」「編集」「新規作成」を行う方法を、実際のコード例とともにわかりやすく解説します。 ElementTreeは、XMLデータの抽出・解析・変換をシンプルに実現できるAPIであり、外部ライブラリをインストールすることなくすぐに使い始められるのが大きな魅力です。 それでは、さっそくElementTreeを使ったPythonのX
-
Pythonデバッガー(pdb)の使い方を徹底解説!基本コマンドからブレークポイントまで
Pythonデバッガー(pdb)とはソフトウェア開発の分野では、プログラム内のエラー(バグ)を発見し修正するプロセスを「デバッグ」と呼びます。Pythonの標準ライブラリにはpdbモジュールが含まれており、これはPythonプログラムをデバッグするための一連のユーティリティを提供します。デバッグ機能はPdbクラスとして定義されており、このモジュールは内部的にbdbおよびcmdモジュールを利用しています。コマンドラインからの起動方法pdbモジュールには非常に便利なコマンドラインインターフェースが用意されています。Pythonスクリプトの実行時に-mスイッチを使ってインポートすることで、デバッガー