在xml python 2.7中插入值的更好方法

时间:2013-09-25 02:11:20

标签: python xml soap

我一直在寻找一个更好的解决方案,我正在做的事情。我需要构造一个xml来发送给SOAP服务,但我需要以dinamically方式生成XML。问题或者可能不是问题,我发现这个问题真的很长,而且我认为必须有更好的方法来实现这个目标。我正在使用python 2.7.5,这是我的XML(有点,它实际上更大):

SINGLE_PAYMENT = '''...
<v1:Shipping>
            <v1:Type>%s</v1:Type>
            <v1:Address1>%s</v1:Address1>
            <v1:Address2>%s</v1:Address2>
            <v1:City>%s</v1:City> 
            <v1:Country>%s</v1:Country>
            <v1:Items>%s</v1:Items>
            <v1:State>%s</v1:State>
            <v1:Carrier>%s</v1:Carrier>
            <v1:Weight>%s</v1:Weight>
            <v1:Total>%s</v1:Total>
 </v1:Shipping>
 ....'''

然后我做

SoapMessage = SINGLE_PAYMENT%...and replace here with variables passed to this function

有没有更好的方法呢?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用正确的XML library,或者您可以编写一个使用模板生成单个“送货”元素的方法,例如:

def generate_tag(name, values, version='1'):
    return '\n'.join([
        '<v{0}:{1}>'.format(version, name),
        '\n'.join(
            '\t<v{2}:{0}>{1}</v{2}:{0}>'.format(k, v, version) for k, v in values.iteritems()
        ),
        '</v{0}:{1}>'.format(version, name)
    ])

# Output:
>>> print generate_tag('Shipping', {"Total": "100", "Type": "A"})
<v1:Shipping>
    <v1:Total>100</v1:Total>
    <v1:Type>A</v1:Type>
</v1:Shipping>

但是,正如你所看到的,这很快就会变得混乱。

使用这些库(例如ElementTreeMiniDom)对您有利,因为它们会处理任何需要的转义并在您需要进行更改时提供更好的界面后面。