如何迭代地将 lxml.objectify.ObjectifiedElement 从 authorize.net 转换为 python dict

How to iteratively transform a lxml.objectify.ObjectifiedElement from authorize.net into a python dict

我正在尝试对来自 authorize.net 的数据执行交易报告。

我确定返回的对象是 lxml.objectify.ObjectifiedElement 并且很难按原样使用。

我希望将此对象转换为更实用的 dict 对象,但在这样做时遇到了麻烦。

我确定 authorize.net 交易如下所示:

<getTransactionDetailsRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">
<messages>
    <resultCode>...</resultCode>
    <message>
        <code>...</code>
        <text>...</text>
    </message>
</messages>
<transaction>
    <transId>...</transId>
    <submitTimeUTC>...</submitTimeUTC>
    <submitTimeLocal>...</submitTimeLocal>
    <transactionType>...</transactionType>
    <transactionStatus>...</transactionStatus>
    <responseCode>...</responseCode>
    <responseReasonCode>...</responseReasonCode>
    <responseReasonDescription>...</responseReasonDescription>
    <AVSResponse>...</AVSResponse>
    <cardCodeResponse>...</cardCodeResponse>
    <batch>
        <batchId>...</batchId>
        <settlementTimeUTC>...</settlementTimeUTC>
        <settlementTimeLocal>...</settlementTimeLocal>
        <settlementState>...</settlementState>
    </batch>
    <order>
        <description>...</description>
    </order>
    <authAmount>...</authAmount>
    <settleAmount>...</settleAmount>
    <lineItems>
        <lineItem>
            <itemId>...</itemId>
            <name>...</name>
            <description>...</description>
            <quantity>...</quantity>
            <unitPrice>...</unitPrice>
            <taxable>...</taxable>
        </lineItem>
    </lineItems>
    <taxExempt>...</taxExempt>
    <payment>
        <creditCard>
            <cardNumber>...</cardNumber>
            <expirationDate>...</expirationDate>
            <cardType>...</cardType>
        </creditCard>
    </payment>
    <customer>
        <email>...</email>
    </customer>
    <billTo>
        <firstName>...</firstName>
        <lastName>...</lastName>
        <phoneNumber>...</phoneNumber>
    </billTo>
    <recurringBilling>...</recurringBilling>
    <product>...</product>
    <marketType>...</marketType>
</transaction>

我发现 this documentation and this tutorial 作为 lxml 对象的帮助。

我想生成一个看起来像

的字典
{getTransactionDetailsRequest : 
    {messages : 
        {code : ...},
        {text : ...}
    },
    {transaction : 
        {transId : ...},
        ...
    }
}

我想出了办法:

import re 
def to_dict(element):
    ret = {}
    if element.getchildren() == []:
        return element.text
    else:
        for elem in element.getchildren():
            subdict = to_dict(elem)
            ret[re.sub('{.*}', '', elem.tag)] = subdict
    return ret

而这个 returns 预期的字典。

希望这对以后的其他人有所帮助。