如何迭代地将 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 预期的字典。
希望这对以后的其他人有所帮助。
我正在尝试对来自 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 预期的字典。
希望这对以后的其他人有所帮助。