XML構文を確認するためには、オンラインツールなどを使用する方法があります。簡単に使用することができるため便利ではありますが、次のような問題が発生することがあります。
- ファイルをまとめて確認できない。
- ネットワーク環境により使用できない。
- セキュリティのためオンラインツールに内容を記載できない。
今回は、ローカル環境でPython
のlxml
ライブラリを使用して、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
インストールに失敗する場合は、次の公式サイトのインストール方法を参考にすると解決するかもしれません。
- lxml公式サイト:https://lxml.de/installation.html
確認方法(基本編)
指定したXMLファイルを確認する最低限処理のプログラム例は、次のようになります。
from lxml import etree
etree.parse("example.xml")
確認対象のファイルパスをetree.parse
に指定します。XMLファイルの構文に誤りがある場合は、例外が通知されます。例外が通知されない場合は、XMLファイルの構文が正しいと判断することができます。
確認方法(応用編)
最低限の処理では、ファイルパスをプログラム内で指定しているため、確認対象を変更するためには、毎回修正する必要があります。
応用的な確認方法では、次の操作に対応していきます。
- ファイルパスを引数で指定して確認する。
- ディレクトリパスを引数で指定して確認する。
- ファイルパス/ディレクトリパスを引数で指定して確認する。
ファイルパスを引数で指定して確認する
ファイルパスを引数で指定して、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
にアップロードしています。