Element TreeによるXMLの処理
XML処理をする選択肢
PythonでXMLを処理するライブラリは多数ある。以下に有名なものを3つ紹介する。
ライブラリ | 標準ライブラリ | 説明 |
---|---|---|
minidom | o | 最小のDOM実装 |
Element Tree | o | 完全なDOM実装 |
xmltodict | x | dictionary形式として扱う |
DOMで処理するならElement Treeが最も使いやすい。
minidomは自分で色々といじりたいプロ向け。
xmltodictはdictionary形式で処理したいときに利用できる。
他にも非標準ライブラリとしてuntangle、cElementTree、lxmlなどなど色々あるが、迷ったらElement Treeでよいと思う。ここではElement Treeを取り上げる。
インストール
- 標準ライブラリなのでインストールは不要
import
- クラス名が長いので「ET」とするのがプラクティス
import xml.etree.ElementTree as ET
読み込み
- ファイルからそのまま読み込める
tree = ET.parse('test.xml')
- 処理の起点となる最上位ノードを取得
root = tree.getroot()
書き込み
- ファイルへそのまま書き込める
tree.write('test.xml', encoding='UTF-8')
Iterate
- 第1階層のキーのみを表示する
- 第2階層以下を表示したい場合はfor文をネストすること
for child in root: print(child.tag)
要素へのアクセス
- 現在の要素のタグと属性と値にアクセス
- tag、attrib、textを使う
print(child.tag) print(child.attrib) print(child.text)
- 子要素へ配列でアクセス
- 1番目の子要素の1番目の子要素のタグを表示
print(root[0][0].tag)
- 子要素を検索 - First Match
- 子要素からタグがidの要素を1つ取得して値を表示
print(root.find('id').text)
- 子要素を検索 - Match All
- 子要素からタグがidの要素を全て取得して値を表示
ids = root.findall('id') for id in ids: print(id.text)
- Tree全体を検索
- find/findallは子要素の階層のみ検索するがiterはさらに下位の階層まで検索する
for elem in root.iter('id'): print(elem.tag) ````