【问题标题】:spyne generating invalid schemaspyne 生成无效架构
【发布时间】:2019-08-18 17:20:25
【问题描述】:

我正在尝试使用 master 分支中的 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':内容不是 有效的。预期是(注释?,((组|全部|选择|序列)?, ((attribute | attributeGroup)*, anyAttribute?))).,第 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>

那么我该如何定义我的模型呢?

【问题讨论】:

    标签: lxml spyne


    【解决方案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 标准不允许在 ComplexModel 子类中单独存在 XmlData 条目。如果您认为这是一个错误,您必须向 Xml Schema 工作组投诉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      相关资源
      最近更新 更多