XML_Edit3.py 技術ドキュメント

プログラムの動作

XML_Edit3.py は、Pythonの tkinter GUIライブラリと xml.etree.ElementTree ライブラリを使用して、XMLファイルを視覚的に表示し、その内容を編集して新しいファイルとして保存するためのデスクトップアプリケーションです。

主な機能は以下の通りです。

  • XMLファイルの表示: 指定されたXMLファイルを解析し、階層構造を持つツリービューとしてGUI上に表示します。各XML要素のタグ、属性、およびテキスト値が表示されます。

  • 要素値の編集: ツリービューに表示されたXML要素のテキスト値をダブルクリックすることで、ポップアップダイアログを通じて編集できます。

  • 編集内容の保存: 編集されたXMLツリーを新しいXMLファイルとして保存します。

このプログラムは、XMLファイルを直接テキストエディタで開いて編集する手間を省き、視覚的な操作でXMLデータを簡単に閲覧・変更したいという課題を解決します。特に、構造が複雑なXMLファイルや、特定の要素の値だけを変更したい場合に有用です。

原理

XML_Edit3.py は、以下の主要な原理とアルゴリズムに基づいて動作します。

  1. XML解析: プログラムは xml.etree.ElementTree モジュールを使用してXMLファイルを解析します。ET.parse(file_path) によりXMLファイルが解析され、XML文書全体を表す ElementTree オブジェクトが生成されます。そこから tree.getroot() を呼び出すことで、XML文書のルート要素が取得されます。このルート要素から、子要素、属性、テキスト値などにアクセスできます。

  2. GUI構築 (tkinter): tkintertkinter.ttk モジュールを使用して、ユーザーインターフェースが構築されます。

    • メインウィンドウ (tk.Tk) が作成され、タイトルとサイズが設定されます。

    • ttk.Treeview ウィジェットがXMLの階層構造を表示するために使用されます。Treeview は、データの階層的な表示に適しており、各アイテムがXML要素に対応します。

    • Treeview の各アイテムは、XML要素のタグを #0 列に、要素のテキスト値を Value 列に表示します。要素の属性は、その要素の子アイテムとして表示されます。

  3. XMLのツリービューへの表示アルゴリズム: display_element メソッドは再帰的にXML要素を走査し、Treeview に挿入します。

    • 現在のXML要素のタグとテキスト値を基に、tree.insert で新しいアイテムが Treeview に追加されます。

    • 現在の要素が持つ属性は、f"{key}: {value}" の形式で、その要素の子アイテムとして追加されます。

    • 各子XML要素に対して、display_element が再帰的に呼び出され、階層的な表示が実現されます。

  4. 要素値の編集アルゴリズム:

    • ユーザーが TreeviewValue 列のアイテムをダブルクリックすると、edit_cell メソッドがイベントを捕捉します。

    • 選択されたアイテムの現在の値を取得し、tk.Toplevel で新しい編集ウィンドウ (edit_window) を作成します。

    • この編集ウィンドウには、現在の値を初期値とする tk.Entry ウィジェットと、「Save」ボタンが含まれます。

    • 「Save」ボタンがクリックされると、save_cell_edit メソッドが呼び出され、Treeview 内の該当アイテムの Value 列が新しい値で更新されます。

  5. XML保存アルゴリズム:

    • 「Save XML」ボタンがクリックされると、save_xml メソッドが実行されます。

    • update_xml メソッドが呼び出され、Treeview の現在の状態(編集によって変更された値を含む)に基づいて、メモリ上のXMLツリー (self.root_element) を更新しようと試みます。具体的には、Treeviewの各アイテムのvaluesに基づいてXML要素のtext属性を更新します。

    • 更新されたXMLツリーは ET.tostring() によってバイト列に変換されます。

    • 変換されたバイト列は、edited.xml という名前のファイルに書き込まれ、保存されます。

必要な非標準ライブラリとインストール方法

XML_Edit3.py プログラムは、Pythonの標準ライブラリのみを使用しており、tkinter, xml.etree.ElementTree, sys はいずれもPythonの標準インストールに含まれています。 そのため、追加でインストールが必要な非標準ライブラリはありません。

必要な入力ファイル

プログラムは、有効なXMLファイルを読み込むことを期待しています。

  • ファイル名: コマンドライン引数で指定されなかった場合、デフォルトではプログラムの実行ディレクトリの親ディレクトリにある XML フォルダ内の vasprun.xml というファイルを読み込もうとします。 例: ../XML/vasprun.xml

  • ファイル形式: XML 1.0 勧告に準拠した形式である必要があります。不正なXML形式の場合、xml.etree.ElementTree.ParseError が発生し、プログラムはエラーメッセージを出力して終了する可能性があります。

  • データ構造: 特定のスキーマやDTDに準拠している必要はありません。任意の有効なXML構造を受け入れ、その階層構造をGUIに表示します。

生成される出力ファイル

プログラムは、GUI上で編集された内容を反映した新しいXMLファイルを生成します。

  • ファイル名: プログラムを実行したカレントディレクトリに edited.xml という名前で保存されます。

  • 内容: XML_Edit3.py のGUI上でユーザーが要素のテキスト値を編集した場合、その変更が反映されたXML構造がバイト列としてファイルに書き込まれます。 保存されるXMLはUTF-8エンコーディングで記述されます。

コマンドラインでの使用例 (Usage)

XML_Edit3.py は、以下の形式でコマンドラインから実行できます。

python XML_Edit3.py [XML_FILE_PATH] [WINDOW_SIZE]
  • [XML_FILE_PATH] (オプション): 読み込むXMLファイルのパスを指定します。パスが指定されない場合、デフォルトで ../XML/vasprun.xml が使用されます。

  • [WINDOW_SIZE] (オプション): GUIウィンドウの初期サイズを 幅x高さ の形式で指定します(例: 800x600)。サイズが指定されない場合、デフォルトで 800x600 が使用されます。

コマンドラインでの具体的な使用例

1. デフォルト設定での実行

python XML_Edit3.py

実行結果の説明: このコマンドは、../XML/vasprun.xml (デフォルトのファイルパス)を読み込み、800x600 (デフォルトのウィンドウサイズ)のGUIウィンドウを表示します。ウィンドウには、vasprun.xml の内容がツリービュー形式で階層的に表示されます。ユーザーは任意の要素のテキスト値をダブルクリックして編集し、「Save XML」ボタンをクリックすることで、変更内容を edited.xml として保存できます。

2. 特定のXMLファイルを指定して実行

python XML_Edit3.py my_data.xml

実行結果の説明: このコマンドは、カレントディレクトリにある my_data.xml ファイルを読み込み、800x600 (デフォルトのウィンドウサイズ)のGUIウィンドウを表示します。my_data.xml の内容が表示され、同様に編集および保存が可能です。

3. XMLファイルとウィンドウサイズの両方を指定して実行

python XML_Edit3.py another_data.xml 1024x768

実行結果の説明: このコマンドは、カレントディレクトリにある another_data.xml ファイルを読み込み、1024x768 のGUIウィンドウを表示します。指定されたXMLファイルの内容が、指定されたサイズのウィンドウで表示され、ユーザーはGUIを通じてデータを編集し、最終的に edited.xml として保存できます。


注意: プログラム実行時、指定したXMLファイルが存在しない場合や、XML形式が不正な場合は、エラーメッセージがコンソールに出力され、プログラムが正常に動作しない可能性があります。