使用ElementTreee Django迭代XML响应

时间:2016-03-27 02:12:55

标签: python xml django

我的目标是获取xml响应并将其保存到我的数据库中。我能够使用Elementtree

访问products的第一个元素

xml看起来像这样,

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <item id="0">
        <product_id>  ...
        <product_name> ...
        <product_url> ...
        <advertiser> ...
        <designer> ...
        <image_url> ...
        <price> ...
        <commission> ... 
    </item>

当我尝试迭代它时,我得到了元素,但没有为每个元素打印出的元素中的数据。

def advertisers(request):
    url = 'https://api.example.com/111'
    response = requests.get(url, stream=True)
    response.raw.decode_content = True
    tree = ElementTree.parse(response.raw)
    root = tree.getroot()
    for item in root:
        product_id =  item.find('product_id')
        product_name = item.find('product_name')
        product_url = item.find('product_url')
        advertiser = item.find('advertiser')
        designer = item.find('designer')
        image_url = item.find('image_url')
        price = item.find('price')
        commission = item.find('commission')
    print (product_id, product_name, product_url, advertiser, designer, image_url, price, commission)
    return HttpResponse()

Output
<Element 'product_id' at 0x107bba6d8> <Element 'product_name' at 0x107bba728> <Element 'product_url' at 0x107bba778> <Element 'advertiser' at 0x107bba7c8> <Element 'designer' at 0x107bba818> <Element 'image_url' at 0x107bba868> <Element 'price' at 0x107bba8b8> <Element 'commission' at 0x107bba908>

如果我的模型看起来像这样,有人请告诉我如何构造此循环以将元素保存到数据库。我知道如果我循环遍历它们并附加每一组我可以调用items.save()并且一切都应该很好。我只是想确保我先正确访问。

class Products(models.Model):
    product_id = models.CharField(max_length=100)
    product_name = models.CharField(max_length=100)
    product_url = models.CharField(max_length=100)
    advertiser = models.CharField(max_length=100)
    designer = models.CharField(max_length=100)
    image_url = models.CharField(max_length=100)
    price = models.CharField(max_length=100)
    commission = models.CharField(max_length=100)

    def __str__(self):
        return self.products

1 个答案:

答案 0 :(得分:1)

documentation中所述,iterparse()会返回(event, elem)对(请注意订单)。您的代码的eventelem变量的顺序错误,这就是为什么它始终从“end”end打印event。更正排序,然后您可以从elem.tag检查当前元素名称并从elem.text获取元素的值:

for event, elem in items:
    print(elem.tag, elem.text)