2016-05-03 14 views
1

既存のWSDLを実現する必要があります。 複合型クラスを継承しようとしています。 しかし、派生クラスがxml属性を実装する場合、私はエラーを受け取ります。 派生クラスがXML属性を実装していない場合、エラーは発生しません。spyne - 複合型から継承し、派生クラスがxml属性を実装するときのエラー

何か問題がありますか? (spyneバージョン '2.12.11'、のpython 2.7.9)

エラー:

No handlers could be found for logger "spyne.interface.xml_schema" 
Traceback (most recent call last): 
    File "/home/leto/workspace/spyne_test/inherited_classes.py", line 32, in <module> 
    out_protocol=Soap12()) 
    File "/usr/local/lib/python2.7/dist-packages/spyne/application.py", line 113, in __init__ 
    self.in_protocol.set_app(self) 
    File "/usr/local/lib/python2.7/dist-packages/spyne/protocol/xml.py", line 368, in set_app 
    xml_schema.build_validation_schema() 
    File "/usr/local/lib/python2.7/dist-packages/spyne/interface/xml_schema/_base.py", line 223, in build_validation_schema 
    self.validation_schema = etree.XMLSchema(etree.parse(f)) 
    File "xmlschema.pxi", line 90, in lxml.etree.XMLSchema.__init__ (src/lxml/lxml.etree.c:175129) 
lxml.etree.XMLSchemaParseError: Element '{http://www.w3.org/2001/XMLSchema}complexType': The content is not valid. Expected is (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))., line 10 

コード:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from spyne.model.primitive import Unicode 
from spyne.server.wsgi import WsgiApplication 
from spyne.protocol.soap.soap12 import Soap12 
from spyne.model.complex import XmlAttribute, ComplexModel 
from spyne import Application, rpc, ServiceBase 


ADDRESS = '127.0.0.1' 
PORT = 8070 


class DeviceEntity(ComplexModel): 
    token = XmlAttribute(Unicode, use='required') 


class DigitalInput(DeviceEntity): 
#  IdleState = Unicode 
    IdleState = XmlAttribute(Unicode) 


class Service(ServiceBase): 

    @rpc(_returns=DigitalInput, _body_style='bare') 
    def GetDigitalInput(ctx): 
     return DigitalInput() 

application = Application([Service], 'some_tns', 
           in_protocol=Soap12(validator='lxml'), 
           out_protocol=Soap12()) 

wsgi_application = WsgiApplication(application) 


if __name__ == '__main__': 
    from wsgiref.simple_server import make_server 
    server = make_server(ADDRESS, PORT, wsgi_application) 
    server.serve_forever() 

それは私が実装しようとWSDLの一部です:

<xs:complexType name="DeviceEntity"> 
    <xs:annotation> 
    <xs:documentation> 
     Base class for physical entities like inputs and outputs. 
    </xs:documentation> 
    </xs:annotation> 
    <xs:attribute name="token" type="xs:string" use="required"> 
    <xs:annotation> 
     <xs:documentation>Unique identifier referencing the physical entity.</xs:documentation> 
    </xs:annotation> 
    </xs:attribute> 
</xs:complexType> 

<xs:complexType name="DigitalInput"> 
    <xs:complexContent> 
    <xs:extension base="tt:DeviceEntity"> 
     <xs:sequence> 
      <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> 
      <!-- first ONVIF then Vendor --> 
     </xs:sequence> 
     <xs:attribute name="IdleState" type="xs:string"> 
      <xs:annotation> 
       <xs:documentation>Indicate the Digital IdleState status.</xs:documentation> 
      </xs:annotation> 
     </xs:attribute> 
     <xs:anyAttribute processContents="lax"/> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

答えて

0

私は同じ問題を抱えています。私はそれを見る唯一の人ではないことを嬉しく思います。

/tmp/ディレクトリに移動すると、spyneが検証する.xsdファイルが表示されます。

たとえば、私が/tmp/ dirで生成したものがここにあります。

<xs:schema xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:s0="http://www.opengis.net/ows/1.1" xmlns:s1="spyne.model.primitive.string" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap11enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap11env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap12enc="http://www.w3.org/2003/05/soap-encoding" xmlns:soap12env="http://www.w3.org/2003/05/soap-envelope" xmlns:tns="http://www.opengis.net/sos/2.0" xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://www.opengis.net/sos/2.0" elementFormDefault="qualified"> 
    <xs:import namespace="http://www.opengis.net/ows/1.1" schemaLocation="s0.xsd"/> 
    <xs:complexType name="CapabilitiesType"> 
    <xs:complexContent> 
     <xs:extension base="s0:CapabilitiesBaseType"/> 
    </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="GetCapabilitiesType"> 
    <xs:complexContent> 
     <xs:extension base="s0:GetCapabilitiesType"/> 
    </xs:complexContent> 
    <xs:attribute name="service" type="xs:string"/> <!--HERE--> 
    </xs:complexType> 
    <xs:element name="Capabilities" type="tns:CapabilitiesType"/> 
    <xs:element name="GetCapabilities" type="tns:GetCapabilitiesType"/> 
</xs:schema> 

実際には無効なxsdスキーマファイルであり、アプリケーションの実行時に同じエラーがスローされます。

<!--HERE-->で強調表示されている行に、xs:attributeというタグが間違っていることがわかります。

<xs:complexType name="GetCapabilitiesType"> 
    <xs:complexContent> 
     <xs:extension base="s0:GetCapabilitiesType"> 
     <xs:attribute name="service" type="xs:string"/> <!--HERE--> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

このに関するspyneのgitリポジトリのバグレポートがあります:それはこのように、xs:extension要素の内側に、最大2行すべきですか?

+0

はい、あります。 https://github.com/arskom/spyne/issues/491 –

+0

そして私は次のバージョンでspyneがこの問題を抱えないことを願っています。 –

0

この問題を引き起こすspyneライブラリのコードにバグが見つかりました。私は問題を解決するためにライブラリのいくつかのコード行を変更し、私の場合に役立ちました。私は、同じ問題を抱えている人にとっては役に立ちそうです。 (私は!!! VERSION '2.13.0' spyneライブラリを変更!!!)

ファイルパスspyne /界面/ xml_schema/model.py、complex_add方法、(行番号274以下)、このコード部:

_ext_elements = dict() 
for k,v in deferred: 
    ao = v.attribute_of 
    if ao is None: 
     attribute = etree.Element(XSD('attribute')) 
     xml_attribute_add(v, k, attribute, document) 
     if cls.Attributes._xml_tag_body_as is None: 
      #=============================================================== 
      # MY HACK 
      #=============================================================== 
      # complex_type.append(attribute) # <-- I just commented out this line 
      extension.append(attribute) # <-- and added this line. That's all 

     else: 
      xtba_ext.append(attribute) 
     continue 
関連する問題