2016-03-27 45 views
0

我的目標是採用xml響應並將其保存到我的數據庫中。我能夠與Elementtree這是products使用ElementTreee迭代XML響應Django

的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 
+0

正如我在答覆中提到,可以通過''一樣product_id.text text'屬性獲取元素的值','product_name.text'等等。這就是你現在要求的(編輯之後)? – har07

回答

1

documentationiterparse()返回提到(event, elem)雙(注意順序)。您的代碼有錯誤順序的eventelem變量,這就是爲什麼它始終從「結束」event打印end。正確的順序,那麼你可以從elem.tag檢查當前元素的名稱,並從elem.text獲得元素的值:

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

是的,謝謝你原來的帖子幫了我很多。我去回答它,它就消失了。哈哈我很抱歉我編輯它。 – wuno