spyne генерирует неверную схему

Я пытаюсь использовать spyne из основной ветки, поскольку выпущенные версии несовместимы с python3, и у меня есть модели, определенные следующим образом:

class currency(ComplexModel):                                                   
    data = XmlData(Decimal)                                                     


class mntCurrency(currency):                                                    
    code = XmlAttribute(String)                                                 


class CreditLmt(ComplexModel):                                                  
    curr = mntCurrency

Я подключил эти модели к простой службе HelloWorld, которая возвращает CreditLmt в ответ. Но когда я пытаюсь запустить свой мыльный сервер, spyne жалуется на следующее:

lxml.etree.XMLSchemaParseError: Элемент '{http://www.w3.org/2001/XMLSchema}extension': содержимое недействительно. Ожидается (аннотация?, ((группа | все | выбор | последовательность)?, ((атрибут | группа атрибутов)*, любой атрибут?)))., строка 16

Это правильно, потому что spyne генерирует следующий xsd:

 <xs:complexType name="mntCurrency">                                           
    <xs:complexContent>                                                         
      <xs:extension base="tns:currency">                                        
        <xs:simpleContent>                                                      
          <xs:extension base="xs:decimal">                                      
            <xs:attribute name="code" type="xs:string"/>                        
          </xs:extension>                                                       
        </xs:simpleContent>                                                     
        <xs:sequence>                                                           
          <xs:element name="test" type="xs:token" minOccurs="0" nillable="true"/>
        </xs:sequence>                                                          
      </xs:extension>                                                           
    </xs:complexContent>                                                        
  </xs:complexType>

Я использую XmlData, потому что хочу получить такой ответ:

<tns:currency code="826">10.0</tns:currency>

Итак, как мне определить мои модели?


person Divick    schedule 18.08.2019    source источник


Ответы (1)


Пример создания этого элемента:

<tns:currency code="826">10.0</tns:currency>

... составляет:

from spyne import *
from spyne.util.xml import get_object_as_xml

from lxml import etree


class Currency(ComplexModel):
    value = XmlData(Decimal)
    code = XmlAttribute(Integer32(values=[826, 234, 555]))


class SomeObject(ComplexModel):
    handle = Unicode
    currency = Currency


obj = SomeObject(handle="aaaa", currency=Currency(value=D('123.45'), code=555))
elt = get_object_as_xml(obj)
print(etree.tostring(elt, pretty_print=True))

Что касается ошибки, она исходит непосредственно от libxml. По сути, это говорит о том, что стандарт Xml Schema не допускает одиночных записей XmlData в подклассе ComplexModel. Если вы считаете, что это ошибка, вы должны пожаловаться в рабочую группу Xml Schema.

person Burak Arslan    schedule 19.08.2019