【Python】XMLファイル構文の確認するプログラム例の紹介

XML構文を確認するためには、オンラインツールなどを使用する方法があります。簡単に使用することができるため便利ではありますが、次のような問題が発生することがあります。

  • ファイルをまとめて確認できない。
  • ネットワーク環境により使用できない。
  • セキュリティのためオンラインツールに内容を記載できない。

今回は、ローカル環境でPythonlxmlライブラリを使用して、XMLファイルの構文が正しいかを確認するためのプログラム例を紹介していきます。

プログラム例は、XML構文が整形式XML文書(well-formed XML document)として正しいかどうかの確認するものになります。

スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • OS
    • バージョン:Windows 10(1909)
  • Python
    • バージョン:3.9.0
  • pip
    • バージョン:20.2.4
  • lxml
    • バージョン:4.6.2

インストール方法

XML構文を確認するためのlxmlライブラリを、次のコマンドを使用してインストールします。

py -m pip install lxml

インストールに失敗する場合は、次の公式サイトのインストール方法を参考にすると解決するかもしれません。

確認方法(基本編)

指定したXMLファイルを確認する最低限処理のプログラム例は、次のようになります。

from lxml import etree
etree.parse("example.xml")

確認対象のファイルパスをetree.parseに指定します。XMLファイルの構文に誤りがある場合は、例外が通知されます。例外が通知されない場合は、XMLファイルの構文が正しいと判断することができます。

確認方法(応用編)

最低限の処理では、ファイルパスをプログラム内で指定しているため、確認対象を変更するためには、毎回修正する必要があります。

応用的な確認方法では、次の操作に対応していきます。

  1. ファイルパスを引数で指定して確認する。
  2. ディレクトリパスを引数で指定して確認する。
  3. ファイルパス/ディレクトリパスを引数で指定して確認する。

ファイルパスを引数で指定して確認する

ファイルパスを引数で指定して、XMLファイルを確認するプログラム例は、次にようになります。

import sys
from lxml import etree

args = sys.argv

with open(args[1]) as f:
  etree.parse(f)

プログラム実行時の引数を取得するため、sys.argvを追加します。

取得した配列の0番目には、スクリプト名が設定されているため、配列の1番目を取得して、etree.parseを実行して確認することができます。

ディレクトリパスを引数で指定して確認する

ディレクトリパスを引数で指定して、XMLファイル構文を確認するプログラム例は、次のようになります。

import sys
import pathlib
from lxml import etree

args = sys.argv

path = pathlib.Path(args[1])
for file_path in path.glob("**/*.xml"):
    try:
        etree.parse(str(file_path))
    except Exception as e:
        print(e)

パスを取得するため、pathlib.Pathを追加します。

pathlib.Pathに引数のパスを指定して、Pathオブジェクトを取得します。

Pathオブジェクトのglobメソッドに**/*.xmlを指定することで、指定したディレクトリとすべてのサブディレクトリを再帰的に検索し、.xmlの拡張子のファイルだけを対象とすることができます。

注意事項として、Pathオブジェクトのglobメソッドでの取得した結果は、Pathオブジェクトになります。etree.parseに指定する場合は、str関数で変換する必要があります。

ファイルパス/ディレクトリパス引数で指定して確認する

ファイルパス、または、ディレクトリパスを引数で指定して、XMLファイル構文を確認するプログラム例は、次のようになります。

import sys
import pathlib
from lxml import etree

args = sys.argv

path = pathlib.Path(args[1])
if path.is_file():
    etree.parse(str(path))
else:
    for file_path in path.glob("**/*.xml"):
        try:
            etree.parse(str(file_path))
        except Exception as e:
            print(e)

パスを取得するため、pathlib.Pathを使用してPathオブジェクトを取得します。

Pathオブジェクトがファイル、または、ディレクトリで処理を分けるようにすることで、それぞれの検証処理を実施することができます。

まとめ

XMLファイル構文が正しいかどうかの確認するためのプログラム例を紹介しました。

参考

エラー処理などを追加した完成プログラム例は、githubにアップロードしています。