ElementTreeの使い方

google app engine for pythonでXMLを扱うときにElementTreeを使っていくつかはまった。(beautiful soupの方が簡単そうだけどGAPでは使えないっぽい)
基本的な使い方はネットですぐ見つかるので、わかりにくいことだけメモ。
取り敢えず動けばいいという感じでやってるので、用語の使い方などは適当。。

時間を取られたのは、
ネームスペース(名前空間)がある場合。
違う親の下に同じ名前のタグがある場合。

名前空間がある場合は比較的簡単。

name= ‘{‘ + ここにURI + ‘}’

で必要な物を取り出す場合は

xml = fromstring(xmlp)
title = xml.getiterator(namespace+’Title’)

でOK。
表示する場合はfor構文の中で

title[i].text.encode(‘utf-8’)

みたいにする。

次はやっかいで、違う親の中に同じタグがある場合。
例えば

necoの下にnameがあり、
dogの下にnameもあるとする。

これを

xml.findall(.//name)

としたら、猫と犬の名前がごちゃごちゃに入ってしまう。
個別に取り出すには
順番に指定して、

/neco/name
/dog/name
みたいにしてあげる。(一番上から全部書く)

実際には
xml.findall(.//neco/name)

さらに名前空間もある場合は

xml.findall(.//{url}neco/{url}name)

とすればOK。(urlの部分に名前空間のURIを入れる)
直接入れないで、変数に入れてからやったほうがシンプルなんだけど、なぜかエラーが出て上手くいかなかったので直接入れた。

以上で取り敢えずはすべて解決。

コメントを残す