tkxml.py 技術ドキュメント

ライブラリの機能や目的

tkxml.py は、XMLデータの解析、変換、操作を支援するPythonユーティリティライブラリです。

このモジュールの主な目的は、Python標準ライブラリである xml.etree.ElementTreexml.dom.minidom に加え、外部ライブラリの xmltodictdicttoxmlnumpy を利用して、XMLファイルとPythonの辞書構造間の相互変換、XML要素の再帰的な解析、特定のセクション情報の抽出、整形されたXMLの書き出しなど、XML操作に関する幅広い機能を提供することです。

具体的には、ATLAS最適化XMLやVASP計算結果XML (vasprun.xml) などの特定のフォーマットを持つXMLファイルの解析を容易にする機能を含んでいます。これにより、これらの複雑なXML構造から必要な情報を効率的に抽出し、Pythonプログラム内で扱いやすい形式に変換することが可能になります。

importする方法

tkxml.py ライブラリを他のPythonプログラムからインポートするには、以下のいずれかの方法を使用します。

ライブラリ全体をインポートする場合:

import tkxml

特定の関数のみをインポートする場合:

from tkxml import get_root, file2dict, dict2xml

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

tkxml.py が依存する非標準ライブラリは以下の通りです。

  • xmltodict: XMLをPythonの辞書に変換するために使用されます。

  • dicttoxml: Pythonの辞書をXMLに変換するために使用されます。

  • numpy: 数値計算機能を提供しますが、このライブラリの主なXML処理機能では直接的に利用されていないようです。ただし、依存関係として含まれています。

これらのライブラリは pip コマンドを使用してインストールできます。

pip install xmltodict dicttoxml numpy

importできる変数と関数

変数

  • infile: デフォルトの入力ファイルパスとして 'opt_2onl.xml' が設定されています。スクリプトがコマンドライン引数付きで実行された場合、この変数の値は最初のコマンドライン引数によって上書きされます。

関数

  • get_elements_recursive(element) 動作: XML要素の子要素の情報を再帰的に取得します。入力されたXML要素が子要素を持たない場合、その要素のテキスト内容を返します。子要素を持つ場合、各子要素のタグ、テキスト、属性を抽出し、さらにその子要素に対して再帰的にこの関数を呼び出して情報を収集します。収集された情報は、辞書のリストとして返されます。 引数:

    • element: 処理対象の xml.etree.ElementTree.Element オブジェクト。 戻り値:

    • 子要素がない場合は要素のテキスト (str)。

    • 子要素がある場合は子要素情報のリスト (list[dict])。

  • get_unique_key(d, section, val = None) 動作: 辞書 d 内でユニークなキー名を生成します。指定された sectionval に基づいてキーを生成し、辞書 d にそのキーが存在しない場合はそのまま返します。既に存在する場合は、section[i]:val または section[i] の形式でインデックスを付加し、ユニークなキーが見つかるまで試行します。 引数:

    • d: キーの存在を確認する辞書。

    • section: キーの基本となるセクション名。

    • val: (オプション) セクションに付加する値。デフォルトは None戻り値:

    • 辞書内でユニークなキー文字列 (str)。

  • get_section_inf(parent, sections = None, inf = None, params = None, ret_type = 'list', add_parent_params = True) 動作: 指定されたセクションパスに沿ってXML要素の情報を取得します。parent 要素から sections リストで指定されたパスを辿り、最後のセクションの子要素の情報を取得します。ret_type'list' の場合はリストで、'dict' の場合は辞書で情報を返します。途中の親要素の属性も params_child として収集され、add_parent_paramsTrue の場合、最終的な戻り値に含められます。 引数:

    • parent: 検索を開始する xml.etree.ElementTree.Element オブジェクト。

    • sections: (オプション) 検索する子要素のタグ名のリスト。デフォルトは None

    • inf: (オプション) 情報を追加する既存のリストまたは辞書。関数内でコピーして使用されます。デフォルトは None

    • params: (オプション) 親要素から引き継がれるパラメータの辞書。デフォルトは None

    • ret_type: (オプション) 戻り値の型 ('list' または 'dict')。デフォルトは 'list'

    • add_parent_params: (オプション) 親のパラメータを戻り値に含めるかどうか。デフォルトは True戻り値:

    • 子要素のタグ、テキスト、属性、または子要素の属性情報を含む辞書/リスト。

  • get_section_inf_all(parent, sections = None, section_parent = 'root', inf = None, level = 0, params = None, pkey = None, ret_type = 'list', last_node_only = True) 動作: 指定されたセクションパスに沿ってXML要素の情報を再帰的に取得します。parent 要素から sections リストで指定されたパスを辿り、各階層の子要素の情報を取得します。last_node_onlyFalse の場合、中間ノードの情報も収集します。ret_type'list' の場合はリストで、'dict' の場合は辞書で情報を返します。親要素の属性は params_child として引き継がれ、各ノードの情報に含まれます。 引数:

    • parent: 検索を開始する xml.etree.ElementTree.Element オブジェクト。

    • sections: (オプション) 検索する子要素のタグ名のリスト。デフォルトは None

    • section_parent: (オプション) 現在の parent 要素のタグ名(ユニークキー生成用)。デフォルトは 'root'

    • inf: (オプション) 情報を追加する既存のリストまたは辞書。デフォルトは None

    • level: (オプション) 現在の再帰レベル。デフォルトは 0

    • params: (オプション) 親要素から引き継がれるパラメータの辞書。デフォルトは None

    • pkey: (オプション) ret_type'dict' の場合にキーとして使用する属性名。デフォルトは None

    • ret_type: (オプション) 戻り値の型 ('list' または 'dict')。デフォルトは 'list'

    • last_node_only: (オプション) 最後のセクションのノードのみを収集するか、すべてのノードを収集するか。デフォルトは True戻り値:

    • 子要素のタグ、テキスト、属性、および親要素のパラメータを含む辞書/リスト。

  • xml2dict(xml) 動作: XML文字列または ElementTree 要素を辞書に変換します。xmltodict ライブラリを使用して、入力されたXMLデータをPythonの辞書構造に変換します。 引数:

    • xml: 変換するXML文字列。 戻り値:

    • 変換された辞書。

  • _element_to_dict(element) (内部関数) 動作: xml.etree.ElementTreeElement オブジェクトを再帰的に辞書に変換します。要素の属性は '@attributes' キーの下に、テキスト内容は '#text' キーの下に格納されます。同じタグ名の子要素が複数ある場合はリストとして扱われます。これは xmltodict の代替または補助的な役割を果たす内部関数であり、通常は直接使用されません。 引数:

    • element: 変換する xml.etree.ElementTree.Element オブジェクト。 戻り値:

    • 変換された辞書。

  • file2dict(infile) 動作: 指定されたファイルパスのXMLファイルを読み込み、辞書に変換します。指定されたパスからXMLファイルを読み込み、その内容を xml2dict 関数を使って辞書形式に変換します。 引数:

    • infile: 読み込むXMLファイルのパス。 戻り値:

    • 変換された辞書。

  • dict2xml(d, attr_type = True, root = True) 動作: 辞書をXMLインスタンスに変換します。dicttoxml ライブラリを使用して、入力されたPythonの辞書をXMLインスタンスに変換します。 引数:

    • d: 変換する辞書。

    • attr_type: (オプション) 辞書のキーをXMLタグの属性として扱うかどうか。デフォルトは True

    • root: (オプション) 生成されるXMLにルート要素を含めるかどうか。デフォルトは True戻り値:

    • 変換されたXMLインスタンス (bytes)。

  • to_xml(outfile, element, encoding = 'utf-8', newl = '', indent = '', addindent = '    ', xml_declaration = True, use_minidom = False) 動作: XML要素をファイルに書き出します。use_minidomTrue の場合、xml.dom.minidom を使用してXMLを整形(インデントと改行を追加)してファイルに書き出します。それ以外の場合は、xml.etree.ElementTree を使用して直接書き出します。 引数:

    • outfile: 書き込み先のファイルパス。

    • element: 書き出すルートの xml.etree.ElementTree.Element オブジェクト。

    • encoding: (オプション) 出力ファイルのエンコーディング。デフォルトは 'utf-8'

    • newl: (オプション) use_minidomTrue の場合の改行文字。デフォルトは ''

    • indent: (オプション) use_minidomTrue の場合のインデント文字列。デフォルトは ''

    • addindent: (オプション) use_minidomTrue の場合の追加インデント文字列。デフォルトは '    '

    • xml_declaration: (オプション) XML宣言 (<?xml version="...">) を含めるかどうか。デフォルトは True

    • use_minidom: (オプション) xml.dom.minidom を使用してXMLを整形するかどうか。デフォルトは False戻り値:

    • None

  • get_attrib(element) 動作: XML要素のタグ、テキスト、および属性を取得します。 引数:

    • element: 処理対象の xml.etree.ElementTree.Element オブジェクト。 戻り値:

    • 要素のタグ (str)、テキスト内容 (str)、属性の辞書 (dict)。

  • get_root(xml) 動作: XMLソースからルート要素を取得します。入力がファイルパスの場合はファイルを解析し、XML文字列の場合は文字列から解析して xml.etree.ElementTree.Element 型のルート要素を返します。 引数:

    • xml: XMLファイルのパス (str) またはXML文字列 (str)。 戻り値:

    • xml.etree.ElementTree.Element 型のXMLルート要素。

  • main() (メイン実行関数) 動作: スクリプトが直接実行された際に呼び出されるメイン関数です。コマンドライン引数から入力ファイルを読み込み、そのXML構造に基づいてATLAS最適化XMLまたはVASP計算結果XML (vasprun.xml) を解析し、関連情報を標準出力に出力します。解析対象のXMLタイプが判別できない場合はエラーメッセージを出力して終了します。 引数:

    • なし 戻り値:

    • None

main scriptとして実行したときの動作

tkxml.py がメインスクリプトとして実行された場合 (python tkxml.py のように実行)、if __name__ == '__main__': ブロックが実行され、その中で main() 関数が呼び出されます。

main() 関数の主な動作は以下の通りです。

  1. 入力ファイルの指定:

    • デフォルトの入力ファイルは infile 変数に設定されている 'opt_2onl.xml' です。

    • コマンドライン引数がある場合 (python tkxml.py my_xml_file.xml のように実行)、最初の引数が infile の値として使用されます。

  2. XMLルート要素の取得:

    • 指定された infile から get_root() 関数を使ってXMLのルート要素が取得されます。

  3. XMLタイプの判別と解析:

    • 取得したルート要素に対して、特定のXPath (.//parameter-list または .//incar) を使ってXMLのタイプを判別します。

    • ATLAS最適化XMLの場合: ルート要素内に parameter-list が見つかった場合、ATLAS最適化XMLと判断されます。

      • parameter-list セクションから parameter 情報を get_section_inf_all() を使って辞書形式で抽出・表示します。

      • settings セクションから setting 情報を同様に抽出・表示します。

      • target-list セクションから target 情報を同様に抽出・表示します。

    • VASP計算結果XML (vasprun.xml) の場合: ルート要素内に incar が見つかった場合、vasprun.xml と判断されます。

      • projected_kpoints_opteigenvaluessetr などを含むパスからバンド情報を get_section_inf_all() を使って抽出・表示します。

      • incar セクションからその子要素の情報を get_section_inf_all() を使って辞書形式で抽出し、表示します。

    • その他のXMLタイプの場合: 上記のいずれのタイプにも合致しない場合、「Error: Invalid XML type」というメッセージを出力し、スクリプトは終了します。

解析結果はすべて標準出力に表示されます。