XML_Edit.py 技術ドキュメント

プログラムの動作

XML_Edit.py は、PythonのTkinterライブラリを使用して構築されたグラフィカルユーザーインターフェース (GUI) アプリケーションです。このプログラムの主な目的は、XMLファイルの内容を視覚的に表示し、ユーザーがそのXMLデータを直接編集できるようにすることです。

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

  • XMLファイルの読み込み: 起動時に指定された、またはデフォルトのXMLファイルを読み込みます。

  • ツリービュー表示: 読み込んだXMLファイルの階層構造を、Treeviewウィジェットを用いて視覚的に表示します。各XML要素のタグと属性がツリー形式で表示されます。

  • 編集モードへの切り替え: 「Edit XML」ボタンをクリックすると、表示モードから編集モードへ切り替わります。編集モードでは、XMLデータの生のテキストがTextウィジェットに表示され、ユーザーは直接そのテキストを編集できます。

  • 編集内容の保存と更新: 編集モード中に「Save XML」ボタンをクリックすると、Textウィジェット内のXMLテキストが解析され、プログラム内部のXMLツリー構造が更新されます。新しいXML構造はTreeviewに再表示され、編集モードが終了します。XMLテキストの解析中に構文エラーが発生した場合、エラーメッセージがポップアップ表示され、編集モードは継続されます。

  • コマンドライン引数による設定: 読み込むXMLファイルのパスや、アプリケーションウィンドウの初期サイズをコマンドライン引数で指定できます。

このプログラムは、XML構造を簡単に確認したり、手動でXMLデータを修正したりする際に役立ちます。

原理

XML_Edit.py は、主に以下の2つのPython標準ライブラリの機能を利用して動作します。

  1. xml.etree.ElementTree (ET): XMLデータの解析、操作、および文字列への変換を行います。

    • XMLファイルの読み込み: ET.parse(file_path) メソッドを使用して、指定されたXMLファイルを解析し、ElementTree オブジェクトを生成します。その後、tree.getroot() メソッドでXMLドキュメントのルート要素を取得し、以降の操作の基点とします。

    • XML構造のトラバース: display_element メソッドは再帰的に呼び出され、XMLツリーのルート要素から順にすべての子要素を処理します。これにより、XMLの階層構造全体をTreeviewに表示するための情報が抽出されます。

    • XML文字列への変換: 編集モードに入る際、ET.tostring(self.root_element).decode() を使用して、現在のXMLツリー(Element オブジェクト)を整形されたXML文字列に変換し、Textウィジェットに表示します。.decode() はバイト文字列を通常の文字列に変換するために必要です。

    • XML文字列からの解析: 編集内容を保存する際、Textウィジェットから取得したXML文字列を ET.fromstring(edited_xml) メソッドで解析し、新しいXMLツリーを構築します。この際、XMLの構文チェックも行われます。

  2. tkinter (Tkinter): GUIの構築とイベント処理を行います。

    • ウィンドウとウィジェット: tk.Tk() でメインウィンドウを作成し、ttk.Treeview でXML構造を表示、tk.Text でXMLの生データを表示・編集、tk.Button でモード切り替えのトリガーを提供します。

    • イベントハンドリング: ボタンのクリックイベントに toggle_edit_mode メソッドをバインドすることで、ユーザーアクションに応じた処理を実行します。

    • レイアウト管理: pack() メソッドを使用してウィジェットをウィンドウ内に配置し、grid_remove()grid() を使用してウィジェットの表示・非表示を切り替えます。

    • エラー表示: messagebox.showerror() を使用して、XML解析エラーなどの重要な情報をユーザーにポップアップ表示します。

プログラムは、これらのライブラリを組み合わせて、XMLデータの内部表現(Element オブジェクト)とユーザーインターフェース(Treeview、Textウィジェット)間の同期を管理し、視覚的な表示と直接編集の両方を提供します。

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

このプログラム XML_Edit.py は、Pythonの標準ライブラリのみを使用しており、非標準ライブラリは一切必要ありません。したがって、追加のインストール作業は不要です。

Pythonがインストールされていれば、そのまま実行できます。

必要な入力ファイル

このプログラムは、以下の要件を満たすXMLファイルを入力として必要とします。

  • ファイル形式: 整形式 (well-formed) なXMLドキュメントであること。XMLの構文規則に準拠している必要があります。

  • デフォルトパス: コマンドライン引数で指定しない場合、プログラムはデフォルトで現在のスクリプトファイルが存在するディレクトリの親ディレクトリにある XML/vasprun.xml というパスのファイルを読み込もうとします。 例: XML_Edit.pymy_app/ にある場合、../XML/vasprun.xmlXML/vasprun.xml となる。

  • データ構造: XMLの構造は任意ですが、xml.etree.ElementTree で解析できる有効なXMLである必要があります。

入力ファイルの例:

<configuration version="1.0">
    <settings>
        <parameter name="mode" value="normal"/>
        <option name="debug" enabled="true"/>
    </settings>
    <data>
        <entry id="A1" type="sensor">
            <value>123.45</value>
            <unit>kg</unit>
        </entry>
        <entry id="B2" type="actuator">
            <status>active</status>
        </entry>
    </data>
</configuration>

生成される出力ファイル

XML_Edit.py は、XMLファイルの表示と編集に特化したGUIツールであり、明示的に新しいXMLファイルやその他のファイルを生成してディスクに保存する機能は持っていません。

ユーザーがGUI上でXMLの内容を編集した場合、その変更はプログラムのメモリ上のXMLツリー構造に反映され、Treeview表示が更新されます。ユーザーが編集した内容を永続化したい場合は、編集モードで表示されるXMLテキストをユーザー自身がコピーし、手動でファイルにペーストして保存する必要があります。

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

XML_Edit.py は、コマンドライン引数を使用して、読み込むXMLファイルパスと初期ウィンドウサイズを指定できます。

基本形式:

python XML_Edit.py [XML_FILE_PATH] [WINDOW_SIZE]
  • XML_FILE_PATH (オプション):

    • 読み込むXMLファイルのパスを指定します。

    • この引数を省略した場合、プログラムはデフォルトで ../XML/vasprun.xml を読み込もうとします。

  • WINDOW_SIZE (オプション):

    • アプリケーションウィンドウの初期サイズを "幅x高さ" の形式で指定します(例: "1024x768")。

    • この引数を省略した場合、プログラムはデフォルトで 800x600 のサイズを使用します。

    • XML_FILE_PATH を指定せずに WINDOW_SIZE を指定することはできません。XML_FILE_PATH を指定してから WINDOW_SIZE を指定する必要があります。

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

ここでは、いくつかの具体的なコマンドライン実行例とその結果を説明します。

事前に、my_example.xml というファイルを作成し、以下の内容が含まれていると仮定します。

<root>
    <item id="001">First Item</item>
    <item id="002">Second Item</item>
    <item id="003">Third Item</item>
</root>

1. デフォルト設定でプログラムを実行する

python XML_Edit.py
  • 説明: XMLファイルパスもウィンドウサイズも指定されません。

  • 実行結果:

    • プログラムはデフォルトのファイルパス ../XML/vasprun.xml を読み込もうとします。このファイルが存在しない場合、エラーメッセージが表示されます。

    • ウィンドウサイズはデフォルトの 800x600 となります。

2. 特定のXMLファイルを指定してプログラムを実行する

python XML_Edit.py my_example.xml
  • 説明: my_example.xml を読み込むように指定していますが、ウィンドウサイズは指定していません。

  • 実行結果:

    • my_example.xml の内容がGUIのTreeviewに表示されます。

    • ウィンドウサイズはデフォルトの 800x600 となります。

3. XMLファイルとウィンドウサイズの両方を指定してプログラムを実行する

python XML_Edit.py my_example.xml 1024x768
  • 説明: my_example.xml を読み込み、ウィンドウサイズを 1024x768 に指定しています。

  • 実行結果:

    • my_example.xml の内容がGUIのTreeviewに表示されます。

    • アプリケーションウィンドウは 1024x768 のサイズで起動します。

4. 存在しないXMLファイルを指定してプログラムを実行する

python XML_Edit.py non_existent.xml
  • 説明: 存在しない non_existent.xml ファイルを指定した場合の動作です。

  • 実行結果:

    • Tkinterのメッセージボックスが表示され、「Error: no such file or directory: 'non_existent.xml'」のようなエラーメッセージが通知されます。プログラムは起動しますが、XMLツリーは空のままです。