Yahooの形態素解析APIを使おうと思ったら、XML形式しか対応してなかったので、Perlで言うところのXML::Simpleなpythonモジュールを探したのですが見つかりませんでした。XML::SimpleはXMLとPerlのハッシュ(と配列の混合オブジェクト)を相互に変換するモジュールで、ちょっとしたXMLの処理をするには非常に便利なので残念です。普通にDOMを弄っても良かったのですが、Python クックブックにベースとなるコードを見つけた事もあり、勢いでXML::Simpleを(中途半端に)移植してみました。
モジュール名はpyxml2objでXML::Simpleと同様にXMLinとXMLoutを実装してあります。このモジュールを使うと以下の様な感じで、XMLとpyhtonの辞書(とリストの混合オブジェクト)を相互変換できます。
from pyxml2obj import XMLin, XMLout xml = """ <config logdir="/var/log/foo/" debugfile="/tmp/foo.debug"> <server name="sahara" osname="solaris" osversion="2.6"> <address>10.0.0.101</address> <address>10.0.1.101</address> </server> <server name="gobi" osname="irix" osversion="6.5"> <address>10.0.0.102</address> </server> <server name="kalahari" osname="linux" osversion="2.0.34"> <address>10.0.0.103</address> <address>10.0.1.103</address> </server> </config> """ obj = XMLin(xml) # xml to object print obj # 以下出力を整形 # {u'debugfile': u'/tmp/foo.debug', u'logdir': u'/var/log/foo/', # u'server': { # u'gobi': {u'osversion': u'6.5', u'address': u'10.0.0.102', u'osname': u'irix'}, # u'kalahari': {u'osversion': u'2.0.34', u'address': [u'10.0.0.103', u'10.0.1.103'], u'osname': u'linux'}, # u'sahara': {u'osversion': u'2.6', u'address': [u'10.0.0.101', u'10.0.1.101'], u'osname': u'solaris'}}} dic = { 'country' : { 'England' : { 'capital' : 'London' }, 'France' : { 'capital' : 'Paris' }, 'Turkey' : { 'capital' : 'Istanbul' }, }} print XMLout(dic) # object to xml # 以下出力そのまま # <root> # <country capital="Istanbul" name="Turkey" /> # <country capital="London" name="England" /> # <country capital="Paris" name="France" /> # </root>
内部ではxml.saxモジュールを使ってXMLのパースを行っています。これで非常に簡単にXMLを扱えるようになりましたね。最初は半日くらいで出来るかと思ったのですが、テスト等で手間取って結局丸まる3日かかりまして、壮大なヤクの毛刈りになってしまいました。。
なお今回も調子に乗ってpypiに登録したのでインストールはeasy_installから。ソースはgithubから。
$ easy_install pyxml2obj
本当はpyxmlsimpleという名前にしたかったのですが、既に使われていたので適当につけました。
あと最初に中途半端にと書きましたが、オプション対応が面倒だったので、あんまり使わなさそうなのは、ごっそり消しました。ごめんなさい。




