xmlデータ解析
プロジェクト業務で膨大なxmlデータを解析してほしいと依頼があり、先輩からのサポートのもと実装してみたのでその時覚えたこと、躓いたことなんかを記事にまとめます。
本記事は誤りが多い可能性大です。
気になったら部分はご指摘いただけると幸いです、、
ElementTreeによるxml解析
pythonには様々なフレームワークが用意されています。
今回はその中でも標準ライブラリである、ElementTreeモジュールを使った解析をしてみました。
ElementTreeとは?
xml解析ができるライブラリです。
xmlのデータ構造を木構造に見立ててパースして、データの探索や操作なんかができるようになります。
参考文献:PythonでXMLを処理する — 【完全解説】ElementTreeモジュールの使い方
使い方自体は簡単で専用のモジュールをimport宣言してあげるだけです。
import xml.etree.ElementTree as ET
※「as ET」の部分はエイリアスです。
あっても無くても良いですが、あった方が実際使うときコードの記載が短くできたりするので便利です。
無い場合は後述するメソッド使用宣言「ET.~」の部分を「xml.etree.ElementTree.~」とする必要があります。
使い方
使い方は色々あるみたいですが、自分がよく使う手順を大きく分けると以下の通りです。
- xmlファイルをパース
- rootタグを設定
- xmlデータを操作する際の起点となるタグを探索
- root下の指定のタグを探索
- メソッドを使って指定の属性やその値が存在するか探索
コード例
・xmlファイルをパース
tree = ET.parse("パースしたいxmlファイル名")
・rootタグを設定
root = tree.getroot()
・root下の指定のタグを探索
tag = root.findall(".//'探索したいタグ名'")
探索するメソッドがfindallです。同じく探索用にfindメソッドというのもあるので用途に合わせて使い分けます。
2つの違いは以下の通りです。
- findall
- 指定したタグを全て取得する
- find
- 最初に見つかったタグだけを取得する
xmlデータによってはブロックが細分化され、ブロック別に同名属性が複数存在するケースがあると思います。
その対象全てを取得したければfindall、最初の要素だけ取得したければfindといった用途で分けて使います。
因みに、「(".//'探索したいタグ名'")」の「/」が1つか2つかによっても探索範囲が異なるので注意が必要です。
- /の場合
- root直下のタグだけを検索
- //の場合
- root以下全てのタグを再帰的に検索
終わりに
取り急ぎ自分が使ってみた際躓いたポイントなどをまとめてみました。
今後も気づいた事があれば別記事などでまとめていこうと思いますので気になったら見に来てください。