スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    XMLパーザ

     ツールのプレファレンスを保存する際、リーダーとライターを書くのが面倒なんでXML形式にしてみようと思いたった今日の昼。
     PythonにはXML補助モジュールが充実してるらしいので、早速使ってみることにしました。
    が・・・よくわからないっす(・;) アホにはマニュアルとサンプルを沢山用意してくれないと理解できないっす・・・
     その点Mayaのコマンドリファレンスはコマンドの説明とサンプルの両方がついてるんで助かります。

    http://members.jcom.home.ne.jp/jintrick/Personal/SAX_setup.html
     で、色々ググってみたところ、↑サイト様のところで丁寧な解説がありました\(^^)/
    まさに今回ボクが欲しかった機能だったので、大変助かりました~

     因みに今回はsaxモジュールを使いますが、そもそもsaxとは何ぞや?って話なんですよね・・・
     XMLパーザ(パーザ=解析すること)は名前の通りXML形式でかかれたドキュメントを解析するための技術です。
     XMLパーザにはDOMとSAXあり、DOMはXMLの内容をツリー状にいっきにメモリに展開し、編集が可能。SAXは上から順次読み込んでいき、イベント(たぶんタグ)に当たる度にツールにその情報を渡していくタイプで、イベントずつに読み込んでいくのでメモリ消費量が少ないのがいいところだとか。
     詳しくは
    http://www.atmarkit.co.jp/fxml/rensai/rexml10/rexml10.html
     に載ってます。

     さて、今回はプレファレンスのデータをMayaに持ってきたいだけなのでSAXを使います。
     もはや↑のサイトでだいたいご説明されているので、特に言う事はないのですが・・・↑のサイト様がアボーンされるとボクが困るので、メモ代わりに簡単に書いてみます。
    import xml.sax as sax
    
    class saxHandler( sax.ContentHandler ):
        def __init__( self, root='root' ):
            # このクラスの初期化
            self.root = root
            self.currentNode = root
            self.datadict = {}
        def startElement( self, name, attrs ):
            # 要素の開始タグが検出された際に実行。
            self.currentNode = name
        def endElement( self, name ):
            # 要素の終了タグが検出された際に実行。
            self.currentNode = self.root
        def characters( self, char ):
            # 文字データが検出された際に実行。
            if self.currentNode != self.root:
                self.datadict[ self.currentNode] = char
    
    def parseXML( filename, root=''  ):
        # filenameが存在しない場合はエラーを返して終了
        if not os.path.isfile( filename ):
            raise IOError, '%s was not found.' % filename
    
        # 解析を実行する
        parser = sax.make_parser()
        parser.setFeature( sax.handler.feature_namespaces, False )
        handler = saxHandler( root=root )
        parser.setContentHandler( handler )
    
        f = open( filename, 'r' )
        try:
            parser.parse( f )
        finally:
            f.close()
    
        return handler.datadict
    



     参考サイトさんではsaxHandlerが継承している基底クラスはxml.sax.saxutils.DefaultHandlerだったのですが、 どうやらPython2.6の時点でこのクラスは無いみたいです。
     なので変わりにsax.ContentHandlerから継承してます。

     読み込むXMLをprofile.xmlとし、中には以下のようなデータを入れます。
    <?xml version="1.0" encoding="UTF-8"?>
    
    <root>
        <Name>hoge</Name>
        <Age>40</Age>
        <Birth>12/25</Birth>
    </root>
    

    データが用意できたらいよいよ実行です。
    parseXML( filename='profile.xml', root='root' )
    # Result: {u'Age': u'40', u'Name': u'hoge', u'Birth': u'12/25'} # 
    

     お~辞書形式でデータをとれましたよ~。素晴らしい!
     上記スクリプトで重要なのはrootフラグでしょうか。
     参考として作成したxmlファイルは<root>から始まり、</root>で終わってます。ここはルートのタグなのでパラメータが入っていないのですが、rootフラグに'root'タグを指定しておかないと、辞書のキーにrootが入ってきてしまいます(因みに中身は\tです)
     ここだけ注意する必要がありそうです。

     またxml.ContentHandlerクラスを基底クラスとするsaxHandlerのcharactersメソッドの中身(青字の部分)を書き換えてやれば、自分好みの挙動にしてやることができます。



     ・・・あれ、リーダーは出来たけどライターは無いのだろうか・・・
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココからアクセスできますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。