Web APIのレスポンスや設定ファイルの管理など、データの受け渡しにおいてXML形式(Extensible Markup Language)を扱う機会は今でも数多く存在します。
JSONが主流となりつつある現代でも、金融システムや古い形式の業務アプリケーション、RSSフィードなど、XMLは現役で活躍し続けている重要なデータ形式です。
この記事では、Pythonの標準ライブラリであるxml.etree.ElementTree(ET)を使ったXMLの読み込み方法を徹底解説します。
基本的なファイル読み込みから、PythonでXPathを活用してデータを抽出する手法、さらにはデータの編集や出力方法まで、現場で役立つ知識を詳しく紐解いていきましょう。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
PythonでのXML読み込み・パースの基本
PythonにはXMLを処理するためのライブラリがいくつかありますが、最も汎用性が高く、環境構築の手間がないのがPythonに標準で備わっているXMLライブラリである xml.etree.ElementTree です。
軽量で高速な動作が特徴であり、外部パッケージをインストールすることなくすぐに開発を始められます。
ここでは、ローカルに保存されたファイルを読み込む手順と、APIレスポンスなどで受け取った文字列データをパースする手順の2パターンを確認しましょう。
ElementTree(ET)を使った基本的なファイル読み込み手順
ローカルにある .xml ファイルを読み込み、データの根っこ(ルート要素)を取得する最も標準的なコードです。
import xml.etree.ElementTree as ET
# 1. XMLファイルを読み込んでツリー構造を作成
# sample.xml というファイルが存在すると仮定します
try:
tree = ET.parse('sample.xml')
root = tree.getroot()
# ルート要素のタグ名と属性を表示
print(f"ルートタグ: {root.tag}")
print(f"ルート属性: {root.attrib}")
except FileNotFoundError:
print("ファイルが見つかりませんでした。")
except ET.ParseError:
print("XMLの解析に失敗しました(構文エラーなど)。")
実行結果の例
ルートタグ: inventory
ルート属性: {'location': 'Tokyo'}
まず import xml.etree.ElementTree as ET と記述して、機能を短い名前で呼び出せるようにしています。
ET.parse() メソッドは、指定されたパスにあるファイルを解析し、メモリ上にツリー構造を構築する役割を担います。
その後、tree.getroot() を呼び出すことで、XMLの階層構造の頂点にある「ルート要素」を取得しています。
これによって、XML全体に対して探索や抽出を行うための準備が整ったことになります。
実務ではファイルが壊れているリスクに備え、上記のように try-except 文でエラーハンドリングを行うのが定石です。
PythonでXMLの文字列データを読み込む手順
ファイルからではなく、変数に格納された文字列から直接パースしたい場合は fromstring() メソッドを使用します。
import xml.etree.ElementTree as ET
# XML形式の文字列
xml_string = """
<data>
<user id="001">
<name>田中</name>
<city>東京</city>
</user>
</data>
"""
# 文字列からパースして直接ルート要素を取得
root = ET.fromstring(xml_string)
# 内容の確認
for user in root:
name = user.find('name').text
print(f"ユーザー名: {name}")
実行結果の例
ユーザー名: 田中
ET.fromstring() は、引数として渡された文字列を直接読み取り、解析後のルート要素を返します。
このメソッドは、requests ライブラリなどを使ってWebサイトから取得したXMLレスポンスを処理する際に非常に重宝する機能と言えるでしょう。
この例では、取得した root 要素をループで回し、内部にある name タグを探してその中のテキストを抽出しています。
文字列からパースを開始できるため、一時ファイルを作成する手間を省き、メモリ上でスマートに処理を完結させることが可能です。
特定のタグ指定やテキスト抽出のテクニック
XMLを読み込んだ後に必要となるのは、膨大なデータの中から「必要な情報だけをピンポイントで取り出す」作業です。
単なるループ処理だけでなく、特定の条件を指定して検索する手法をマスターすることで、複雑な構造のXMLでも自由自在に扱えるようになります。
ここでは、特定の要素を探し出すための基本的なメソッドと、PythonからXPathを利用した高度な抽出テクニックについて解説します。
find / findall によるタグ指定と検索
ElementTreeには、条件に合う要素を探すための直感的なメソッドが備わっています。
# root要素から特定の条件で検索する例
# 1. 最初に見つかった「user」タグを取得
user = root.find('user')
# 2. すべての「user」タグをリストで取得
users = root.findall('user')
for u in users:
# 属性(attribute)の取得
user_id = u.get('id')
# 子要素のテキスト取得
user_name = u.find('name').text
print(f"ID: {user_id}, Name: {user_name}")
find() メソッドは、指定したタグ名を持つ要素のうち、最初に出現するものだけを返します。
一つしかないことが分かっている要素へのアクセスに最適です。
対して findall() は、一致するすべての要素をリスト形式で取得するため、一覧データの処理に向いています。
要素の中身を取得する際は、.text プロパティでタグに囲まれた文字列を取り出し、.get('属性名') でタグ内に記述された属性値を取得するという使い分けが必要です。
PythonでXML内のテキスト情報を抽出する際、これらのメソッドを組み合わせることで、データの欠落を防ぎながら正確に情報を収集できます。
XPathを活用した高度なデータ抽出
さらに複雑な条件、例えば「特定の階層にある要素」や「属性値が一致するもの」などを抽出したい場合には、XPath(エックスパス)形式の記述が威力を発揮します。
# 1. 全階層から「city」タグをすべて検索(//)
all_cities = root.findall('.//city')
# 2. 属性「id」が "001" である user タグを検索
specific_user = root.find("./user[@id='001']")
if specific_user is not None:
print(f"ID 001の居住地: {specific_user.find('city').text}")
ElementTreeは限定的ではありますが、XPathというパス記述言語の記法をサポートしています。
.// というプレフィックスを使うことで、現在の階層だけでなく子孫要素をすべて再帰的に探索して目的のタグを見つけ出すことが可能になります。
また、[@属性名='値'] という記述を加えることで、特定の属性を持つ要素を絞り込んで取得できる点は非常に強力です。
これにより、膨大なリストの中から特定のIDを持つレコードだけを瞬時に特定できるようになります。
XPathを活用すれば、階層構造を一つずつ辿る冗長なコードを書く必要がなくなり、可読性の高いスクリプトへと進化するはずです。
XMLデータの編集とファイル出力方法
XMLの操作は読み込みだけではありません。
既存のデータに新しい要素を足したり、間違った情報を書き換えたりといったPythonを使ってXMLを編集・加工する手順を必要とする場面も多いでしょう。
最後に、加工したデータを再びファイルとして保存する一連の流れを確認しておきましょう。
ElementTreeを使えば、ツリー構造を維持したまま直感的に要素の追加や削除、更新を行うことができます。
要素の追加・属性の書き換えと出力
既存のXML構造に対して、新しいユーザー情報を追加し、それをファイルに書き出してみます。
import xml.etree.ElementTree as ET
# 既存のXML(root)に対して新しい要素を作成
new_user = ET.SubElement(root, 'user', attrib={'id': '002'})
new_name = ET.SubElement(new_user, 'name')
new_name.text = "鈴木"
new_city = ET.SubElement(new_user, 'city')
new_city.text = "大阪"
# 既存の属性を書き換える
root.find("./user[@id='001']").set('status', 'active')
# 編集した内容をファイルへ保存
# xml_declaration=True で先頭にXML宣言を追加
tree = ET.ElementTree(root)
tree.write('updated_data.xml', encoding='utf-8', xml_declaration=True)
ET.SubElement() を使用すると、指定した親要素の直下に新しい子要素を追加できます。
第3引数の attrib を使えば、生成と同時に属性を設定することも可能です。
また、既存の要素に対して .set() メソッドを呼ぶことで、後から属性値を追加したり変更したりできる柔軟性も備えています。
データの加工が完了したら、最後に tree.write() を実行してファイルに出力します。
ここで encoding='utf-8' を指定し、xml_declaration=True とすることで、日本語を正しく扱い、かつ「これはXMLファイルです」という宣言をファイルの冒頭に加えた正しい形式での保存が完了します。
PythonでのXML出力処理において、この保存オプションを適切に設定することは、他のシステムで読み込む際のトラブルを防ぐために極めて重要なステップと言えるでしょう。
Pythonのスキルを活かして年収を上げる方法
以上、PythonでのXML読み込みやパース方法について解説してきました。
Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



