スポンサーサイト

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

    XML出力

     前回SAXによるXMLパーザ(解析)を試したので、今度はその逆、書き出しを試してみたいと思います。

     書き出しにはxml.domを使えばよさそうです。また例によって外部のサイト様から情報を頂いて参りました。

    http://d.hatena.ne.jp/rintaromasuda/20061117/1163717869

     例によって上記サイト様でわかりやすいサンプルを作られているので、こちらではちょっと変更して辞書オブジェクトをXMLに変換する関数にしてみました。
    from xml.dom import minidom, Node
    
    def output( filename, value, root='root', debug=False ):
        '''引数valueに与えられた辞書オブジェクトをXMLに変換する関数。
    キーと対になる値は辞書か"str"・"int"・"float"・"dict"型のみ対応。
    キーは必ずstr"・"int"・"float"型にすること。
    また辞書オブジェクトのキーに対する値が再び辞書オブジェクトの場合、
    ネスト構造として表す。
    '''
        #ファイルの名前の末尾に拡張子".xml"がついていない場合、付加する
        if filename.endswith( '.xml' ):
            fiename = '%s.xml' % filename
    
        def appendDoc( val, document ):
            # ドキュメントエレメントに要素を追加するループ関数。
            # 値が辞書だった場合、再度この関すを呼び、タグをネスト状態にする
            for key in val.keys():
                if not type( key ) in ( str, int, float ):
                    raise TypeError, 'The key in the dict object must be type str, int, or float.'
    
                t = type( val[key] )
                if t == dict:
                    # 値が辞書だった場合、キーでエレメントを作り、
                    # 再度関数をよびそのエレメントオブジェクトを渡す。
                    elm = doc.createElement( key )
                    document.appendChild( elm )
                    appendDoc( val[key], elm )
                elif t in ( int, float, str ):
                    # 値がint・float・strだった場合は、キーでエレメントを作成し、
                    # 値をテキストとして追加する。
                    elm = doc.createElement( str( key ) )
                    elm.appendChild( doc.createTextNode( str( val[key] ) ) )
                    document.appendChild( elm )
    
        if type( value ) != dict :
            raise TypeError, 'The value must be type dict.'
    
        # xmlドキュメントクラスをインスタンス
        doc = minidom.Document()
    
        # 要素をドキュメントクラスに追加
        rootDoc = doc.createElement( root )
        doc.appendChild( rootDoc )
    
        appendDoc( value, rootDoc )
    
        if debug == True:
            print doc.toprettyxml( indent='    ' )
            return
    
        try:
            f = open( filename, 'w' )
            f.write( doc.toprettyxml( indent='    ' ) )
        finally:
            f.close()
    
    


     基本としてはまず
    doc = minidom.Document()
    でインスタンスを最初に作成し、
    tag = doc.creatElement( キー )
    でタグに該当するものを作成、
    tag.appendChild( doc.createTextNode('値') )
    でタグに挟まるテキストを追加します。

    タグをネストする場合は、上記例で言うと新しい変数に
    tag2 = doc.creatElement( キー )
    でタグを作り
    tag.appendChild( tag2 )
    で最初のタグに収まるようです。

     用はcreateTextNodeで文字を、createElementでタグを、appendChildメソッドでそのメソッドを有するタグオブジェクトに内容を追加する・・・と言ったわかり易い構造になってるようです。

     最後にminidom.Documentのインスタンスのメソッド、".toprettyxml"で結果を出力できます。

     これで、解析・書き出しの両方ができるようになりました~
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

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

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

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