先日,pyRXP という高速 XML パーサーについて少し触れた(ブログエントリ).

ずいぶん時間がたったがちょっと使って検討してみることにした.


☆インストール

21:44.amarone[12055]cd pyRXP-1.13
21:46.amarone[12056]python setup.py build
running build
running build_ext
building 'pyRXP' extension
creating build/temp.macosx-10.5-i386-2.5
...
21:46.amarone[12057]sudo python setup.py install
Password:
running install
running build
running build_ext
running install_lib
copying build/lib.macosx-10.5-i386-2.5/pyRXP.so -> /Library/Python/2.5/site-packages
copying build/lib.macosx-10.5-i386-2.5/pyRXPU.so -> /Library/Python/2.5/site-packages
running install_egg_info
Writing /Library/Python/2.5/site-packages/pyRXP-1.13-py2.5.egg-info


☆使ってみる

21:50.amarone[12063]python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyRXP
>>> p=pyRXP.Parser()

XML をパースする.

>>> p.parse('<tag id="1"><a>hello</a><b>world</b></tag>')
('tag', {'id': '1'}, [('a', None, ['hello'], None), ('b', None, ['world'], None)], None)

このようにXML構造がタプルに変換される.

1つのタプルは4つの要素からなる.

(tagName, dict_of_attributes, list_of_children, spare)


しかし,このままではおもしろいけれど,ちょっと使いにくい.
ダウンロードしたアーカイブを展開したディレクトリの examples ディレクトリに xmlutils.py というファイルがある.
これを使うと,上記タプル化された XML の使い道が少しでてくる.

>>> tree = p.parse('<tag id="1"><a>hello</a><b>world</b></tag>')

と代入しておいて,

>>> import sys
>>> sys.path.append('examples')
>>> import xmlutils
>>> tw = xmlutils.TagWrapper(tree)

とする.
この tw というオブジェクトを使うことになる.

>>> tw
TagWrapper<tag>

>>> tw.keys()
['id', 'a', 'b']

>>> tw._children
[('a', None, ['hello'], None), ('b', None, ['world'], None)]

>>> tw.a._children
['hello']

>>> tw.id
'1'

>>> tw.b.__str__()
'world'

という具合である.
まだまだ改良の余地はあるが,少し使えそうか.

この examples/xmlutils.py もシンプルなので拡張しやすい.

おもしろそうではある.
うまくすれば,XPath のような使い方ができそうだ.
さらなる検討が必要.


<参考外部リンク>
配布元:ReportLab
XMLの論考: RXPパーサ




やじるし pyRXP信関連メモの目次