PythonでXMLファイルから特定のノードを取得する方法|XPathの使い方を解説
Pythonの標準ライブラリ xml を使えば、XMLファイルから任意のノードを自由に取得できます。ただし、目的のノードをピンポイントで抽出するには、XPathというパス指定言語の使い方を理解しておく必要があります。
XPathは、XML文書内の要素や属性を階層構造をもとに指定するための記法です。基本構文については、W3SchoolsのXPathチュートリアルが分かりやすくおすすめです。
サンプルXMLの例
ここでは、次のような構造を持つXMLファイル(my_file.xml)を例に考えてみましょう。
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
lang属性が「en」のtitleノードをすべて取得する
このXMLから、lang属性が en になっているすべての <title> ノードを抽出したい場合は、XPathの条件指定 [@lang='en'] を使って次のように書けます。
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
root = tree.parse("my_file.xml")
# .// で全階層から条件に合うtitleノードを検索
for node in root.findall(".//title[@lang='en']"):
print(node.text)
実行結果
Everyday Italian Harry Potter
コードのポイント解説
tree.parse("my_file.xml"):XMLファイルを読み込み、ルート要素(ここでは<bookstore>)を返します。.//title[@lang='en']:先頭の.//は「現在の要素より下の全階層」を意味します。属性値での絞り込みは[属性名='値']の形式で指定します。node.text:<title>要素のテキスト内容を直接取得できます。
注意点
古いサンプルコードでは子要素を列挙するために getchildren() が使われることがありますが、このメソッドはPython 3.9以降で削除されています。また、findall() で絶対パス形式の //title を指定するとエラーになる場合があるため、相対パスの .//title を使うのが安全です。
より高度な検索(名前空間対応や複雑な条件指定など)を行いたい場合は、サードパーティ製の lxml ライブラリを使うと、完全なXPath 1.0の機能を利用できます。
-
Python 3のtkinterでファイルダイアログから文字列(ファイルパス)を取得する方法
tkinterアプリケーションでファイルシステムを操作したい場合には、filedialogモジュールを利用します。このモジュールは、システム上のファイルを扱うための仕組みを提供しており、さまざまな種類のファイルダイアログを簡単に作成できる組み込み関数を多数備えています。用途に応じて任意のfiledialog関数を選択し、アプリケーションに組み込むことが可能です。中でも最もよく使われているのがfiledialog.askopenfilename()です。この関数を呼び出すと、ユーザーにファイルを開かせるためのダイアログが表示され、選択されたファイルのパスを文字列として受け取ることができます。サン
-
PythonのTkinterでポップアップダイアログを表示する方法【messagebox活用ガイド】
Tkinterは、GUIベースのアプリケーションを作成・開発するためのPython標準ライブラリです。Tkinterを使えばアプリケーションを構築し、さまざまなウィジェットを追加することで、よりインタラクティブな画面を作ることができます。ここでは、アプリケーション内でポップアップダイアログを表示する方法を紹介します。この場合に役立つのが、tkinterに組み込まれているmessageboxモジュールです。messageboxを使うと、エラーメッセージ、情報ボックス、確認ダイアログなど、さまざまな種類のダイアログボックスを簡単に表示できます。サンプルコード以下の例では、クリックすると画面上にポッ