我正在使用一个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服务返回的数据填充它们。我没有足够的经验知道这个操作的术语(反思?)。有没有人有解决这个问题的好方法?
答案 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 1
,Turtle 2
等)或只是从Web服务提供的数据?等等
答案 1 :(得分:0)
我最终使用了@Marcin建议的lxml库。 lxml.objectify是我用来完成从XML到对象的转换。