Python
 Computer >> コンピューター >  >> プログラミング >> Python

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データベースを導入するほどではないケースで、ぜひ活用してみてください。

  1. PythonでXMLを解析・編集・生成する方法|ElementTree APIの使い方を徹底解説

    Pythonの標準ライブラリに含まれるXMLパーサーは、XMLファイルから必要な情報を読み取り、抽出するための最も手軽な手段のひとつです。このチュートリアルでは、xml.etree.ElementTree(ElementTree XML API)を使って、XMLファイルの「解析」「編集」「新規作成」を行う方法を、実際のコード例とともにわかりやすく解説します。 ElementTreeは、XMLデータの抽出・解析・変換をシンプルに実現できるAPIであり、外部ライブラリをインストールすることなくすぐに使い始められるのが大きな魅力です。 それでは、さっそくElementTreeを使ったPythonのX

  2. Pythonデバッガー(pdb)の使い方を徹底解説!基本コマンドからブレークポイントまで

    Pythonデバッガー(pdb)とはソフトウェア開発の分野では、プログラム内のエラー(バグ)を発見し修正するプロセスを「デバッグ」と呼びます。Pythonの標準ライブラリにはpdbモジュールが含まれており、これはPythonプログラムをデバッグするための一連のユーティリティを提供します。デバッグ機能はPdbクラスとして定義されており、このモジュールは内部的にbdbおよびcmdモジュールを利用しています。コマンドラインからの起動方法pdbモジュールには非常に便利なコマンドラインインターフェースが用意されています。Pythonスクリプトの実行時に-mスイッチを使ってインポートすることで、デバッガー