[英]Preparing xml data for deserialization in Django
我有几个看起来像这样的领域的模型:
class XMLData(models.Model):
name = models.CharField()
description = models.CharField()
price = models.CharField()
和以字符串包装的xml数据,xml数据如下所示:
<Root>
<Header>
<information>info</information>
</Header>
<Main>
<Product>
<Name>name1</Name>
<Description>description1</Description>
<Price>1</Price>
</Product>
<Product>
<Name>name2</Name>
<Description>description2</Description>
<Price>2</Price>
</Product>
</Main>
</Root>
我的问题是:我应该将子节点Product
替换为父节点,还是应该将标签Name
, Description
, Price
重命名为name
, description
, price
?
我尝试使用以下代码反序列化:
for product in serializers.deserialize("xml", xmldata):
savedata = XMLData(product)
savedata.save()
所以我希望这会引起一些错误,并且我会理解下一步该怎么做,但是没有错误,并且xml数据没有保存到数据库中。
希望您理解我的问题,并感谢您的答复。
看来您只对存储产品信息感兴趣。 在这种情况下, Product
将是比XMLData
更好的模型名称。
Django序列化程序将无济于事,因为您的数据格式不正确。 但是,您可以使用lxml反序列化。 代码摘自: 使用ElementTree将xml转换为字典
from xml.etree import cElementTree as ET
from collections import defaultdict
def etree_to_dict(t):
d = {t.tag: {} if t.attrib else None}
children = list(t)
if children:
dd = defaultdict(list)
for dc in map(etree_to_dict, children):
for k, v in dc.iteritems():
dd[k].append(v)
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
if t.attrib:
d[t.tag].update(('@' + k, v) for k, v in t.attrib.iteritems())
if t.text:
text = t.text.strip()
if children or t.attrib:
if text:
d[t.tag]['#text'] = text
else:
d[t.tag] = text
return d
e = ET.XML('''
<Root>
<Header>
<information>info</information>
</Header>
<Main>
<Product>
<Name>name1</Name>
<Description>description1</Description>
<Price>1</Price>
</Product>
<Product>
<Name>name2</Name>
<Description>description2</Description>
<Price>2</Price>
</Product>
</Main>
</Root>
''')
from pprint import pprint
d = etree_to_dict(e)
pprint(d)
现在,我们可以直接存储产品,而不必进行漂亮的打印:
d = etree_to_dict(e)
products = d['Root']['Main']['Product']
for p in products:
product = Product()
p.name = p['Name']
p.description = p['Description']
p.price = p['Price']
p.save()
那应该将产品存储到数据库中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.