XMLView.py 技術ドキュメント
プログラムの動作
XMLView.py は、Pythonの標準ライブラリ tkinter および xml.etree.ElementTree を使用して、XMLファイルをグラフィカルユーザーインターフェース (GUI) 上でツリービュー形式で表示するアプリケーションです。
このプログラムの主な目的は、大規模なXMLファイルの構造を視覚的に理解しやすくすることです。特に、テキストエディタで直接開くと内容が膨大で把握しにくいXMLファイル(例: 計算結果を格納した vasprun.xml など)の階層構造、タグ、属性、およびテキスト内容を効率的に閲覧できるようになります。
主な機能は以下の通りです。
指定されたXMLファイルを解析し、その階層構造をツリービューとして表示します。
各XML要素のタグ、
name属性(存在する場合)、テキスト内容、およびその他の属性をツリービューのノードとして表示します。ウィンドウのサイズはコマンドライン引数で指定できるほか、終了時のサイズが設定ファイル (
XMLView.ini) に保存され、次回起動時に自動的に復元されます。XMLファイルの解析エラーやファイルが見つからない場合は、適切なエラーメッセージを表示します。
原理
XMLView.py は、以下の原理に基づいて動作します。
GUIフレームワーク:
tkinterライブラリを用いてウィンドウアプリケーションを構築します。特に、階層表示にはttk.Treeviewウィジェットを利用し、XMLのツリー構造をGUI上で再現します。XML解析:
xml.etree.ElementTree(ET) モジュールを使用してXMLファイルを解析します。ET.parse()メソッドはXMLファイルを解析し、ElementTreeオブジェクトを返します。このオブジェクトのgetroot()メソッドにより、XMLドキュメントのルート要素が取得できます。XMLドキュメントは、このルート要素から子要素へと続くツリー構造として扱われます。ツリービューの構築:
XMLViewerクラスのread_xmlメソッド内で、ルート要素を取得した後、display_elementメソッドを呼び出します。display_elementメソッドは再帰的に呼び出され、XMLツリーの各要素をttk.Treeviewのノードとして挿入します。各XML要素について、以下の情報を表示します。
メインのテキスト表示: 優先順位として、
name属性の値、次に要素のテキスト内容、最後にタグ名を使用します。これらのいずれも存在しない場合は「root」と表示します。詳細情報: タグ名、テキスト内容、およびすべての属性は、メインノードの子ノードとして表示されます。
ツリーの展開状態: デフォルトでは、階層レベル
$level$が1以下のノードは展開された状態で表示され、それ以降のノードは折りたたまれた状態で表示されます。これにより、大規模なXMLでも最初の数階層だけを開いて概要を把握しやすくなっています。
設定の保存と読み込み:
tomlライブラリを使用して、ウィンドウのジオメトリ(サイズと位置)情報をTOML形式で設定ファイルに保存します。設定ファイル名はXMLView.pyと同じディレクトリにXMLView.iniとして生成されます。プログラム起動時にこの設定ファイルを読み込み、以前のウィンドウサイズを復元します。
コマンドライン引数の処理:
sys.argvを利用して、コマンドラインから入力XMLファイルのパスとウィンドウサイズを引数として受け取ります。これにより、柔軟なファイル指定と初期表示サイズの制御が可能になります。
必要な非標準ライブラリとインストール方法
このプログラムは、以下の非標準ライブラリを使用します。
toml: TOML (Tom's Obvious, Minimal Language) 形式の設定ファイルを読み書きするために使用されます。
インストール方法:
toml ライブラリは、Pythonのパッケージ管理ツール pip を使ってインストールできます。
pip install toml
必要な入力ファイル
ファイル形式: 有効なXMLファイル。
データ構造: XMLの標準的な階層構造を持つファイルであれば、どのようなものでも解析・表示が可能です。プログラム内で例として
../XML/vasprun.xmlが挙げられており、VASPなどの計算結果を格納したXMLファイルを想定しています。
生成される出力ファイル
ファイル名:
XMLView.ini保存場所:
XMLView.pyスクリプトと同じディレクトリに生成されます。内容: TOML形式で、プログラム終了時のウィンドウのジオメトリ(サイズと位置)情報が保存されます。
例:
geometry = "800x600+100+50"
(
WIDTHxHEIGHT+XOFFSET+YOFFSETの形式)
コマンドラインでの使用例 (Usage)
基本的な実行コマンドと引数は以下の通りです。
python XMLView.py <infile> [window_size]
<infile>: 表示するXMLファイルのパス。必須引数です。[window_size]: ウィンドウの初期サイズを指定するオプション引数です。WIDTHxHEIGHTの形式で指定します(例:800x600,1024x768)。この引数を省略した場合、設定ファイル (XMLView.ini) に保存されたサイズが使用されるか、デフォルトの800x600が適用されます。
コマンドラインでの具体的な使用例
1. デフォルト設定での実行
指定したXMLファイルを、設定ファイルに保存されたサイズまたはデフォルトサイズで開きます。
python XMLView.py ../XML/vasprun.xml
実行結果の説明:
../XML/vasprun.xml ファイルの内容が、ウィンドウアプリケーションとして表示されます。ウィンドウサイズは、以前にプログラムを閉じた際に XMLView.ini に保存されたサイズが適用されるか、初めての実行であれば 800x600 のデフォルトサイズで開かれます。ツリービューでは、ルート要素とその直下の子要素までが展開され、それ以降の階層は折りたたまれた状態で表示されます。
2. ウィンドウサイズを指定して実行
指定したXMLファイルを、特定のウィンドウサイズで開きます。
python XMLView.py my_data.xml 1024x768
実行結果の説明:
my_data.xml ファイルの内容が、幅1024ピクセル、高さ768ピクセルのウィンドウで表示されます。このウィンドウサイズは、プログラム終了時に XMLView.ini に保存され、次回起動時に引数で明示的に指定しない限り、このサイズが使用されます。
3. 存在しないファイルを指定した場合
存在しないXMLファイルのパスを指定した場合のエラーハンドリングです。
python XMLView.py non_existent.xml
実行結果の説明: コマンドラインに以下のようなエラーメッセージが表示されます。
Error: Can not find [non_existent.xml]
Press ENTER to terminate>>
ユーザーが Enter キーを押すと、プログラムは終了します。GUIウィンドウは表示されません。