1

我需要实现现有的 WSDL。我尝试继承我的复杂类型类。但是如果派生类实现了一个 xml 属性,我会得到一个错误。如果派生类没有实现 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>
4

3 回答 3

1

此错误的修复现已合并到 2.13 主线。

见:https ://github.com/arskom/spyne/pull/493

于 2016-06-21T15:19:46.693 回答
0

我在 spyne 库的代码中发现了导致此问题的错误位置。我更改了库中的几行代码来解决问题,这对我来说很有帮助。我希望它对任何有同样问题的人都有用。(我改变了 spyne 库!!! VERSION '2.13.0' !!!)

文件路径 spyne/interface/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
于 2016-06-14T07:19:13.977 回答
0

我有同样的问题。我很高兴我不是唯一一个看到它的人。

如果您进入您的/tmp/目录,您将看到 spyne 验证的 .xsd 文件。

例如,这是它在我的/tmp/目录中生成的一个。

<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:extension元素内部排成两行,如下所示:

<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 存储库中是否有关于此的错误报告?

于 2016-06-13T07:10:09.757 回答