首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spyne生成无效模式

spyne生成无效模式
EN

Stack Overflow用户
提问于 2019-08-18 17:20:25
回答 1查看 155关注 0票数 0

我正在尝试使用主分支的spyne,因为发布的版本与python3不兼容,而且我的模型定义如下:

代码语言:javascript
复制
class currency(ComplexModel):                                                   
    data = XmlData(Decimal)                                                     


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


class CreditLmt(ComplexModel):                                                  
    curr = mntCurrency

我已经将这些模型插入到一个简单的HelloWorld服务中,该服务返回响应的CreditLmt。但是,当我试图运行我的soap服务器时,spyne会抱怨如下:

lxml.etree.XMLSchemaParseError:元素‘{http://www.w3.org/2001/XMLSchema}扩展’:内容无效。期望值is (注释?,(组\x{e76f}\选择))?,((属性为attributeGroup)*,anyAttribute?)),第16行

这是正确的,因为spyne生成以下xsd:

代码语言:javascript
复制
 <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,是因为我希望得到这样的响应:

代码语言:javascript
复制
<tns:currency code="826">10.0</tns:currency>

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

EN

回答 1

Stack Overflow用户

发布于 2019-08-19 10:22:33

生成此元素的示例:

代码语言:javascript
复制
<tns:currency code="826">10.0</tns:currency>

..。如下:

代码语言:javascript
复制
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标准不允许在XmlData子类中单独使用ComplexModel条目。如果认为这是一个错误,则必须向Xml工作组投诉。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57546792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档