从XML动态构建Python对象?

时间:2014-07-23 18:31:22

标签: python xml python-2.7

我正在使用一个Web服务,它返回一个表示特定数据库实体的XML结构。回报可能如下:

<Turtle>
    <ID>123</ID>
    <Name>John</Name>
    <BirthDate>
        <Date>
            <Year>2000</Year>
            <Month>01</Month>
            <Day>01</Day>
        </Date>
    </BirthDate>
</Turtle>

显然,这是一个简单的对象&#39;可以退货。有几百个这样的物品&#39;可以检索。我想把它们封装成一个python数据&#39;对象类。因为与&#39;对象关联的实体&#39;通过网络服务返回可能会随着时间的推移而变化(并且由于音量),我想找到一种方法来动态地&#34;创建这些对象类,并根据Web服务返回的数据填充它们。我没有足够的经验知道这个操作的术语(反思?)。有没有人有解决这个问题的好方法?

2 个答案:

答案 0 :(得分:1)

可能首先将数据解析为递归数据结构:

xml='''\
<Turtle>
    <ID>123</ID>
    <Name>John</Name>
    <BirthDate>
        <Date>
            <Year>2000</Year>
            <Month>01</Month>
            <Day>01</Day>
        </Date>
    </BirthDate>
</Turtle>'''

import xml.etree.ElementTree as ET

def xml_to_dict(el):
    data={}
    data[el.tag] = el.text if el.text else {}
    children = el.getchildren()
    if children:
        data[el.tag] = map(xml_to_dict, children)
    return data

data=xml_to_dict(ET.fromstring(xml))
print data

结果:

{'Turtle': [{'ID': '123'}, {'Name': 'John'}, {'BirthDate': [{'Date': [{'Year': '2000'}, {'Month': '01'}, {'Day': '01'}]}]}]}

现在看看将它封装到一个满足你目的的对象中。 xml结构的所有子项都是独一无二的吗?如果是这样 - 一个dicts的词典与一个dicts列表的dict(就像这样)。是否有多个数据记录(Turtle 1Turtle 2等)或只是从Web服务提供的数据?等等

答案 1 :(得分:0)

我最终使用了@Marcin建议的lxml库。 lxml.objectify是我用来完成从XML到对象的转换。