2016-06-14 6 views
0

spyneクラス定義から特定のクラスタグ名を取得する方法はありますか?spyneポリモーフィックなタグ名を正しく取得する方法

場合を考えると、私のクラス階層は次のようになります。

# models.py 
class Vehicle(ComplexModel): 
    ... 

class Car(Vehicle): 
    ... 

class Bike(Vehicle): 
    ... 

それから私は、多型の作業を取得するために、彼らの問題は似ているようだ引き起こし、この質問の答えの指示に従いました。変更された

how to implement abstract model in spyne

How do you @rpc _returns polymorphic types in spyne?

重要なコード行:

# start.py 
application=Application(
    ... 
    in_protocol=Soap11(...), 
    out_protocol=Soap11(polymorphic=True) 
) 

これまでのところ、とても良いです。私はこれをした後、私は次のような応答を持っている:

<!-- Response.xml --> 
... 
<Vehicle xsi:type="Car"> 
    ... 
</Vehicle> 
... 

だから私の質問は次のとおりです。

iはタグ名として一般的なクラス名Vehicleを取り除くとの名前を取得取得することができます特定のクラス代わりにタグ名としてCar

したがって応答は次のようなものでなければなりません:

Remove the namespace from Spyne response variables

:私は `ctx.out_string」といくつかのアプローチや、この問題のいくつかのテキスト置換を見てきました

<Car> 
    ... 
</Car> 

私はおそらく私のためにうまくいくと思いますが、まだ見つからなかったAPIに「従来の」方法がある場合は、代わりに使用することがわかっています。

+0

これは、SOAP多形性の実装方法です。これはバグだと思いますか? –

+0

@BurakArslanさて、私はそれに精通していませんでした。私はそれについて少し研究します。いいえ この種の機能は必要ないと言っているのですが、lxmlのようなxmlインタプリタは、xmlで作業するときには、tagnameとして 'xsi:type'を決定する必要があります。また、 'xsi:type'が特定の型であるため、一般的なスーパークラスをタグ名のように無視します。 – 0x00F

+0

今どこから来ているのか分かります。私の答えを見てください。 –

答えて

0

これは、XML多型が動作する方法です。 libxml2のスキーマバリデーター(lxmlを通して使用する)は、それを正しく解釈する必要があります。

OTOH、あなたは確信している場合は、単にタグ名による区別をしたい、<choice>タグを見て:http://w3.org/TR/xmlschema-1/#declare-contentModel

は、2つのアプローチを比較する記事を参照してください。http://ibm.com/developerworks/library/ws-tip-xsdchoice

は、あなたはすでに持っているように見えますSpyneで多型を使用する方法を考え出しました。したがって、<choice>タグを使用する方法は次のとおりです。https://github.com/arskom/spyne/blob/57ef5c0db51cb194353c67d317990fe89bc4177d/spyne/test/interface/test_xml_schema.py#L51

+0

ありがとうございました。あなたが予測したとおり、かなりうまくやっていますが、リクエストの実行時に、この行は 'DEBUG:spyne.protocol._base:Polymap miss cls switch: =>'と繰り返しています。'spyne.protocol._base.ProtocolMixin'のコードに入った後、私の場合、' Vehicle'は 'Vehicle.polymap'の継承クラス' Car'に関する情報を持っていないようです。どのようにこれを修正するか、これは私には心配しないで、機能が不足していないため、ポリマップが設定されていない場合ですか? – 0x00F

+0

これはエラーではなく、ポリモルフィックなクラススイッチが 'poly_map'ルックアップなしで実行されたことを伝えるだけです。 –

+0

しかし、私はこのポリマップが私の場合には2つのサブクラスを保持する必要があると仮定し、適切な参照が行われるようにします。これは正しいです?そうだとすれば、この全部を動かすために何らかの注釈が欠けていますか? – 0x00F

関連する問題