2011-04-08 4 views
0

인터넷상의 다른 서버에 RESTful 서비스가있다. 몇 가지 특성을 가진 단일 XML 항목을 반환하는 요청을 보내고 있습니다.JSON - for 루프 문제로 XML 서비스 사용하기

로컬로 저장된 XML을 사용하는 또 다른 python 함수가 있는데 매개 변수를 제공하면 모든 요소를 ​​반복하고 해당 매개 변수와 일치하는 XML 항목 즉 mysite/search 만 반환합니다./123. 내가 할 수있는 미세 사용하여 해당 출력 : 다음 for 루프에서 row를 사용하는 방법과

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.getAttribute()를 사용하여 속성에 액세스 할 수 있습니다. XML 항목이 1 개만있는 경우 루프가 필요하지 않으므로 반복하지 않으므로 row 객체는 getAttribute() 메서드를 사용합니다.

이 데이터를 검색하고 싶습니다. 아무도 도와 줄 수 있니?

추신 :이 단일 XML 데이터에서 루프를 실행하면 오류 메시지가 표시됩니다. TypeError: Iteration over a non-sequence.

답변

1

당신은 응답으로 장고에 발전기를 전달해야

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 그것이 도움이되기를 바랍니다.

+0

와우, 정말 고마워! 이제 완벽하게 작동합니다! 사실, 나는 또 다른 질문이 있는데, 나는 다른 스레드를 열어서는 안된다고 생각하지만 어쩌면 누군가가 도울 수있다. 내 urls.py에는 숫자 (예 : mysite/names/12)를 사용하는'(r '^ names/(\ d {1,2}) $', 'foo.views.index' 그 XML을,하지만 내가 대신 정수 대신 문자열을 취할 수있는 정규 표현식 어떻게합니까? eg mysite/names/john? thanks – eoinzy

+0

패키지의 문서에있는 regexp 매뉴얼을 참조하십시오. 위의 해결책은'(r '^ names/(\ w +) $', 'foo.views.index')'; 또한 int 로의 변환을 제거하는 것을 잊지 마십시오. – fviktor