繁体   English   中英

在Django中准备要反序列化的xml数据

[英]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替换为父节点,还是应该将标签NameDescriptionPrice重命名为namedescriptionprice

我尝试使用以下代码反序列化:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM