ElementTreeモジュールについて

ElementTreeの使い方。

tags:python, elementtree, xml, doc, module
created:2005-08-18T00:00:00

ElementTreeの使い方の基礎 XMLパーサライブラリであるElementTreeの使い方!

特長

ピュアPythonコードで実現されているので、 プラットフォームを選ばず、コンパイルレスで動作します。 (当サイトではCGIサーバにインストールして使っています。)

Pythonオブジェクト形式でアクセス出来るようになっており、 Pythonユーザには扱いやすい。

おんなじスペックで速度が必要ならcElementTreeというモジュールもあるようです。

Python2.5以降では標準で内蔵されるようになりました。 Python2.5以降を使う場合、パッケージの入手は必要ありません。 ただし、importするパッケージ名が変わっています。 以下の文書におけるパッケージ名「elementtree」を「xml.etree」に読み替えてください。

使い方

準備

from elementtree.ElementTree import XML, ElementTree, Element

ファイルからドキュメントオブジェクト

fd = file('test.xml', 'rb')
dom = ElementTree(file=fd)
dom.getroot()

「dom.getroot()」で、ルートエレメントにアクセス。

エレメント作成

  • Elementクラスをコンストラクト(タグ名とアトリビュート辞書をパラメータ)
  • テキスト領域にテキストデータをセット
  • エレメントオブジェクトの子として追加
new_element = Element(u'comment',{'attr1':'1'}
new_element.text = 'text-data'
dom.getroot().append(new_element)

ドキュメントオブジェクトの保存

encode = 'utf-8'
fd = file('test.xml', 'wb')
fd.write('<?xml version="1.0" encoding="%s" ?>\n' % encode)
dom.write(fd, encode)
fd.close()

エレメントの検索

findallメソッドを使う。

パラメータにはXPathの簡略式が使えます。

「.//comment」であれば、子孫の全ての「comment」タグのエレメントを見つけてきます。

items = dom.findall('comment')

findメソッドの場合最初に見つかったエレメントだけが取得できます。

属性へのアクセス

Pythonの辞書オブジェクトのように扱える様になっているので、

print element['attr1']

で読み書きアクセス出来ます。

辞書なので、デフォルト値指定の取得も出来ます。

print element.get('attr1','default')

テキストへのアクセス

print element.text

そのまんま。

サンプル

test.xml
<?xml version="1.0" encoding="utf-8" ?>
<根>
  <段 id="A" 名前="あ行">
    テキスト
    <群>
      <アイテム title="あ" />
      <アイテム title="い" />
      <アイテム title="う" />
      <アイテム title="え" />
      <アイテム title="お" />
    </群>
  </段>
</根>
test.py
# encoding: utf-8
from xml.etree import ElementTree
dom = ElementTree.parse('test.xml')
print dom.findtext('//段').encode('cp932')
items = dom.findall('//アイテム')
for item in items:
  print item.attrib['title'].encode('cp932')

アウトプット:

テキスト

あ
い
う
え
お

と言うように日本語も使えます。