XML::Simpleっぽいpythonモジュール書いた このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加

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という名前にしたかったのですが、既に使われていたので適当につけました。

あと最初に中途半端にと書きましたが、オプション対応が面倒だったので、あんまり使わなさそうなのは、ごっそり消しました。ごめんなさい。

関連する記事

タグ: , ,

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

コメントをどうぞ