ElementTreeモジュールについて

ElementTreeの使い方。

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

△目次へ

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

【1】   特長

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

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

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

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

【3】   使い方

【3.1】   準備

1
from elementtree.ElementTree import XML, ElementTree, Element

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

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

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

【3.3】   エレメント作成

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

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

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

【3.5】   エレメントの検索

findallメソッドを使う。

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

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

1
items = dom.findall('comment')

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

【3.6】   属性へのアクセス

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

1
print element['attr1']

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

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

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

【3.7】   テキストへのアクセス

1
print element.text

そのまんま。

【4】   サンプル

test.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<根>
  <段 id="A" 名前="あ行">
    テキスト
    <群>
      <アイテム title="あ" />
      <アイテム title="い" />
      <アイテム title="う" />
      <アイテム title="え" />
      <アイテム title="お" />
    </群>
  </段>
</根>
test.py
1
2
3
4
5
6
7
# 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')

アウトプット:

テキスト

あ
い
う
え
お

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


コメントエリア

名前: (管理者用:)

コメント: