xml.parsers.expat で XML 文書を解析する
Google App Engine (以下 GAE) 上で Amazon の Product Advertising API を扱うべく、Python の XML ライブラリについて調べていました。どうも Pythonista の間では lxml というのがメジャーらしいので、さっそく組み込んでみたのですが、どうも動かない。
調べて見たところ、GAE 上では、セキュリティの関係上、C 拡張による Python ライブラリは動かないとのことで、lxml は使えないようです。
代替ライブラリを探す
C 拡張がダメということは、つまり Pure Python なライブラリなら OK、という解釈でいいのでしょうか。探してみたところ、ちょうど先日購入した の p.479 に「XML 文書を Python のオブジェクトツリーに変換」というレシピが載っていました。
写経、そして修正
さっそく写経してみたのですが、動かない。しばらく調べた結果、誤植によるものと思われるバグを発見。その他いくつかの修正を加えたものを GitHub に公開しました。
主な変更点は以下の通りです。
- Xml2Obj.EndElement が上手く動かないのを修正
- UTF-8 に対応
- ファイルからではなく、文字列を XML として読み込むよう変更
- __getattr__ メソッドにより、Element.getElements() のショートカットを作成 (詳細は後述)
ただし、あくまでも習作であり、エラー処理等もかなり甘いので、実用的とは言えません。
その代わり、ちょっと遊ぶ程度にはちょうどいい手軽さかも。
コード
テストコード
__getattr__ による Element.getElements() へのショートカットについて
__getattr__ というのは、インスタンスに存在しないプロパティを呼び出そうとしたときに呼び出されるもので、PHP でいうと、マジックメソッドの __get にあたるものと言えるでしょう。
これにより、以下のようなショートカットを実現しています。意味はどちらも同じです。
終わりに
もともと GAE に組み込むことを目的として上記ライブラリを修正したわけですが、実はまだ組み込めてません・・・。ただ、expat を GAE に組み込んでいる例はネット上に転がっているので、まぁこれもいけるのではないかと。真相はまた今度。
関連リンク