Django如何序列化和验证外部xml数据



我在验证外部xml时遇到了"问题"。我想要的是从外部rss站点获取数据,验证是否存在所有字段,然后将其保存到数据库中。

我遇到的问题是,我不确定如何将xml数据发送到我的验证器。我尝试了不同的方法,但都不起作用。

https://api.foxsports.com/v1/rss?partnerKey=zBaFxRyGKCfxBagJG9b8pqLyndmvo7UU&tag=nba

这是我试图解析的rss的一个例子。

这是我的代码:

import json
import requests
import xml.etree.ElementTree as ET
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, generics
class Test(APIView):
def get(self, request, format=None):

response = requests.get(
channel.url
)
print(response.status_code)
if response.status_code == 200:
xml = response.text.encode("utf-8")
tree = ET.fromstring(xml)
for child in tree.iter("item"):

serializer = RssSerializer(data=child)
if serializer.is_valid():
serializer.save(parsed_xml)

这里的问题是,无论我做什么,我的序列化程序总是无效的。当我写了一个小的助手函数,手动从请求中提取字段时,我就解决了这个问题。

它看起来像这样:

def parse_xml(self, node):
parsed_json = {
"title": node.find("title").text,
"description": node.find("description").text,
"link": node.find("link").text,
"pub_date": node.find("pubDate").text,
"guid": node.find("guid").text,
}
return parsed_json

基本上,我只是添加了以下行parsed_xml=self.parse_xml(child)我正在将parsed_xml发送到我的序列化程序。这很好,但对我来说似乎是一种黑客的方式,但我无法以任何其他方式处理数据。

class RssSerializer(serializers.Serializer):
title = serializers.CharField(min_length=2)
link = serializers.CharField(min_length=2)
description = serializers.CharField(min_length=2)
pub_date = serializers.CharField(min_length=2)
guid = serializers.CharField(min_length=2)

def save(self, data):
new_feed = RssFeed()
new_feed.title = data["title"]
new_feed.description = data["description"]
new_feed.pub_date = data["pub_date"]
new_feed.link = data["link"]
new_feed.guid = data["guid"]
new_feed.save()

我想知道的是,有什么方法可以从外部源获取xml并直接将其传递给我的验证器?提前感谢的帮助

序列化程序不希望xml节点作为数据,所以简单的答案是否定的,不幸的是,没有直接的方法将其传递给验证器。但是,您可以重用现有的方法之一,将整个xml更改为dictionary,然后将项馈送到序列化程序,或者将单个节点更改为diction。

为了获得灵感,我会研究可用的解决方案(无需重新发明轮子):

  • 这个问题已经被触及了如何在Python中将xml字符串转换为字典?

  • 我曾经使用过这个DRF XML解析器来解析XML请求,它完成了这项工作:https://github.com/jpadilla/django-rest-framework-xml/blob/master/rest_framework_xml/parsers.py#L40

  • 如果您不介意增加库,xmltodict也为我解决了类似的问题https://docs.python-guide.org/scenarios/xml/

例如,您的代码可能如下所示:

xml = response.text.encode("utf-8")
xml_dict = xmltodict.parse(xml)
for item in xml_dict["rss"]["channel"]["item"]:
serializer = RssSerializer(data=item)

最新更新