プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Element TreeによるXMLの処理

XML処理をする選択肢

PythonXMLを処理するライブラリは多数ある。以下に有名なものを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)
````