消耗XML RESTful服务,输出为JSON - for循环问题

0 投票
1 回答
540 浏览
提问于 2025-04-16 15:21

我在互联网上的另一台服务器上有一个RESTful服务。我向它发送请求,返回一个包含几个属性的XML项。

我还有一个Python函数,它处理本地存储的XML。当我给它提供一个参数时,它会遍历所有元素,只返回与该参数匹配的XML项,比如说我的网址是mysite/search/123。我可以通过以下方式输出这个结果:

from xml.dom.minidom import parseString
import json
import urllib2
from django.http import HttpResponse
    def index(request, number="1"):
        #file = urllib2.urlopen('myfile.xml')
        file = open('myfile.xml','r')
        data = file.read()
        dom = parseString(data)
        rows = dom.getElementsByTagName("root")[0].getElementsByTagName("subroot")[0].getElementsByTagName("theData")
        for row in rows:
            return  HttpResponse(json.dumps({'name':row.getAttribute("name"),'address': row.getAttribute("address"), 'phone': row.getAttribute("phone")}, sort_keys=True, indent=4))

注意我在循环中使用了row,然后通过row.getAttribute()来访问属性。如果我只有一个XML项,就不需要循环,所以也就没有row对象可以用来调用getAttribute()方法。

我只是想获取这一条数据。有人能帮我吗?

另外,如果我尝试在这个单一的XML数据上进行循环,我会收到一个错误,提示:TypeError: Iteration over a non-sequence

1 个回答

1

你需要把一个生成器作为响应传递给Django:

response_generator = (
    json.dumps(
        {
            'name': row.getAttribute("name"),
            'address': row.getAttribute("address"),
            'phone': row.getAttribute("phone")},
        sort_keys=True,
        indent=4)
    for row in rows)

return HttpResponse(response_generator)

另外可以参考:http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

希望这对你有帮助。

撰写回答