0

モジュールを使用するコードによって要求されたmsgのタイプに基づいて、モジュールから特定のxml文字列を生成したいと思います。これらの各xml文字列には、動的に生成されるデータが含まれています。たとえば、これらのxml文字列の多くには、別の関数を使用して生成されたCookieフィールドがあります。

私は、動的フィールド(つまり、cookie)が事前に入力された(つまり、正確に動的ではない)すべてのxml文字列を初期化するPythonディクショナリから始めました。次に、辞書を呼び出して、関連するxml文字列を取得します。

このアプローチの問題は、Cookieが1時間ごとに期限切れになるため、1時間後にモジュールによって返される文字列に、それらの期限切れの値が含まれることです。私が理想的に望んでいるのは、(以下の例のように)要求されたmsg_typeに基づいて要求されたときに、正しく形成された文字列を返すジェネレーター関数の形式です(この場合でも可能かどうかはわかりません)。このdictに保存されている各xml文字列は一意の形式であるため、ある種の一般的なテンプレートxmlジェネレーターを正確に使用することはできません。

例として、私が定義したdictは、次のget_msgディクショナリに似ています。

        get_msg["msg_value_1"] = """<ABC cookie=""" + getCookie() + """ > 
                                         <XYZ """ + foo_name +""">
                                         </XYZ>
                                  </ABC>"""

        get_msg["msg_value_2"] = """<ABC cookie=""" + getCookie() + """ > 
                                         <some text """ + bar_name + """>
                                         </XYZ>
                                  </ABC>"""

新鮮なmsgリクエストごとにgetCookie()が呼び出されて、これらのxml文字列をその場で生成できるようにするための良いアプローチは何でしょうか(必ずしも辞書を使用する必要はありません)。任意の入力をいただければ幸いです。

4

1 に答える 1

2

このために、私はそのようなクラスを作成します

class SF( object ):
    def __init__( self, temp, args ):
            self.temp = temp
            self.args = args

    def __call__( self ):
            ret = self.temp
            for k, v in self.args.iteritems():
                    if hasattr( v, "__call__" ):
                            v = v()
                    ret = ret.replace( "{%s}" % k, str( v ) )
            return ret

s = SF( "This is a {test} with another {value}", 
        { "test": lambda: 100, "value": "Test" } )

print s()

This is a 100 with another Test

これにより、さまざまなテンプレートを渡すことができ、置き換える必要のある各パーツは{cookie}、中かっこで囲まれた名前になります。これらのSFオブジェクトを辞書に保存し、呼び出すだけでそれぞれのXMLを返すことができます。

lxmlまた、物事がより複雑になったときに正しいXMLを生成するために、などのXMLライブラリを使用することを強くお勧めします。

于 2013-01-26T05:54:15.333 に答える