如何将所有属性添加到Spyne Array中的XMLElements

时间:2015-01-16 01:44:10

标签: arrays xml soap spyne

我正在使用spyne Array来转换JSON列表,我需要添加" id"属于"推荐"最终XML中的父节点。

这是我期待的最终XML:

<viewOutboundResponse user="rayners">
    <referral id="123">
        <status>SUBMITTED</status>
        <from>
            <outlet id="12345">ABC</outlet>
        </from>
        <to>
            <outlet id="6789">XYZ</outlet>
        </to>
        <date>2015-01-14</date>
        <client>Bloggs</client>
        <daysToExpiry>3</daysToExpiry>
    </referral>
    <referral id="456">
        <status>REJECTED</status>
        <from>
            <outlet id="101112">DEF</outlet>
        </from>
        <to>
            <outlet id="131415">S2X Demo</outlet>
        </to>
        <date>2004-01-15</date>
        <client>Gobbs</client>
        <daysToExpiry>7</daysToExpiry>
    </referral>
</viewOutboundResponse>

这是我的代码:

class ReferralSummaryType(ComplexModel):
    __type_name__ = 'referral'
    type_info = {'id': XmlAttribute(Integer),
                 'status': Unicode,
                 'from': ReferralFromType,
                 'to': ReferralToType,
                 'date': Date,
                 'client': Unicode,
                 'daysToExpiry': Integer}


class OutboundResponseType(ComplexModel):
    __mixin__ = True
    referral = Array(ReferralSummaryType)

但我得到的输出是:

<viewOutboundResponse user="rayners">
    <referral>
        <referral id="123">
            <status>SUBMITTED</status>
            <from>
                <outlet id="12345">ABC</outlet>
            </from>
            <to>
                <outlet id="6789">XYZ</outlet>
            </to>
            <date>2015-01-14</date>
            <client>Bloggs</client>
            <daysToExpiry>3</daysToExpiry>
        </referral>
        <referral id="456">
            <status>REJECTED</status>
            <from>
                <outlet id="101112">DEF</outlet>
            </from>
            <to>
                <outlet id="131415">S2X Demo</outlet>
            </to>
            <date>2004-01-15</date>
            <client>Gobbs</client>
            <daysToExpiry>7</daysToExpiry>
        </referral>
    </referral>
</viewOutboundResponse>

2 个答案:

答案 0 :(得分:0)

所以你的问题是

  

我需要添加&#34; id&#34;属于&#34;推荐&#34;中的父节点   最终的XML。

您想要的输出有一系列没有包装引用节点的引用节点,您看到的结果是一系列嵌入式引用节点(每个节点都有id属性)但在包装节点上没有ID。

那里有一点冲突。如果你需要在包装引用节点中有一个ID,那么我认为你可能需要更改你的响应并为包装器类型添加一个类:

class ReferralWrapperType(ComplexModel):
    __type_name__ = 'referral'
    id = XMLAttribute(Integer)
    referral = Array(ReferralSummaryType)


class OutboundResponseType(ComplexModel):
    __mixin__ = True
     referral = ReferralWrapperType

然而,如果您需要的是您所说的最终XML所显示的内容,那么您可以从Spyne array documentation开始相信我可能会尝试:

class OutboundResponseType(ComplexModel):
    __mixin__ = True
     referral = ReferralSummaryType.customize(max_occurs="unbounded")

警告 - 我对Spyne非常非常新。 编辑使用max_occurs =&#34;无界&#34;而不是max_occurs = float(&#39; inf&#39;)每this spyne bug

答案 1 :(得分:0)

根据Spyne文档(http://spyne.io/docs/2.10/manual/03_types.html#arrays),使用

referral = ReferralSummaryType.customize(max_occurs="unbounded")

解决了我的问题。

谢谢!